企業級Redis資料庫高可用解決方案

企業級Redis資料庫高可用解決方案

 

背景:

最近比較火的Redis非關係資料,可基於記憶體亦可持久化的日誌型、Key-Value資料庫。由於伺服器的記憶體管理能力有限,使用過大記憶體的Redis又會使得伺服器的效能急劇下降,一旦伺服器發生故障將會影響更大範圍業務,叢集功能還不適合生產環境的使用叢集中超過半數的節點檢測失效導致整個叢集異常。

在實際特定的應用場景通過Redis的特性提高效率,那麼效率與可考性應該如何來取捨。生產企業中大家更多的考慮可靠性,在次考慮效率。本文主要還是關注他的可靠性。

一、   Redis叢集主備模式

master 接到指令後,開始啟動後臺儲存程序儲存資料,接著收集所有的資料修改指令。後臺儲存完了,master 就把這份資料傳送給 slave,slave 先把資料儲存到磁碟,然後把它載入到記憶體中,master 接著就把收集的資料修改指令一行一行的發給 slave,slave 接收到之後重新執行該指令,這樣就實現了資料同步

1、     redis 使用非同步複製

2、     一個 master 可以擁有多個 slave

3、      slave 可以接收來自其他 slave 的連線。意思是不是就是說 slave 在接收其他的slave的連線之後成為 master

4、     複製在 master 這一端是非阻塞的,也就是說在和 slave 同步資料的時候,master 仍然可以執行客戶端的操作命令而不受其影響

 

二、    Redis cluster

Redis cluster架構如下圖所示

 

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

2、redis-cluster選舉:容錯

(1)領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.

(2):什麼時候整個叢集不可用(cluster_state:fail),當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN Thecluster is down)錯誤

   a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成進群的slot對映[0-16383]不完成時進入fail狀態.

   b:如果進群超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

 

、    如何解決redis的高可靠性

1、     Twemproxy

Twemproxy是一個使用C語言編寫、以代理的方式實現的、輕量級的Redis代理伺服器,它通過引入一個代理層,將應用程式後端的多臺Redis例項進行統一管理,使應用程式只需要在 Twemproxy上進行操作,而不用關心後面具體有多少個真實的Redis或Memcached例項,從而實現了基於Redis和Memcached的
叢集服務。當某個節點宕掉時,Twemproxy可以自動將它從叢集中剔除,而當它恢復服務時,Twemproxy也會自動連線。由於是代理,所以 Twemproxy會有微小的效能損失。

Twemproxy架構如下圖所示:

 

 

2、 Codis

Codis 是一個分散式
Redis
解決方案, 對於上層的應用來說, 連線到Codis Proxy 和連線原生的 Redis Server 沒有明顯的區別 (不支援的命令列表), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的資料遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為後邊連線的是一個記憶體無限大的 Redis 服務

Codis主要包含Codis Proxy(codis-proxy)、Codis Manager(codis-config)、Codis Redis(codis-server)和ZooKeeper四大元件,每個部分都可動態擴容。

codis-proxy :客戶端連線的Redis代理服務,本身實現了Redis協議,表現很像原生的Redis (就像 Twemproxy)。一個業務可以部署多個 codis-proxy,其本身是無狀態的。

codis-config:Codis 的管理工具,支援新增/刪除Redis節點、新增/刪除Proxy節點、發起資料遷移等操作。codis-config自帶了一個http server,會啟動一個dashboard,使用者可以在瀏覽器上觀察 Codis 叢集的執行狀態。

codis-server:Codis 專案維護的一個Redis分支,加入了slot的支援和原子的資料遷移指令。

ZooKeeper:Codis依賴ZooKeeper來存放資料路由表和codis-proxy節點的元資訊,codis-config發起的命令會通過 ZooKeeper同步到各個存活的codis-proxy。

 

四、   結語

無論你使用什麼方案最終都要同實際業務相結合,離開生產中的業務這些都沒有實際意義。企業同網際網路公司越走越近,將原本封閉的業務對外開放,將迎來突發性強、高併發、高可靠的業務效能需求,對於傳統架構的挑戰及變革。一場新的技術革命早已悄然開始。

日期:2016-06-19

預告下篇:關於Oracle Coherence效能分析