简述
普通的哈希分库方式:
hash(id) mod 数据库总数 = 目标数据库编号
普通哈希分库做法
这种传统的分库分表方式会遇到一个扩容问题:
若要增加数据库数量,所有数据库中的数据都要重新分配一遍。
例如本来系统有4台数据库, 现在要增加到5台数据库,这样本来id%4=0,存到第0台数据库的数据,现在全变成id%5=4,存到第4台数据库。
为了解决这个扩容问题,引入了一种在扩容操作上成本更低,灵活度更高的算法
一致性哈希分库方式:
# 假设哈希空间为2^32个
hash(id) mod 2^32 = 哈希位置
选择右边最接近自己哈希位置的一台数据库
一致性哈希分配方法
原理解释
数据库标识
传统哈希分库中,数据库的标识是一个编号,预先分配好。
而一致性哈希中,数据库的标识是一个哈希值,落到图中某个具体哈希地址中。
DBhash = hash( 数据库实体信息 )
ID定位
传统哈希分库中,计算 hash(id) 后就能定位ID到具体的数据库中
而一致性哈希中,计算 hash(id) 后,再计算出hash(id)在哈希空间中的右边第一台遇到的数据库,即为目标数据库
优势
扩容
传统哈希分库扩容,需要对数据进行全部重新分配
一致性哈希分库扩容,只需要对新增的数据库与其在哈希空间的前一台数据库之间的哈希数据进行重新分配。不影响其他数据
扩展阅读
1、可用性
2、虚拟节点
网友评论