目录
客户端分布
XMemcached客户端分布
分布式application.yml配置
设置节点权重
动态添加/删除节点
主辅模式
客户端分布
Memcached的分布是通过客户端实现的,客户端根据key的哈希值得到将要存储的memcached节点,并将对应的value存储到相应的节点。
XMemcached客户端分布
不同的客户端有着不同的分布式实现方式 , 这里我们使用XMemcached.
XMemcached同样支持客户端的分布策略,默认分布的策略是按照key的哈希值模以连接数得到的余数,对应的连接就是将要存储的节点。如果使用默认的分布策略,你不需要做任何配置或者编程。
XMemcached同样也支持一致性哈希(consistent hash),可以通过在设置客户端的时候直接指定:
详细的Springconfig配置可以参考 https://blog.csdn.net/qq_42543063/article/details/115548208 或者 Memcached集成Springboot以及常规操作
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(iMemcachedProperties.getServers()));
// 指定使用一致性哈希算法
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
memcachedClient = builder.build();
XMemcached还提供了额外的一种哈希算法——选举散列,在某些场景下可以替代一致性哈希
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(iMemcachedProperties.getServers()));
// 指定使用选举散列算法
builder.setSessionLocator(new ElectionMemcachedSessionLocator());
memcachedClient = builder.build();
分布式application.yml配置
spring:
memcache:
# 服务地址 , 分布式地址使用空格间隔即可
servers: 127.0.0.1:11211 127.0.0.1:11211
# 连接数量
poolSize: 10
# 操作超时时长
opTimeout: 5000
sanitizeKeys: false # 是否启用url encode机制
启动后日志如下:
而后使用分布式进行存储数据和获取数据时 都会先经过一致性hash算法 指定某个服务来进行本次操作
设置节点权重
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses(iMemcachedProperties.getServers() ),
new int[]{1,3}
);
传入一个int数组,里面的元素就是节点对应的权重值,比如这里设置"localhost:12000"节点的权重为1,而"localhost:12001"的权重为3。注意,xmemcached的权重是通过复制连接的多个引用来实现的,比如权重为3,那么就复制3个同一个连接的引用放在集合中让MemcachedSessionLocator查找。
动态添加/删除节点
在JMX支持一节提到的JMX方式操作外,还可以通过编程方式:
MemcachedClient client=new XMemcachedClient(AddrUtil.getAddresses(iMemcachedProperties.getServers()));
//Add two new memcached nodes
client.addServer("server3:11211 server4:11211");
//Remove memcached servers
client.removeServer("server1:11211 server2:11211");
主辅模式
你可以设置一个memcached的节点的备份节点,当主节点down掉的情况下,会将本来应该发往主节点的请求转发给standby备份节点。使用备份节点的前提是启用failure模式。
MemcachedClient builder=new XmemcachedClientBuilder(AddrUtil.getAddressMap("localhost:11211,localhost:11212 host2:11211,host2:11212"));
上面的例子,将localhost:11211的备份节点设置为localhost:11212,而将host2:11211的备份节点设置为host2:11212
形如“host:port,host:port"的字符串也可以使用在spring配置中,完全兼容1.3之前的格式。
启用faikure模式
// 获取连接
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(iMemcachedProperties.getServers()));
// 从1.3版本开始,xmemcached支持failure模式。所谓failure模式是指,当一个memcached节点down掉的时候,发往这个节点的请求将直接失败,而不是发送给下一个有效的memcached节点 , 默认不启用failure模式
builder.setFailureMode(false);