1.最简单的方式, hash取模
取模是在分布式算法里面最常用到, 用在cache上,也很常见, 不过取模方式最大的问题,就是在扩容或者一台机器下线的时候, 对命中率影响非常大, 再大型网站里是不被允许的, cache不能挡住98%以上的流量,冲击到db, db根本挡住大流量的冲击
2. consistent hashing
该算法最大好处,是在新增机器和下线机器的时候,只会对附近的节点产生影响。 但在高压力下,如果突然有台机器坏掉
那它附近的机器,就会承担2倍的压力, 这很容易出现雪崩效应,导致环里面的每个节点都垮掉
3. consistent hashing 的基础上增加虚拟节点,会有个目录表
node | ip |
1 | 192.168.1.1 |
2 | 192.168.1.2 |
3 | 192.168.1.1 |
4 | 192.168.1.2 |
如上,把一台机器虚拟成多个节点,然后错开放置, 这样能极大的避免雪崩效应的产生。
4. 固定hash
固定hash算法很落后,但在特定的场景下,是非常给力的,就看你如何选择。 如果你要经常扩容并对数据的命中率不是太敏感,那你可以用1,2,3方式, 如果你对数据的命中率要求非常高,就算10台里面挂了一台,也不想影响其他机器,
那就可以使用固定hash, 固定hash的容灾怎么做? 可以使用2套机房互备, 一套的其中一台挂了,自动访问到另一套的对应一台, 除非对应的2台都挂了,才会出现问题。
但固定hash的扩容比较麻烦,在扩容的时候只能杯具一下了,不过这种扩容估计也就2年/次的成本,就看你如何选择了