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

前言

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

正文

(一) 指标

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

  • 均匀性(Uniformity):不同存储节点的 负载 应该 均衡

  • 稳定性(Consistency):每次一个 key 通过 数据分布算法 得到的 分布结果 应该保持 基本稳定,即使再有存储节点发生变化的情况下。

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

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

  1. 性能可扩展性:这个主要考虑的是算法相对于 存储节点规模时间复杂度。为了整个系统的可扩展性,数据分布算法不应该在集群规模扩大后显著的增加运行时间。

  2. 考虑节点异构:实际工程中,不同 存储节点 之间可能会有很大的 性能容量差异,好的数据分布算法应该能很好的应对这种 异构,提供 加权的数据均匀

  3. 隔离故障域:为了 数据的高可用,数据分布算法应该为每个 key 找到 一组存储节点,这些节点可能提供的是 数据的镜像副本,也可能是类似 擦除码 的副本方式。数据分布算法应该尽量 隔离 这些副本的故障域,如 不同机房不同机架不同交换机不同机器

(二) 演进

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

1. Hash

一个简单直观的想法是直接用 Hash 来计算,简单的以 Key哈希对节点数取模。可以看出,在 key 足够分散的情况下,均匀性 可以获得,但一旦有 节点加入退出 时,所有的原有节点都会受到影响。稳定性 无从谈起。

2. 一致性Hash

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

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

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

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

这个算法最吸引人的地方在于 当有节点变化 时,需要迁移的数据量是 1/e^2 相关,而与 节点数数据数量 均无关。

也就是说当 集群规模扩大 时,数据迁移量 并不会随着显著增加。另外,使用者可以通过调整 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 算法本质上也是一种 基于分片 的数据分布方式,其试图在以下几个方面进行优化:

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

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

客户端存储节点 利用 key存储节点拓扑结构分配算法,独立的进行 分片位置 的计算,得到一组负责对应 分片副本存储位置

如图所示是 一次定位 的过程,最终选择了一个 row 下的 cab21cab23cab24 三个机柜下的三个存储节点。

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

(三) 应用案例

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

  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 提供并维护 集群拓扑 的变化。


欢迎关注技术公众号: 零壹技术栈

零壹技术栈

本帐号将持续分享后端技术干货,包括虚拟机基础,多线程编程,高性能框架,异步、缓存和消息中间件,分布式和微服务,架构学习和进阶等学习资料和文章。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 分布式存储系统是一种通过将数据分散存储在多台机器上实现高可靠性、高性能和可扩展性的存储架构。对于给定的习题,我将从以下几个方面来回答。 首先,分布式存储系统的基本概念与原理。分布式存储系统通过将数据分散存储在多个节点上,实现将数据进行有效管理和存储的功能。它将数据存储在不同的节点上,使得数据能够充分利用分布式存储系统的优势,如容错性和负载均衡。 其次,分布式存储系统的设计和实现。分布式存储系统的设计需要考虑诸多因素,如数据一致性、数据分片、数据迁移等。实现分布式存储系统的技术主要包括数据分布算法、数据复制和一致性协议等。常见的分布式存储系统包括HDFS、GlusterFS和Ceph等。 再次,分布式存储系统的应用场景。分布式存储系统广泛应用于大规模数据存储场景,如云存储分布式文件系统等。通过将数据分散存储在多个节点上,可以充分利用节点的计算性能和存储容量,并提高系统的可靠性和性能。 最后,分布式存储系统的优势和挑战。分布式存储系统在数据存储和管理方面具有很多优势,如高可靠性、高性能和可扩展性。然而,它也面临着一些挑战,如数据一致性、数据安全性和系统维护等。为了解决这些挑战,需要采用合适的设计和实现策略。 综上所述,分布式存储系统是一种将数据分散存储在多台机器上的存储架构,它具有高可靠性、高性能和可扩展性的特点。在设计和实现分布式存储系统时,需要考虑数据一致性、数据分片和数据迁移等因素。分布式存储系统广泛应用于大规模数据存储场景,并具有很多优势和挑战。 ### 回答2: 分布式存储系统是一种将数据分布存储在多个节点上的系统。它将大量的数据分散存储在多个独立的节点上,通过网络进行数据的读写操作。 分布式存储系统具有如下特点: 1. 高可靠性:分布式存储系统将数据存储在多个节点上,当其中的某个节点发生故障时仍可通过其他节点访问数据,从而提供了高可靠性。 2. 高扩展性:分布式存储系统可以随着需求的增加灵活地扩展存储容量,只需增加更多的节点即可,而不会对整个系统产生影响。 3. 高性能:由于数据分散存储在多个节点上,在进行数据读写操作时可以并行进行,从而提高了系统的读写性能。 4. 数据一致性分布式存储系统通过一致性协议来确保各个节点上的数据一致性,即使在节点发生故障或者网络出现故障时也能保持数据的一致性。 5. 容错性:分布式存储系统在设计时考虑了节点的故障,通过数据的冗余备份和恢复机制来提供容错性,当某个节点发生故障时可以通过备份节点恢复数据。 6. 高可用性:由于数据的分布存储,当某个节点不可用时可以通过其他可用节点继续提供服务,从而提供了高可用性。 总的来说,分布式存储系统是一种强大而灵活的存储架构,能够满足大规模数据存储和处理的需求。它充分利用了分布式计算和网络技术,提供了高可靠性、高扩展性和高性能的存储解决方案。 ### 回答3: 分布式存储系统是一种通过在多个计算机节点上存储和管理数据的系统。相比于传统的集中式存储系统分布式存储系统具有更高的可伸缩性、可靠性和性能。 举个例子来说,假设有一个分布式存储系统由10个节点组成。当需要存储一个文件时,系统会将文件拆分成多个块,并在不同的节点上存储这些块。这样做的好处是可以提高系统的吞吐量和并发性能,在某个节点发生故障时也能够保证数据的可靠性和持续可用性。 另外,分布式存储系统还可以通过数据的复制和副本来增加系统的可靠性。例如,在上述例子中,每个块可以复制多个副本到其他的节点中,以防止某个节点的故障导致数据的不可用性。 此外,分布式存储系统还可以通过数据分片和数据冗余来提高系统的性能和可用性。通过将数据分片存储在不同的节点上,可以使数据的访问负载均衡,并提高系统的并发性能。同时,数据的冗余存储也可以在某个节点故障时提供备份数据,确保系统的可靠性。 总结起来,分布式存储系统是一种可靠、高性能的存储方案,通过将数据分布在多个节点上,并利用数据的复制、分片和冗余等技术来提高系统的可用性、性能和可靠性。同时,分布式存储系统还可以根据不同的应用场景和需求进行灵活的配置和扩展,适应不同规模和负载的存储需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值