基本概念
哈希方式
按数据范围分布
按数据量分布
一致性哈希
副本与数据发布
本地化计算
数据分布方式的选择
分布式系统: 利用多台计算机协调解决单台计算机所不能解决的计算,存储问题
单机系统和分布式系统最大的区别在于问题的规模,即计算,存储的数据量的区别
将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得分布式系统中的每台机器负责问题的一个子集
因为无论是计算还是存储,问题的输入对象都是数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题
哈希分布数据的缺点突出表现为可扩展性不高:
一旦集群规模需要扩展,则几乎所有的数据需要被迁移并重新发布
工程中,扩展哈希分布数据的系统时,往往使得集群规模成倍扩展
按照数据重新计算哈希,这样原本一台机器上的数据只需要迁移一半到另一台对应的机器上即可完成扩展
针对哈希方式扩展性差的问题,一种思路是不再简单的将哈希值与机器做除法取模映射,而是将对应关系作为元数据服务由专门的元数据服务器管理
哈希值的取模个数往往大于机器个数,这样同一台机器上需要负责多个哈希取模的余数.但是需要以复杂的机制维护大量的元数据
哈希分布数据的另一个缺点是一旦某些数据特征值的数据严重不均,容易出现数据倾斜问题:
按数据范围分布: 将数据按特征值的值域范围划分为不同的区间,使得集群中每台服务器处理不同区间的数据
工程中,为了数据迁移等负载均衡操作的方便,往往利用动态划分区间的技术,使得每个区间中服务的数据量尽量的一样多
当某个区间的数据量较大时,通过将区间分裂的方式拆分为两个区间,使得每个数据区间中的数据量都尽量维持在一个较为固定的阈值之下
需要使用专门的服务器在内存中维护数据分布信息,这种数据的分布信息为一种元信息
对于大规模集群,由于元信息的规模庞大,单台计算机无法独立维护,需要使用多台机器作为元信息服务器
数据量分布数据与具体的数据特征无关,而是将数据视为一个顺序增长的文件,并将这个文件按照某一较为固定的大小划分为若干数据块chunk, 不同的数据块分布到不同的服务器上
按数据量分布数据也需要记录数据块的具体分布情况,并将该分布信息作为元数据使用元数据服务器管理
按数据量分布的优点:
因为按数据量分布与具体的数据内容无关,按数据量分布数据的方式一般没有数据倾斜的问题,数据总是被均匀切分并分布到集群中
当集群需要重新负载均衡时,只需要通过迁移数据块即可完成
集群扩容也没有太大的限制,只需要将部分数据库迁移到新加入的机器上即可以完成扩容
按数据量分布的缺点:
需要管理较为复杂的元信息
当集群规模较大时,元信息的数据量也变得很大,需要通过复杂的机制高效管理元信息
一致性哈希: consistent hasing
是在工程中使用较为广泛的数据库分布方式
一致性哈希最初在P2P网络中作为分布式哈希表DHT的常用数据分布算法
一致性哈希的基本方式:
使用一个哈希函数计算数据或者数据特征的哈希值
令该哈希函数的输出值域为一个封闭的环,即哈希函数输出的最大值是最小值的前序
将节点随机分布到这个环上,每个节点负责处理从自己开始顺时针至下一个节点的全部哈希值域上的数据
使用一致性哈希的方式需要将节点在一致性哈希环上的位置作为元信息加以管理,这比直接使用哈希分布数据的方式要复杂
节点的位置信息只与集群中的机器规模相关,元信息的量通常比按数据范围分布数据和按数据量分布数据的元信息量要小得多
一致性哈希的改进算法: 引入虚节点的概念
虚节点的个数一般远大于未来集群中机器的个数
将虚节点均匀分布到一致性哈希值域环上,其功能与基本一致性哈希算法中的节点相同
为每个节点分配若干虚节点
操作数据时,首先通过数据的哈希值在环上找到对应的虚节点,进而查找元数据对应的真实节点
使用虚节点改进的优点:
一旦某个节点不可用,该节点将使多个虚节点不可用,从而使得多个相邻的的真实节点负载失效节点的压力
一旦加入一个新节点,可以分配多个虚节点,从而使得新节点可以负载多个原有节点的压力
比较容易实现扩容时的负载均衡
分布式系统容错,提高可用性的基本手段就是使用副本
对于数据副本的分布方式主要影响系统的可扩展性
基本的数据副本策略:
以机器为单位,若干机器互为副本
副本之间的数据完全相同
优点: 非常简单
缺点: 恢复数据的效率不高,可扩展性也不高
合理的做法:
不是以机器作为副本单位,而是将数据拆分为较合理的字段,以数据段为单位作为副本
实践中,常常使得每个数据段的大小尽量相等且控制在一定的大小以内
数据段有很多不同的称谓:
segment
fragment
chunk
partion
数据段的选择与数据分布方式直接相关
哈希分布方式:
每个哈希分桶后的余数可以作为一个数据段,为了控制数据段的大小,常常使得分桶个数大于集群规模
一旦将数据分为数据段,就可以以数据段为单位管理副本,从而使得副本不再硬相关,每台机器都可以负责一定数据段的副本
一旦副本分布与机器无关,数据丢失后恢复效率将非常高:
一旦某台机器的数据丢失,丢失的数据段的副本将分布在整个集群中的所有机器中,而不仅仅是在几个副本机器中,从而可以从整个集群同时拷贝恢复数据,而集群中每台数据源机器都可以以非常低的资源做拷贝
副本分布与机器无关也利于集群容错:
如果出现机器宕机,由于宕机机器上的副本分散于整个集群,则压力也分散到整个集群
副本分布于机器无关也利于集群扩展:
理论上,假设集群规模为N台机器,当加入一台新的机器时,只需从各台机器上迁移
1
N
−
+
\frac{1}{N}-\frac{1}{N+1}
N1−N+11比例的 数据段到新机器即可实现负载均衡
由于是从集群中各机器迁移数据,与数据恢复同理,效率非常高
工程中,完全按照数据段建立副本会引起需要管理的元数据的开销增大,副本维护的难度也相应增大.一种折中的做法:
将某些数据段组成一个数据段分组,按数据段分组为粒度进行副本管理,这样可以将副本粒度控制在一个较为合适的范围内
分布式系统中的数据分布方式影响着计算的分布方式
分布式系统中计算节点和保存计算数据的存储节点可以在同一台物理机器上,也可以位于不同的物理机器上
如果计算节点和存储节点位于不同的物理机器则计算的数据需要通过网络传输,会导致很大的开销,甚至网络带宽会成为系统的总体瓶颈
将计算尽量调度到与存储节点在同一台物理机器上的计算节点上进行,这种方法就叫做本地化计算
本地化计算是计算调度的一种优化,体现了重要的分布式思想:
移动数据不如移动计算
在实际工程实践中,可以根据需求及实施复杂度合理选择数据分布方式
数据分布方式是可以灵活组合使用的,可以兼备各种方式的优点,收到较好的综合效果
数据倾斜问题: 在按哈希分数据的基础上引入按数据量分布数据的方式,解决数据倾斜问题 按用户ID的哈希值分布数据,当某个用户ID的数据量特别大时,该用户的数据始终落在某一台机器上 引入按数据量分布数据的方式,统计用户的数据量,并按某一阈值将用户的数据切为多个均匀的数据段,将这些数据段分布到集群中 由于大部分用户的数据量不会超过阈值,所以元数据中仅仅保存超过阈值的用户的数据段分布信息,从而控制元数据的规模 这样组合使用哈希分布数据方式与按数据量分布数据方式,使用的效果较好