关于一致性Hash的一些思考

之前在网上见过一个算法,发现了一些问题,这里进行一下记录。

核心算法亮点是对槽位节点Hash之后,使用MD5打散,对于标志节点使用虚节点。

经过使用后发现,对于槽位数据进行Hash打散后,是可以做到在环上进行较为均匀的分布的,这主要依赖于使用的MD5算法能够比较随机的分布。虚节点的引入,很好的解决了因在换上分布不均匀而导致的每个标志节点占据环空间大小不一样导致的问题。这个思路既解决了普通Hash导致的数据数量变化导致的数据迁移问题,也解决了一致性Hash的标志节点分布不均匀的问题。

但是因为引入了虚节点,本质上是通过增加了标志节点的数量去弥补环上空间占据过多的情况,这种策略增加了存取虚节点所需要的空间。

这里可以采用线性分布策略,将环上空间均匀映射到一个线性空间中,以保证分布均匀性,这种策略是在OpenStack的Swift组件中所使用的策略。

根据测试,对于节点的移动操作有增加,这主要是因为测试时线性空间分区较少,对比虚节点策略来说,增加节点时,移动数据量剧增,但尚属可以接受的范围内,在标志节点较多时,因为分区数量变多,对应的标志节点占用环空间变少,性能会提升,所以在性能要求不是很高,或是起始映射较多时,是一种不错的策略选择。

你可能感兴趣的:(关于一致性Hash的一些思考)