如何优雅扩缩容,一致性哈希算法

2022-07-12 13:18:18 浏览数 (1)

- 背景 -

当前后台微服务架构盛极一时,docker技术日趋成熟,二者如同伯牙子期的相遇,天作之合。而服务容器化在任何业务背景下都会遇到动态扩缩容,随着业务的访问量级波动,容器资源的自动化增加和回收可以为运维减少压力。

此外,在扩缩容前后,都需要负载均衡来维持各节点上的负载压力,从而使得扩缩容变得更加“优雅”。负载均衡技术中常用的算法模型就会涉及到一致性哈希算法。

- 求余哈希算法 -

服务集群中每个节点都有个“哈希地址”作为唯一标识,其计算公式简写如下:

add = hash(object) mod Nadd=hash(object)modN

当发生扩缩容导致增加或减少一个节点时,剩余节点的地址映射都会发生改变

add = hash(object) mod (N±1)add=hash(object)mod(N±1)

进而导致所有节点的数据需要迁移,代价太大

- 一致性哈希算法 -

一致性哈希将哈希值空间设计成“环状”,值域为[0,2^32-1],定义域可以使用节点的IP或主机名来计算。

假设我们有3个节点和4个数据,其地址在哈希值空间的分布如下:

按照一致性哈希算法,每个数据按顺时针方向,绑定到距离它最近的节点,例如数据A绑定01节点,数据D绑定02节点,数据B、C绑定03节点。

假设03节点被缩减掉,数据B和C就需要绑定到01节点,其余数据和节点不需要迁移。

假设增加一个节点04,如下图,按照一致性哈希算法,只需要将数据B重新迁移到节点04即可。

- 总结 -

一致性哈希算法,因为其特殊的数据结构和数据绑定算法,使得在节点增加和减少时,可发生的数据迁移量大大减少,数据迁移减少,带来的应用价值就是减少动态扩缩容的时间。

目前市面上“秒级”的扩缩容产品非常少,大部分都在“分钟级”,当扩缩容反应越灵敏,在业务运营大型活动时,发生服务宕机或者雪崩的概率就会大大降低!

0 人点赞