Redis集群管理工具Redis-sentinel原理分析
Redis-sentinel是Redis實例的監(jiān)控管理、通知和實例失效備援服務(wù),是Redis集群的管理工具。在一般的分布式中心節(jié)點數(shù)據(jù)庫中,Redis-sentinel的作用是中心節(jié)點的工作,監(jiān)控各個其他節(jié)點的工作情況并且進(jìn)行故障恢復(fù),來提高集群的高可用性。
Redis-sentinel是Redis的作者antirez在今年6月份完成的,因為Redis實例在各個大公司的應(yīng)用,每個公司都需要一個Redis集群的管理工具,被迫都自己寫管理工具來管理Redis集群,antirez考慮到社區(qū)的急迫需要,花了幾個星期寫出了Redis-sentinel。
Redis-sentinel的三大功能:監(jiān)測、通知、自動故障恢復(fù)。首先Redis-sentinel要建立一個監(jiān)控的master列表,然后針對master列表的每個master獲取監(jiān)控其的sentinels和slaves供以后故障恢復(fù)使用。
自動發(fā)現(xiàn)sentinel和slave
一個sentinel實例的監(jiān)控master在配置文件中指定,如sentinel A在配置文件中指定管理的master ip:port列表,并且指定連接失敗超時的時間和是否可以故障恢復(fù)等參數(shù)。這樣,sentinel A就建立了監(jiān)控的master列表。
sentinel A作為客戶端建立對其監(jiān)控master 1的pub/sub連接和命令傳輸連接,pub/sub連接的目的是通過消息傳遞來獲取監(jiān)控master 1的所有sentinels,具體方式是訂閱”sentinel:hello”頻道,并這個頻道publish 自己的host信息,這樣,所有監(jiān)控master 1的sentinels都通過訂閱master 1的“sentinel:hello”頻道來獲取其他sentinels的信息。sentinel A就建立了master 1的sentinels列表。 sentinel A還通過間斷的info命令獲取master 1的slaves列表,如果連接超時或者失敗,就會進(jìn)入故障處理的例程。
故障恢復(fù)準(zhǔn)備
Redis-sentinel定義了故障的master兩種狀態(tài),O_DOWN(objectively)和S_DOWN(subobjectively)。當(dāng)sentinel A連接master 1失敗后,sentinel A認(rèn)定master 1為subobjectively狀態(tài),然后sentinel A查看監(jiān)控master 1的sentinels的認(rèn)定情況。因為sentinel之間會建立連接并且不斷的發(fā)起info命令詢問和回應(yīng),因此在sentinel A認(rèn)定master 1 S_DOWN后,sentinel A通過SENTINEL IS-MASTER-DOWN-BY-ADDR命令來不斷獲得其他sentinel的認(rèn)定情況,如果有超過quorum(配置中指定)個sentinel認(rèn)定master 1已經(jīng)DOWN,那么就確定master 1為O_DOWN。然后sentinel A必須有master 1的can failover權(quán)限,這也是配置文件指定的。接著,sentinel A需要得知master 1的leader sentinel,由leader來進(jìn)行master 1的錯誤恢復(fù)。
master 1的leader sentinel由選舉產(chǎn)生,每個監(jiān)控master 1的,并且具有錯誤恢復(fù)權(quán)限的sentinel都需要進(jìn)行一次叫做subjective leader判斷,也就是sentinel自己認(rèn)定的leader,然后sentinel之間通過SENTINEL IS-MASTER-DOWN-BY-ADDR命令交流leader的認(rèn)定情況,然后最終得到一個共識。
然后由這個master 1的leader sentinel來啟動錯誤恢復(fù)例程。
故障處理
sentinel A作為master 1的leader,會選取一個master 1的slave作為新的master。slave的選取是根據(jù)一個判斷DNS情況的優(yōu)先級來得到,優(yōu)先級相同通過runid的排序得到,但目前優(yōu)先級設(shè)定還沒實現(xiàn),所以直接獲取runid排序得到slave 1。
然后發(fā)送命令slaveof no one來取消slave 1的slave狀態(tài)來轉(zhuǎn)換為master。當(dāng)其他sentinel觀察到該slave成為master后,就知道錯誤處理例程啟動了。sentinel A然后發(fā)送給其他slave slaveof new-slave-ip-port 命令,當(dāng)所有slave都配置完后,sentinel A從監(jiān)測的masters列表中刪除故障master,然后通知其他sentinels。
總結(jié)
Redis-sentinel作為一個集群管理工具,基本滿足了要求。但是Redis集群的需求卻仍然存在。Redis集群作為分區(qū)結(jié)果,分區(qū)的配置仍然需要客戶端或者代理協(xié)議實現(xiàn),Redis集群作為一個整體還需要更長的路。Redis-cluster的草案早于出爐,但是實現(xiàn)卻已經(jīng)停留了很久。antriez承諾在Redis 3.0推出Redis-cluster功能。