Mysql学习笔记—MySQL集群架构之分片
1. 分片概念:实现分库分表的规则
-
分片(Sharding)
就是用来确定数据在多台存储设备上分布的技术。Shard这个词的意思是“碎片”,如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseSharding)。将一个数据库打碎成多个的过程就叫做分片,分片是属于横向扩展方案。 -
分片
:表示分配过程,是一个逻辑上概念,表示如何实现最终结果的思想 -
分库分表
:表示分配结果,是一个物理上概念,表示最终实现的结果 数据库扩展方案
:
-
横向扩展
:一个库变多个库,加机器数量 -
纵向扩展
:一个库还是一个库,优化机器性能,加高配CPU或内存
- 在分布式存储系统中,数据需要分散存储在多台设备上,分片就是把数据库横向扩展到多个数据库服务器上的一种有效的方式,其主要目的就是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
2. 分片策略
- 数据分片是根据指定的分片键和分片策略将数据水平拆分,拆分成多个数据片后分散到多个数据存储节点中。
- 分片键是用于划分和定位表的字段,一般使用ID或者时间字段。
- 分片策略是指分片的规则,常用规则有以下几种:
基于范围分片
:根据特定字段的范围进行拆分,比如用户ID、订单时间、产品价格等。- 例子: {[1 - 100] => Cluster A, [101 - 199] => Cluster B},将1到100放到A中,将101到199放到B中
-
优点
:新的数据可以落在新的存储节点上,如果集群扩容,数据无需迁移。 -
缺点
:数据热点分布不均,数据冷热不均匀,导致节点负荷不均。
哈希取模分片
- 整型的Key可直接对设备数量取模,其他类型的字段可以先计算Key的哈希值,然后再对设备数量取模。假设有n台设备,编号为0 ~ n-1,通过Hash(Key) % n就可以确定数据所在的设备编号。该模式也称为
离散分片
。 -
优点
:实现简单,数据分配比较均匀,不容易出现冷热不均,负荷不均的情况。 -
缺点
:扩容时会产生大量的数据迁移,比如从n台设备扩容到n+1,绝大部分数据需要重新分配和迁移。
- 一致性哈希分片
采用Hash取模
的方式进行拆分,后期集群扩容需要迁移旧的数据。使用一致性Hash算法能够很大程度的避免这个问题,所以很多中间件的集群分片都会采用一致性Hash算法。一致性Hash
是将数据按照特征值映射到一个首尾相接的Hash环上,同时也将节点(按照IP地址或者机器名Hash)映射到这个环上。对于数据,从数据在环上的位置开始,顺时针找到的第一个节点即为数据的存储节点。Hash环示意图与数据的分布如下:- 一致性Hash在增加或者删除节点的时候,受到影响的数据是比较有限的,只会影响到Hash环相邻的节
点,不会发生大规模的数据迁移。