分布式存储系统能够将数据分布到多个节点,并在多个节点之间进行负载均衡。本文就围绕数据分布和负载均衡,探讨数据分布算法需要考虑的因素、常见的数据分布算法、负载均衡算法等,以期我们在自己设计开发一个新的分布式存储系统时,能够对这些方面有全面的考虑。
一、 数据分布
在介绍常见的数据分布算法前,我们首先来思考一个问题:对数据进行分布时需要考虑什么?
不管是key-value存储、对象存储、块存储、还是列存储等其他类型的存储系统,对这个问题的回答几乎是一致的。下文将介绍在分布式存储系统中做数据分布目标及可选的方案,并总结他们之间的关系及权衡。
1.1 指标
我们假设数据是以key标识的数据块或对象,在一个包含多个存储节点的集群中,数据分布算法需要为每一个给定的key指定一个或多个对应的存储节点负责,数据分布算法有两个基本目标:
- 均匀性:不同存储节点之间的负载应保持均衡(容量均衡、IO均衡)。
- 稳定性:每次key通过数据分布算法得到的分布结果应保持基本稳定。
可以看出,这两个目标在一定程度上是相互矛盾的。当有存储节点增加或者删除时,为了保持稳定,应该尽量少的进行数据迁移和重新分布;但是为了保持均匀,就会导致较多的数据迁移和重新分布。所以我们希望在这两个极端情况下,找到一个点来获得合适的稳定性和均匀性。除了上面的两个基本目标外,工程中还需要从以下几个方面考虑数据分布算法的优劣:
-
性能扩展性:数据分布算法不应该在集群规模扩大后显著的增加运行时间。
-
节点异构性:不同存储节点(HDD、SSD、NVME)的性能和容