目录

前言

指标

演进

应用案例


前言

分布式存储系统面临着的首要问题,就是如何将大量的数据分布在不同的存储节点上。无论上层接口是 KV存储、对象存储、块存储、亦或是列存储,在这个问题上大体是一致的。本文将介绍如何分布式存储系统中做数据分布目标及可选的方案,并试着总结和权衡他们之间的关系及优缺点。

指标

这里假设目标数据是以 key 标识的数据块或对象。在一个包含多个存储节点的集群中,数据分布算法需要为每一个给定的 key 指定一个或多个对应的存储节点负责,数据分布算法有两个基本目标:

  1. 均匀性(Uniformity):不同存储节点的负载应该均衡;
  2. 稳定性(Consistency):每次一个 key 通过数据分布算法得到的分布结果应该保持基本稳定,即使在有存储节点发生变化的情况下也能保持这种稳定。

可以看出,这两个目标在一定程度上是相互矛盾的。当有存储节点增加或删除时,为了保持稳定应该尽量少的进行数据的移动和重新分配,而这样又势必会带来负载不均衡。同样追求极致均匀也会导致较多的数据迁移。

所以我们希望在上述这两种极端情况之间,找到一个点以获得合适的均匀性和稳定性。除了上述两个基本目标外,工程中还需要从以下几个方面考虑数据分布算法的优劣:

  1. 性能可扩展性:这个主要考虑的是数据分布算法相对于存储节点规模的时间复杂度。为了整个系统的可扩展性,数据分布算法不应该在集群规模扩大后显著的增加运行时间。
  2. 考虑节点异构:实际工程中,不同存储节点之间可能会有很大的性能或容量差异,好的数据分布算法应该能很好的应对这种异构,提供加权的数据均匀。
  3. 隔离故障域:为了数据的高可用,数据分布算法应该为每个 key 找到一组存储节点,这些节点可能提供的是数据的镜像副本,也可能是类似擦除码的副本方式。数据分布算法应该尽量隔离这些副本的故障域,如不同机房、不同机架、不同交换机、不同机器。

演进

看完算法的评价指标后,接下来介绍一些可能的方案演进,并分析他们的优劣。这里假设 key 的值足够分散。

1. Hash

一个简单直观的想法是直接用 Hash 来计算,简单的以 key 做哈希后对节点数取模(存储节点的数量)。可以看出,在 key 足够分散的情况下,均匀性可以获得。可是一旦集群中有存储节点加入或退出时(此时取模的值会变),所有的原有节点都会受到影响(模值改变,同一个数据计算的结果可能会不同)。稳定性无从谈起。

2. 一致性 Hash

一致性 Hash 可以很好的解决稳定性问题,可以将所有的存储节点排列在收尾相接的Hash 环上,每个 key 在计算Hash后会顺时针找到先遇到的存储节点存放。而当有节点加入或退出时,仅影响该节点在 Hash 环上顺时针相邻的后续节点。但这有带来均匀性的问题,即使可以将存储节点等距排列,也会在存储节点个数变化时带来数据的不均匀。而这种可能成倍数的不均匀在实际工程中是不可接受的。

3. 带负载上限的一致性 Hash

一致性 Hash 有节点变化时不均匀的问题。 Google 在2017年提出了 Consistent Hashing with Bounded Loads 来控制这种不均匀的程度。简单的说,该算法给 Hash 环上的每个节点一个负载上限为 1+e 倍的平均负载,这个e可以自定义。当 key 在Hash环上顺时针找到合适的节点后,会判断这个节点的负载是否已经到达上限,如果已达上限,则需要继续找之后的节点进行分配。

如上图所示,假设每个桶当前上限是2,红色的小球按序号大小先后访问,当编号为6的红色小球到达时,发现顺时针首先遇到的B(3,4),C(1,5)都已经达到上限。因此,最终会放置在桶A里。

这个算法最吸引人的地方在于当有节点变化时,需要迁移的数据量是 1/e2 相关,而与节点数或数据数量均无关。也就是说当集群规模扩大时,数据迁移量并不会随着显著增加。另外,使用者可以通过调整 e 的值来控制均匀性和稳定性之间的权衡,就是一种以时间换空间的算法。总体来说,无论是一致性 Hash 还是带负载限制的一致性 Hash,都无法解决节点异构的问题。

4. 带虚拟节点的一致性 Hash

为了解决负载不均匀和异构的问题,可以在一致性Hash的基础上引入虚拟节点。即Hash环上的每个节点并不是实际的存储节点,而是一个虚拟节点。实际的存储节点根据其不同的权重,对应一个或多个虚拟节点,所有落到相应虚拟节点上的 key 都由该存储节点负责。

如下图所示,存储节点A负责(1,3],(4,8],(10,14],存储节点B负责(14,1],(8,10]。

这个算法的问题在于,一个实际存储节点的加入或退出,会影响多个虚拟节点的重新分配,进而引起很多节点参与到数据迁移中来。另外,实践中将一个虚拟节点重新分配给新的实际节点时,需要将这部分数据遍历出来发送给新节点。我们需要一个更合适的虚拟节点切分和分配方式,那就是分片。

5. 分片

分片将哈希环切割为相同大小的分片,然后将这些分片交给不同的节点负责。注意这里跟上面提到的虚拟节点有着很本质的区别:分片的划分和分片的分配被解耦。

一个节点退出时,其所负责的分片并不需要顺时针合并给之后节点,而是可以更灵活的将整个分片作为一个整体交给任意节点。在实践中,一个分片多作为最小的数据迁移和备份单位。

而也正是由于上面提到的解耦,相当于将原先的 key 到节点的映射拆成了两层。需要一个新的机制来进行分片到存储节点的映射。由于分片数相对 key 空间已经很小并且数量确定,可以更精确地初始设置,并引入中心目录服务来根据节点存活修改分片的映射关系。同时将这个映射信息通知给所有的存储节点和客户端。

上图是分布式KV存储Zeppelin中的分片方式, key Space通过 Hash 到分片,分片及其副本又通过一层映射到最终的存储节点 Node Server。

6. CRUSH 算法

CRUSH 算法本质上也是一种基于分片的数据分布方式,其试图在以下几个方面进行优化:

(1) 分片映射信息量:避免中心目录服务和存储节点及客户端之间交互大量的分片映射信息,而改由存储节点或客户端自己根据少量且稳定的集群节点拓扑和确定的规则自己计算分片映射。

(2) 完善的故障域划分:支持层级的故障域控制,将同一分片的不同副本按照配置划分到不同层级的故障域中。

客户端或存储节点利用 key 、存储节点的拓扑结构和分配算法,独立的进行分片位置的计算,得到一组负责对应分片及副本的存储位置。如图所示是一次定位的过程,最终选择了一个row下的cab21,cab23,cab24三个机柜下的三个存储节点。

当节点变化时,由于节点拓扑的变化,会影响少量分片数据进行迁移,如下图是加入新节点引起的数据迁移。通过良好的分配算法,可以得到很好的负载均衡和稳定性,CRUSH提供了 Uniform、List、Tree、Straw 四种分配算法。

应用案例

常见的分布式存储系统大多采用类似于分片的数据分布和定位方式:

(1) Cassandra/Dynamo:采用分片的方式并通过 Gossip 协议在对等节点间通信;

(2) Redis Cluster:将 key Space 划分为 slots,同样利用 Gossip 协议通信;

(3) Zeppelin:将数据分片为Partition,通过 Meta 集群提供中心目录服务;

(4) Bigtable:将数据切割为 Tablet,类似于可变的分片,Tablet Server 可以进行分片的切割,最终分片信息记录在 Chubby 中;

(5) Ceph:采用 CRUSH 方式,由中心集群 Monitor 提供并维护集群拓扑的变化。

转载自:https://juejin.im/post/5b38cffae51d4558e36037ec

浅谈分布式存储系统数据分布算法相关推荐

  1. 浅谈分布式存储系统的数据分布算法

    前言 分布式存储系统 面临着的首要问题,就是如何将 大量的数据 分布在 不同的存储节点 上.无论上层接口是 KV 存储.对象存储.块存储.亦或是 列存储,在这个问题上大体是一致的.本文将介绍如何 分布 ...

  2. 浅谈分布式存储系统Pangu2.0——它让双11运维变得智能起来

    摘要: 12月13-14日,由云栖社区与阿里巴巴技术协会共同主办的<2017阿里巴巴双11技术十二讲>顺利结束,集中为大家分享了2017双11背后的黑科技.本文是<省身:分布式存储系 ...

  3. 搞懂分布式技术16:浅谈分布式锁的几种方案

    搞懂分布式技术16:浅谈分布式锁的几种方案 前言 随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景, ...

  4. 浅谈分布式架构搭建-理论知识

    浅谈分布式架构搭建 基础 理念 技术选型 后端技术设计 总体架构设计 关键案例设计 架构师搭建架一般优先考虑的是安全性.稳定性.高吞吐量.哈哈,菜鸟的我让我装个B,回忆一下以前架构搭建 基础 理念 C ...

  5. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  6. python算法程序_浅谈python常用程序算法

    一.冒泡排序: 1.冒泡排序是将无序的数字排列成从小到大的有序组合: 过程:对相邻的两个元素进行比较,对不符合要求的数据进行交换,最后达到数据有序的过程. 规律: 1.冒泡排序的趟数时固定的:n-1 ...

  7. 技术分享:浅谈滴滴派单算法

    浅谈滴滴派单算法 原创: 王犇 刘春阳 徐哲 滴滴技术 桔妹导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的 ...

  8. **浅谈三角测距激光雷达测距算法**

    浅谈三角测距激光雷达测距算法 此篇文章主要对我这半年以来对激光雷达光斑定位算法上一些粗浅的见解,三角测距的基本原理在这里就不做基本的叙述,百度一下都有.本文主要对三角法激光雷达比较重要和比较难以匹配的 ...

  9. 浅谈分布式一致性算法raft

    前言:在分布式的系统中,存在很多的节点,节点之间如何进行协作运行.高效流转.主节点挂了怎么办.如何选主.各节点之间如何保持一致,这都是不可不面对的问题,此时raft算法应运而生,专门 用来解决上述问题 ...

最新文章

  1. sas数据集怎么导出_利用SAS中的ODS导出程序结果数据集
  2. 端到端机器学习_端到端机器学习项目:评论分类
  3. 【SICP练习】22 练习1.28
  4. 深度学习《各种归一化的区别》
  5. 【Elasticsearch】es一个奇怪的问题 is_write_index fasle的时候还在写入 索引滚动无效
  6. Mean Shift具体介绍
  7. js ajax 传输list,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...
  8. jQuery - animate(滑块滑动)
  9. 使用番茄助手 快速注释
  10. k8s pv与pvc
  11. LIFT:Learned Invariant Feature Transform
  12. 计算机某浏览器设置主页地址,如何查看电脑中的浏览器主页是被什么软件修改的...
  13. Adobe read X安装过程中出现无法将数值DisableExceptionChainValidation写入键
  14. outlook电子邮件解析_在Outlook 2007中轻松重新发送电子邮件
  15. python期货数据 库_如何用python或者基于vnpy框架将期货tick数据聚合成1分钟数据呢?...
  16. 【呆瓜学maven】Maven介绍(创建工程项目以及下载所需要的jar包)
  17. Qt5软键盘实现中文拼音输入法
  18. 如何计算两个日期之间的工作天数
  19. 最新中国大陆TOP100网站排名
  20. 常用端口与udp协议

热门文章

  1. python爬虫 爬取bilibili新番榜
  2. 总结了24个C++的大坑,看你能躲过几个?
  3. 每日一题之 MySQL
  4. Java 代码精简之道 | 长文
  5. 每日一道算法题-寻找丑数
  6. shell编程之case语句及函数
  7. LiveVideoStackCon 2022 上海站延期通告(内附最新日程海报)
  8. 当一百万名记者都嚷嚷着“Facebook 很糟糕”......
  9. MPEG中面向沉浸式视觉体验的标准化活动
  10. 通过端到端的数据侦测提升QoS