分布式系统原理(2)数据分布方式

分布式系统原理(2)数据分布方式

分布式系统中如何拆解、存储数据到节点几乎是个公共的问题,本章就不同的数据分布方式作简要介绍

哈希方式

按数据某一特征计算哈希值,并将其与某一节点建立映射关系

一种常见的哈希方式是按数据属于的用户 id 计算哈希值,集群中的服务器按 0 到机器数减 1 编号,哈希值除以服务器的个数,结果的余数作为处理该数据的服务器编号
工程中,往往要考虑服务器的副本冗余,将多台服务器组成一组,将数据哈希与服务器组编号做映射。
下图给出一个哈希方式分布数据的例子:
哈希方式
优点:

  • 只要设计较好的散列函数,就能将数据均匀地分布到各个节点,且除了哈希函数,节点无需记录其他元数据

缺点:

  • 可扩展性不高,集群扩展时需要迁移大量数据。改进方法,可以将哈希值与机器的对应关系作为元数据有专门的元数据服务器管理,并且哈希取模的个数往往大于机器个数,这样同一台机器负责多个哈希取模的余数,扩容时只需要将部分余数分配到新机器上即可,但这样改进的代价就是要引入较为复杂的机制管理元数据
  • 需要成倍扩容。由于使用取模运算决定数据存放节点,在扩容时就要成倍增加节点。一种改进方法是集群设计之初即使用一个节点负责多个余数,扩容时将新节点与一个余数关联即可。
  • 容易出现数据倾斜,若某个用户id的数据非常多,导致某些节点数据很多而其他节点数据很少,节点分配不均。一种改进是使用多个维度的数据特征做哈希,如用户id加上数据时间段。一种极端的思路是使用全部数据做哈希,这样所有数据能均匀存储到不同节点,但这样做会使存储的数据关联性不强,且全部哈希会带来性能影响,此种方法适合字典查询系统,各数据间逻辑关联性不强,能将数据均匀分布,解决数据倾斜问题
按数据范围分布

将数据按特征值的值域范围划分成不同的区间,使每台服务器处理不同区间的数据

如按照用户id值域划分数据,如下图所示:
按数据范围分布
注意,区间大小和数据大小没有关系,如图中 33~90 区间的用户数据量就等于其他区间用户的数据。工程中,为了负载均衡的方便,往往利用动态划分的技术,使得每个区间的数据尽量一样多,当某个区间的数据量过多时,采用“分裂”的方式将拆分为两个区间。哈希分布数据的方式使得系统中的数据类似一张哈希表,而按数据范围分布方式使得数据类似一个B树,具体的服务节点为B树的叶子节点,元数据服务器为B树的中间节点

优点:

  • 可以灵活的根据数据量的具体情况拆分原有数据空间,拆分后的数据区间可以迁移到新机器,扩容相比哈希方式灵活很多
  • 扩容时可以随意添加机器,不需要成倍添加

缺点:

  • 需要维护较为复杂的元数据信息。随着集群规模扩大,元数据服务容易成为性能瓶颈,此时需要多元数据服务机制
按数据量分布

将数据视为一个顺序增长的文件,将该文件按照某一较为固定的大小划分成若干数据块(chunk),不同的数据块分布到不同的服务器上。该方式要需要特定的元数据服务器记录数据块的元数据。集群扩容没有太大的限制,只需要迁移部分数据块使数据均匀分布即可

优点:

  • 不会产生数据倾斜
  • 扩容容易

缺点:

  • 需要较为复杂的元数据服务机制
  • 每个节点存储的数据逻辑关联性不强
一致性哈希

一致性哈希最初在 P2P 网络中作为分布式哈希表(DHT)的常用数据分布算法。一致性哈希的基本方式是使用一个哈希函数计算数据或数据特征的哈希值,令该哈希函数的输出值域为一个封闭的环,即哈希函数输出的最大值是最小值的前序。将节点随机分布到这个环上,每个节点负责处理从自己开始顺时针至下一个节点的全部哈希值域上的数据
例如,某一哈希函数的值域为 [0,8),系统有3个节点A、B、C,分别处于一致性哈希的位置为1,3,6,则A负责 [1,3)的数据,B负责 [3,6)的数据,C负责 [6,8)的数据,如下图所示:
一致性哈希
优点:

  • 可以任意动态添加、删除节点,每次添加、删除一个节点只影响一致性哈希环上相邻的节点

缺点:

  • 随机分布哈希值域的方式,很难均匀地分布哈希值域,即使均匀分布了,在动态添加或删除一个节点后又会导致不均匀。由此引出一个更严重的问题,当一个节点异常时,压力将直接分摊到相邻的节点,很有肯能连锁崩溃。加入一个新节点只能为相邻节点分摊压力。改进方法:引入“虚节点”。系统创建时即建立很多虚节点,虚节点的个数远大于未来集群中估计的机器的最大个数,一般百倍量级。将虚节点均匀的分布到一致性哈希换上,其功能与一致性哈希算法的节点相同,为每个节点分配多个虚节点。操作数据时,通过数据的哈希值在环上找到对应的虚节点,进而查找元数据找到对应的真实节点。使用虚节点可以使得:当一个节点异常时,会使多个相关的虚节点失效,从而使多个相邻的真实节点负载异常节点的压力。同理,一旦加入一个新节点,可以分配多个虚节点,使得新节点能够负载多个节点的压力。较容易实现扩容时的负载均衡
数据分布与副本
  • 以机器为副本单位:通常需要成倍扩容机器,却数据重新分配耗时长
  • 以数据段为副本单位:扩容方便,数据重新分配快,但是需要元数据服务机制管理数据段

工程中,完全按照数据段建立副本会引起需要管理的元数据开销极大,通常采用折中的办法,将部分数据段作为一个数据段组,按数据段组作为粒度进行副本管理,这样可以将副本粒度控制在一个合理的范围

数据分布方式的选择

上述各种数据分布方式各有优劣,实际工程中需要按需求和实施复杂度合理选择,也可以组合使用。
如使用哈希分布的方式引发数据倾斜时,一种场景是某用户id的数据量很大,此时可以结合按数据量分布的方法,将该数据按某一阈值拆分为多个数据段并分布到整个集群中去,此时需要管理该部分数据段的元数据。由于此类用户id不会非常多,所以只需要维护小部分的元数据即可

工程投影

几乎所有的分布式系统都会涉及到数据分布问题,下表是部分分布式系统的数据分布方式:

分布式系统数据分布方式
GFS & HDFS按数据量分布
Map reduce按 GFS 的数据分布做本地化
Big Table & HBase按数据范围分布
PNUTS哈希方式/按数据范围分布(可选)
Dynamo & Cassandra一致性哈希
Mola & Armor哈希方式
Big Pipe哈希方式
Doris哈希方式与按数据量分布组合
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值