一、Memcached分布式示例
Memcached之间互不通信互不干扰,一切完全由XMemcached进行调用存储。
二、Memcached分布式原理
- Memcached的分布式很特殊:客户端分布式
- Memcached每一个服务器端都不相互通信
- Memcached客户端通过算法保证数据的唯一性
三、常见的分布式算法
余数Hash算法:
- 过程
- 将传入的key转换为Hash值
- 获取服务器数量列表
- Hash值%服务器数量
- 通过余数来选择具体存放或查询的服务器
- 优缺点
- 简便易理解
- 增加/减少节点,会造成服务端“灾难”
一致性Hash算法:
- 注意:图中的大圈表示真实的节点(即真实存放数据的Memcached),小圈代表虚拟节点
- 过程:
- 将服务器列表+虚拟节点分布在0-2的32次方的一个圆上
- 将传入的key转换为Hash值
- Hash值%服务器数量
- 通过余数来选择具体存放/查询的服务器
- 如果余数命中真实节点则直接存放,如果命中虚拟节点则顺指针寻找真实的Memcached服务存放
- 优点:如图所示,当有新的服务器加入时,对其他的节点影响极小
- 面试题(Memcached的两段式Hash)
- 客户端通过Hash算法寻找存储/查询节点
- 寻找到具体的Memcached后通过Hash算法寻找具体的Chunk
四、Memcached集群
- 自身通过算法保障数据的一致性
- 集群形式对用户和Memcached都是透明的(即不可知的)
- Memcached的集群是通过客户端实现的
- Memcached服务端相互不认识
搭建方法:
- 在服务端开启多个Memcached进程
- 代码中加入对应的IP地址和端口号即可:
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.1.27:5555 192.168.1.27:6666"));