分布式路由算法
1、硬Hash算法:
即hash(routeKey)%dbSize,首先对路由Key进行Hash,然后对机器数量求余,这种分布式路由算法非常简单,同时也极其容易理解。
我们可以看一下MySQL分库分表中间件Shark的路由算法:
这种分布式路由算法尽管简单,但随着后续数据持续膨胀,一旦达到单表存储容量上线,我们仍然需要再次进行水平扩容,但这时的数据迁移成本就显得非常昂贵了。假设从32个库水平扩展到64个库(伸缩都如此),假设原routeKey是路由到第14个库上,现在却路由到了第45库上,采用硬Hash算法,严重依赖节点数量,基本上所有的数据都需要进行一次彻底的迁移,否则历史数据将无法成功命中。
2、预分桶算法:
预分桶算法介于硬Hash算法与一致性Hash算法之间,算是取得一个平衡(对于历史数据的迁
移而言,硬Hash算法是全迁移,而一致性Hash算法则是部分迁移),尽管牺牲了一定的灵活性,但是相较而言,数据的管理成本将会变得更低。因为硬Hash算法与强一致性Hash算法都是站在具体的数据维度上,而预分桶算法则是在数据被包裹的基础之上以slot为维度(尽管也是需要数据全部迁移,但只需要迁移上层的一段slot)。
redis docRedis3.x以上版本提供了cluster功能,实际上这却是一个服务端的sharding操作。一共划分了16384个slot,假设redis有3台集,那么理论上这16384个slot将会均匀分布给这3个节点,每个redis节点负责存储一段区间内的数据,通过阅读Jedis客户端源码,我们不难发现,在做数据路由的时候,采用的做法是:
只需要算出routeKey对应的slot是哪一个,即可知道对应的Redis节点是哪一个,并且16384个slot是一开始就固定的,不会因为节点的伸缩而变化,也就是说,某个key一开始路由到第2048slot上,那么它永远也只会路由到这个固定的slot上,当运维同学扩容节点时,把slot移走就行了,不需要关心那么多具体的数据应该怎么迁移。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。