天天看點

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);