Sharding

事关数据库扩展性 说起数据库扩展性,这是个非常大的话题。目前的商业数据都有自己的扩展性解决方案,在过去相对来说比较成熟,但是随着互联网的高速发展,不可避免的会带来一些计算模式上的演变,这样很多主流商业系统也难免暴露出一些不足之处。比如 Oracle 的 RAC 是采用共享存储机制,对于I/O 密集型的应用,瓶颈很容易落在存储上,这样的机制决定后续扩容只能是 Scale Up(向上扩展) 类型,对于硬件成本、开发人员的要求、维护成本都相对比较高。


用途

Sharding 基本上是针对开源数据库的扩展性解决方案,很少有听说商业数据库进行 Sharding 的。目前业界的趋势基本上是拥抱Scale Out,逐渐从 Scale Up 中解放出来。
Sharding 的应用场景

概述

任何技术都是在合适的场合下能发挥应有的作用。 Sharding 也一样。联机游戏、IM、BSP 都是比较适合 Sharding 的应用场景。其共性是抽象出来的 数据对象之间的关联数据很小。比如IM ,每个用户如果抽象成一个 数据对象,完全可以 独立存储在任何一个地方,数据对象是 Share Nothing 的;再比如 Blog 服务提供商的站点内容,基本为用户生成内容(UGC),完全可以把不同的用户隔离到不同的存储集合,而对用户来说是透明的。
简介
这个"Share Nothing" 是从数据库集群中借用的概念,举例来说,有些类型的数据粒度之间就不是 "Share Nothing" 的,比如类似交易记录的历史表信息,如果一条记录中既包含卖家信息与买家信息,如果随着时间推移,买、卖家会分别与其它用户继续进行交易,这样不可避免的两个买卖家的信息会分布到不同的 Sharding DB 上,而这时如果针对买卖家查询,就会跨越更多的 Sharding ,开销就会比较大。
Sharding 并不是数据库扩展方案的银弹,也有其不适合的场景,比如处理 事务型的应用就会非常复杂。对于跨不同DB的 事务,很难保证完整性,得不偿失。所以,采用什么样的 Sharding 形式,不是生搬硬套的。
Sharding与数据库分区(Partition)的区别
有的时候,Sharding 也被近似等同于水平分区(Horizontal Partitioning),网上很多地方也用水平分区来指代 Sharding,但我个人认为二者之间实际上还是有区别的。的确,Sharding 的思想是从分区的思想而来,但数据库分区基本上是 数据对象级别的处理,比如表和索引的分区,每个子数据集上能够有不同的物理存储属性,还是单个数据库范围内的操作,而 Sharding 是能够跨数据库,甚至跨越物理机器的。

### 数据库系统的分片概念与实现 #### 分片的概念 分片(Sharding)是指将大型数据库分割成更小、更快、更容易管理的部分,这些部分称为片段或分片。每个分片存储表的一部分数据,并且通常分布在不同的物理服务器上。这种技术有助于提高读写性能并增强横向扩展能力。 #### 实现方式 一种常见的做法是在多个节点间分配键值对[^4]。对于希望迁移到Redis集群的用户来说,可能已经存在预设好的分区方案,即通过某种内部算法或是客户端库/代理所定义的方法来决定哪些键应该放置在哪一个节点之上。当涉及到关系型数据库时,则会采用基于哈希函数计算得到的结果作为路由依据;或者是按照特定字段范围来进行划分——比如按日期区间或者地理位置等属性进行切分。 另外,在某些情况下还可以利用一致性哈希环来简化跨多台机器的数据分布逻辑设计。这种方式能够有效减少因新增加或移除服务实例而导致的大规模重新映射操作所带来的影响。 #### 高可用性的考虑 为了确保高可用性和容错机制的有效运作,主从复制配合自动故障转移策略被广泛应用到了各个层次之中。例如MySQL兼容环境下的数据库节点就采用了活动-活动(Active-Active)切换模式提供持续在线的服务支持[^2]。这意味着即使某个副本出现问题也不会造成整个系统不可用的情况发生,因为其他健康的成员仍然可以继续承担请求处理工作直至问题解决为止。 ```sql -- 创建分片表结构的一个简单例子 (假设使用 MySQL) CREATE TABLE orders ( id INT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, order_date DATE NOT NULL, PRIMARY KEY(id), INDEX idx_user_order(user_id,order_date) ); -- 基于 user_id 进行水平拆分 PARTITION BY HASH(MOD(user_id, 8)); ``` 上述SQL语句展示了如何创建一张带有分区分割特性的订单表格。这里选择了`user_id`列并通过取模运算将其均匀散布到八个独立的空间内保存起来。实际应用当中可以根据业务需求调整具体的散列函数形式以及目标数量大小等因素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值