分布式缓存集群的伸缩性设计
Memcached 分布式缓存集群的访问模型
数据缓存流程;
1 应用程序调用缓存Memcached的API接口
2 API将需要写缓存的数据KEY输入路由算法模块,路由算法根据KEY和Memcached集群服务器列表计算得到一台服务编号(Node1),进而得到该机器的IP地址和端口号
3 API调用Memcached客户端程序(通信模块)和NODE1服务器通信,将数据写入服务器
Memcached 分布式缓存集群的伸缩性挑战
路由算法决定究竟该访问集群中的哪台服务器。
简单的路由算法 余数HASH:
实现方式:
用服务器数目除以缓存数据KEY的HASH值,余数为服务器列表下标编号即对应节点NODE1。
优点:
由于HASHCode具有随机性因此可以保证相对比较均衡
缺点:
分布式缓存需要扩容的时候,事情就变得棘手
当三台服务器扩容至4台服务器大约75%被缓存的不能命中 ,当100台服务器,加入一台,不能命中的概率99%
可解决方法
1 在网站访问量少的时候,扩容缓存服务器集群,这时候数据库的负载冲击最小,
然后通过模拟请求的方法,逐渐缓存预热,使缓存服务器中的数据重新分布;
2 改变HASH路由算法:分布式缓存的一致性HASH算法
分布式缓存的一致性HASH算法
具体算法过程:
先够着一个0-2的32次方的整数环(这个环被称作一致性HASH环),根据节点设定的的Hash值,将缓存服务器节点放置在这个HASH环上,然后根据需要缓存的数据的key值计算得到HASH值,
然后在HASH环上顺势针找距离这个key的HASH值最近的服务器节点,完成key到服务器的HASH映射查找。
优点:
影响缓存节点少,保证大部分节点的缓存可以被命中,比例足够小,不会对数据库的获取造成致命的压力;
缺点:
节点的缓存数据量和负载压力,新加的节点和最近受影响的节点 相对其他的负载压力和数据量相比较小,性能分配不均;
hash区段分配不均匀;
可解决方法
增加虚拟节点,进行均分截断平衡hash区段;