概念与目的
数据分片(Shard/Partition)的目的是方便横向扩展。数据分片后,需要靠路由(Routing)来找到记录的位置。
模型
数据分片是一个二级映射关系。第一级是key -> partition,从数据记录映射到数据分片,这是一个多对一关系。第二级是partition -> machine,从数据分片映射到物理机器,这也是一个多对一的关系。常见的映射关系有hash分片和范围分片。
注意只有把这两个映射关系解耦才能增强系统的灵活性。另外hash分片只能支持点查询,不能支持范围查询。
hash分片
Round Robin
即hash取模法。当增加机器时,所有的数据必须重新分配。原因是两级映射耦合了,数据直接和物理机数量关联,少了数据块的中间层。机器数作为参数出现在映射函数中。
虚拟桶
在数据记录和物理机器之间引入了虚拟桶层。加入新机器,只用调整部分虚拟桶到物理机器的映射关系。
一致性哈希
在P2P网络中常见。将hash数值空间按大小组成一个首尾相接的环,每台机器根据其ip映射到环上的一个节点。每个节点记录其前驱和后继节点。 比较值得注意的是当一个节点收到一个特定的key的请求时,并不是逐跳向下查找,而是通过每个节点维护的一个距离和该距离内的最大节点的表来选测下一跳的节点。距离采用2的幂指数划分,这样可以达到类似二分查找的效果。 这种方法会造成负载不均衡,而且忽略每台物理机器的差异。通过引入虚拟节点概念,将一台物理机虚拟成若干节点。
范围分片
对所有记录的key进行排序,在排好序的key空间中将记录划分为数据片。映射关系由一个分片map维护,保存每个数据分片最小的key和对应的物理机。数据分片在物理机的管理方式往往采用LSM树。