分布式系统的磁盘均衡策略

分布式系统设计中的一大挑战,是对磁盘的均衡使用,这在一个全新的集群中,是比较容易实现的。关键问题在于,随着时间的推移,我们需要在集群中不断地新增或者移除设备,在分布式文件存储系统 YRCLoudFile 产品中,我们可能会使用冷热分层策略将文件下刷至对象存储,这些行为都可能会导致集群内的磁盘使用不均,从而产生访问热点、资源利用率低等问题。

分布式系统的磁盘均衡策略

数据分布算法决定了磁盘均衡的最终效果,一个良好的分布策略,往往需要完成数据分布均匀的基本目标,同时在此基础上兼顾节点异构和故障域隔离。

  • 节点异构 —— 存储节点间的容量或性能差异
  • 故障域隔离 —— 例如不同数据中心、机房、机柜、交换机、机器等,均可以组成一个故障域,尽量使主备磁盘落在不同的故障域中

常见的分布算法,可根据是否单独存储元数据分成两大类,对于不单独存储元数据的类别而言,常见的分布算法有以下几种。

01 哈希分布

最直接的哈希算法,通过数据中某个特征值,利用哈希函数进行计算,从而建立起数据与节点间的映射关系。

通过一个散布良好的哈希函数,可以将数据均匀地分布到各个节点中去,保证数据均衡,并且只要根据数据的特征值,即可直接快速地计算出数据所在的节点。这个方法的具体效果取决于哈希函数本身的优劣,并且设备的添加或删除,会导致原来的映射关系失效,需要将所有的映射关系进行重新计算,并且根据新的关系来移动数据。

分布式系统的磁盘均衡策略

哈希分布

02 一致性哈希分布

为了解决上述哈希分布在节点增加或删除时导致的大量数据迁移的问题,我们在哈希分布的基础上引入了一致性哈希算法。一致性哈希算法的核心数据结构是哈希环,哈希值分布在这个哈希环上,首尾相接,通常范围是[0 ~ 2^32-1]。我们将数据根据特征值通过哈希计算得到其在哈希环上的对应位置如下:

分布式系统的磁盘均衡策略

数据映射至哈希环

再将服务器根据特征值(例如IP或主机名)通过 hash 函数映射到哈希环上,数据将会落在哈希环上顺时针的邻近节点。

分布式系统的磁盘均衡策略

数据落盘

这样的设计很大程度上解决了在节点移除或增加时的数据迁移量,只会对相邻节点的数据进行迁移。

分布式系统的磁盘均衡策略

Node3 移除时的数据迁移

03 带有虚拟节点的一致性哈希

一致性哈希解决了普通哈希算法中大量数据迁移的问题,但也引入新的问题,就是数据盘的使用不均,而这实际上是数据分布的基本目标。

我们可以假设,哈希算法使数据落在哈希环上每一个位置的概率都是均等的,但是数据节点的数量却远小于哈希环的点数量,此时极有可能每个节点所覆盖的哈希环范围是不均匀的,那么这就会导致某些节点被集中落盘;此外,如果在新加入节点后,其距离已有节点的距离较近,且处于靠后位置,那么新加入的节点不但对于集群带宽没有提升,反倒降低了集群的磁盘利用率。

为了解决以上这些问题,我们在哈希环中引入了虚拟节点,以节点的磁盘大小和性能为权重,将虚拟节点分配到每个物理节点上,即每个物理节点对应一组虚拟节点,并由此决定数据落盘的实际位置。

分布式系统的磁盘均衡策略

带虚拟节点的一致性哈希

以上是不单独存储元数据时,我们常见的数据分布算法,对于分布式文件系统而言,我们往往将元数据与数据分开存放,元数据中保存了关于数据落盘的相关信息。在这种场景下,常见的落盘算法分别是 Round-Robin Available Space

  • Round-Robin —— 轮巡选择可用磁盘
  • Available Space —— 基于可用空间进行优先选盘

分布式系统的磁盘均衡策略

显然,在长期运行的集群中,轮巡算法会导致数据分布不均,而基于可用空间的优先选盘策略,则会导致例如节点扩容的场景中,数据集中涌入相同磁盘的问题,这在一定时间内会成为集群的性能瓶颈。

04 YRCloudFile 的数据分布策略

从上述内容可见,无论是基于哈希表的数据分布算法还是基于可用空间的落盘算法,都有各自的局限性。在 YRCloudFile 整体架构上,从高可用和高性能的角度出发,取百家之长,做出了一系列的设计来保证磁盘的使用均衡和数据安全。

  • 集群部署:在集群部署时,副本模式下,对于磁盘主备分组时,可以考虑从不同故障域中选择节点上的磁盘进行成组。

分布式系统的磁盘均衡策略

  • 容量水线:YRCloudFile 算法根据百分比可用容量(可根据配置动态调整)结合实际可用容量对磁盘进行分组,将磁盘划分为 L0-L3 共四个组别,选盘优先级依次降低,并且设定了保护水线,不再分配达到保护位的磁盘。

分布式系统的磁盘均衡策略

  • 数据切片:YRCloudFile 将文件根据数据切片数量来选择落盘,在默认未设置落盘偏好的情况下,利用 straw 算法,从高优先级的上述水线组中根据磁盘可用容量,磁盘负载等计算权重来选择落盘。当高优先级的组中磁盘数量不足以分配时,再向低级组中去补足。同时,支持用户自定义落盘偏好,以满足特殊的用盘需求。
  • 在线数据均衡:在极端的情况下,如果仍有磁盘数据不均的问题时,YRCloudFile 还有最后一个修补措施,那就是“在线数据均衡”功能,YRCloudFile 支持通过触发数据迁移,在保证集群在线正常服务的前提下,手动均衡磁盘数据,并且可以根据集群负载情况,决定数据迁移的工作负载,避免影响正常业务的进行。

通过上述的设计,YRCloudFile 尽最大可能地保证了数据的分布均衡,同时兼顾了节点异构和故障域隔离,在保证高可用高性能的同时,让集群的空间得到最大程度的利用。

05 关于 YRCloudFile 未来设计的展望

未来 YRCloudFile 还将针对无限追加写导致空间不均的场景进行优化,我们根据文件大小来决定切片的数量,例如针对小于 1G 的文件,采用 4 分片,1~10G 采用 8 分片,10~100G 采用 16 分片,100G~1T 采用 32 分片,直至单个文件占满整个集群。

发表评论

相关文章