基於twemproxy和vip實現redis集群的無感知彈性擴容
阿新 • • 發佈:2017-10-30
一個 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集群的無感知彈性擴容