1. 程式人生 > >基於twemproxy和vip實現redis集群的無感知彈性擴容

基於twemproxy和vip實現redis集群的無感知彈性擴容

一個 buffer png 循環 不變 設置 key 測試 redis集群

目標是實現redis集群的無感知彈性擴容

關鍵點

1.是無感知,即對redis集群的用戶來說服務ip和port保持不變

2.彈性擴容,指的是在需要時刻可以按照業務擴大redis存儲容量。

1.業務場景

  • 1.redis集群某個業務容量不足,需要擴容
  • 2.redis集群需要一個為一個新業務分配存儲容量
  • 3.redis集群在擴容的時候服務不是停止的,而是服務中,即無感知

最好的解決方式

對客戶端無感知,即客戶端不需要任何操作就實現了redis集群的擴容

2.最樸素的twemproxy+redis集群架構

技術分享

其中twemproxy-A代理後面接了3個redis實例,作為集群使用,如果1個redis示例有10G存儲能力,

那麽目前這個架構具有10G*3=30G的存儲能力,其中根據twemproxy的配置來實現負載均衡。

3.最直接的擴容方案:

技術分享

這個方案擴容是最直接的,即在代理後面直接新加一個redis-4,來擴充這個redis集群的容量。

這種方式最直接,但是問題也比較大,主要有2個:

  • 1.後端新增一個redis實例之後,雖然有一致性hash保證大部分數據還會走原先的路由,
  • 但仍有小部分舊的數據會被路由到新的redis-4中,即丟失一小部分舊的數據
  • 2.擴容效果不理想,一開始時,redis-4的已用存儲是0,理想最好的方式是舊的數據還走之前的路由
  • ,新的數據路由到redis-4中

為了解決上述方案的不足,本文提出了一個新的方案如下

4.一個twemproxy二級代理的方案:

技術分享

這個方案有1個關鍵點,即怎麽實現舊的數據走之前的路由,新的數據走redis-4的路由,這就用到了

hash_tag的預分配(即提前占坑的思想)技術,使用hash_tag作為二級twemproxy的路由標示,具體操作如下:

  • 1.twemproxy-C的hash_tag 設置為(),twemproxy-A和twemproxy-B的hash_tag設置為{}
  • 2.插入形如key_(0)_{1},key_(1)_{1}的2個key,假設key_(0)_{1}路由到了twemproxy-A,key_(1)_{1}路由到了twemproxy-B
  • 3.那麽舊的服務插入數據的標示就是key_(0)_{xxxx},新的數據插入的標示就是key_(1)_{xxxx}

註意點如下:

  • 1.一開始可以預先分配多一些二級代理,以備不時只需
  • 2.一開始需要測試清楚,哪些()標示走哪些對應的二級代理。

好處:

  • 1.自動的完成了舊的數據走舊路由,新的數據走新路由
  • 2.新的數據也可以如圖與之前的業務數據存儲完全隔離
  • 3.新的路由還可以復用之前的存儲,即redis-1到redis-3的存儲

5.最終真正實現無感知彈性擴容方案

如圖4所示:

技術分享

最終的方案新增了一個VIP,用這個VIP來解決無感知的問題,即擴容對客戶端來說是無感知的。

無感知的解決類似”雙buffer交換“的思路,即上圖的twemproxy-C和twemproxy-D,當需要重啟twemproxy代理時,

可以進行如下操作:

  • 1.現假設vip只訪問到twemproxy-C
  • 2.更改twemproxy-D使用最新的配置,重啟
  • 3.vip切換服務到只訪問twemproxy-D

當還需要重啟代理時,以此循環。

基於twemproxy和vip實現redis集群的無感知彈性擴容