一、Memcached集群介绍
1.自身通过算法保证数据唯一性
2.集群形式对用户和Memcached都是透明的
3.Memcached的集群是通过客户端实现的
4.Memcached服务端相互不认识
二、代码实现
我们开启两个Memcached,端口号分别为2222和6666
bin/memcached -d -u root -l 192.168.84.128 -p 2222 -c 128 -m 100 -P myPid
telnet 192.168.84.128 2222
bin/memcached -d -u root -l 192.168.84.128 -p 6666 -c 128 -m 100 -P myPid
telnet 192.168.84.128 6666
定义MemcachedClient,注意:中间用空格隔开
// 连接配置
MemcachedClientBuilder memcachedClientBuilder =
new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.84.128:2222 192.168.84.128:6666"));
演示集群操作:
@Test
public void cluTest() throws Exception{
MemcachedClient memcachedClient = ConnectonHelper.getClient();
memcachedClient.set("k1",0,"Hello zhangsan!!!");
String k1Value = memcachedClient.get("k1");
System.out.println("k1Value="+k1Value);
memcachedClient.set("k2",0,"Hello lisi!!!");
String k2Value = memcachedClient.get("k2");
System.out.println("k2Value="+k2Value);
}
k1和k2已经保存成功,但是具体存在那个memcached上,是由客户端内部的Hash算法计算的
下面分别连接两个memcached查看数据存储
端口为2222的memcached:
端口为6666的memcached:
三、Memcached常见分布式算法
1.余数Hash
- 将传入的key转换为Hash值
- 获取服务器数量列表
- 取余:Hash值%服务器数量
- 通过余数来选择具体存放/查询的服务器
优缺点:简便易理解、增加/减少节点会造成灾难
2.一致性Hash
- 将服务器列表+虚拟节点分布在0-2的32次方的一个圆上
- 将传入的key转换为Hash值
- 获取服务器数量列表
- 取余:Hash值%服务器数量
- 通过余数来选择具体存放/查询的服务器
- 如果余数命中虚拟节点,则会顺时针寻找真实Memcached服务
四、补充
Memcached的两段Hash:
- 客户端通过Hash算法寻找存储/查询节点
- 进入Memcached以后,通过Hash算法,寻找具体的Chunk