天天看点

Memcached客户端分布式代码实现一致性哈希算法XMemcached

目录

客户端分布

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机制
 
           

启动后日志如下: 

Memcached客户端分布式代码实现一致性哈希算法XMemcached

而后使用分布式进行存储数据和获取数据时 都会先经过一致性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);