分片主要是用于数据库的水平扩展
什么是分片
分区: 将一个表的行分成多个不同的表,称为分区。每个分区中保存的数据都是唯一的,并且独立于其他分区中保存的数据。
水平分区是将不同范围的行进行分离,垂直分区主要是将列分离(通过索引/主键)
分片将一个数据分成多个小块,称为逻辑分片
。然后将逻辑分片分布在不同的数据库节点上,称为物理分片
,可以容纳多个逻辑分片。
所有分片中保存的数据代表了整个数据集。
数据库分片体现了无共享架构(shard-nothing),这意味着分片是自治的(不共享任何相同的数据或计算资源)。某些数据(类似汇率,转换率等)通过在不同的分片保留来
共享数据(数据冗余)。
一般来说分片是代码去实现的,所以程序中可以定义将数据传输到那个分片或者读取哪个分片。可以通过程序来控制分片的迁移和销毁。
分片的好处
分片有利于实现水平扩展,水平扩展是向现有的堆栈去添加更多的机器以分散负载并允许更多的流量和对访问更快的处理速度。垂直扩展主要指的是升级现有的服务器的硬件,通常是添加更多的RAM和CPU。
在单台机器上运行关系数据库并通过升级其计算资源对其进行扩展是相对简单的。分片是可以提供可靠性的,分片只会一个范围内的数据,对于整体的数据的影响较单体数据库小。其次分片(shard)下可以有副本(replica)提供冗余的保障,在这种情况下数据的可靠性得到了提升。
总体如下:
- 高可用
- 更快的查询响应时间
- 更多的写入带宽(并行写入)
- 横向扩展
分片的坏处
架构复杂,分片过程可能会导致数据的丢失或者表损失。必须跨分片位置管理数据,提升了程序的复杂性,对于性能的要求也在提高。数据库分片有时会遇到分片不平衡的情况,需要修复和重新分片以实现更均匀的数据分布。
另一个主要的缺点在于,一旦数据库被分片,就很难将其恢复到未分片的架构。
总体如下:
- 增加系统复杂性
- 重新平衡数据,为了避免热点问题,需要重新分片以实现更均匀的数据分布。
- 连接来自多个分片的数据,在复杂的查询场景下,会出现跨多个分区查询数据。
- 无原生支持,并不是每个数据库都支持分片。
分片的方式
键分片/哈希分片(Key Based Sharding/Hash Based Sharding)
为了确保记录以一致的方式放置在正确的分片中,输入到哈希函数中的值应该来自同一列(shard key)。
分片的键类似于主键,用于为各个行建立唯一的标识符的列。好处就是数据均匀分布,不用做平衡(rebalance)。
范围分片(Range Based Sharding)
很容易理解这种方式就是将类似主键的列更具一个范围分成几个分区。好处在于容易实现,每个分区都保存一组不同的数据,但是结构(schema)是相同的。程序根据值的范围在不同的分区中查找。这里的一个问题在于分区的数据有可能是不均匀的,就需要做平衡(rebalance)。
目录分片 (Directory Based Sharding)
通过创建一个查找表,使用分片键来跟踪分片保存的数据信息。坏处在于查找表可能成为单点故障。