記錄是一種精神,是加深理解最好的方式之一妹孙。
最近學(xué)習(xí)了下Redis秋柄,了解了下Redis HA的原理获枝,在這里把他記下來
曹金桂 cao_jingui@163.com(如有遺漏之處還請指教)
時間:2016年10月23日10:30
本文參考自《Redis Sentinel Documentation》
概述
Redis Sentinel是Redis官方推薦的高可用性(HA)解決方案蠢正,當(dāng)用Redis做Master-slave的高可用方案時,假如master宕機(jī)了省店,Redis本身(包括它的很多客戶端)都沒有實(shí)現(xiàn)自動進(jìn)行主備切換嚣崭,而Redis-sentinel本身也是一個獨(dú)立運(yùn)行的進(jìn)程,它能監(jiān)控多個master-slave集群懦傍,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自懂切換雹舀。
它的主要功能有以下幾點(diǎn)
- 不時地監(jiān)控redis是否按照預(yù)期良好地運(yùn)行;
- 如果發(fā)現(xiàn)某個redis節(jié)點(diǎn)運(yùn)行出現(xiàn)狀況,能夠通知另外一個進(jìn)程(例如它的客戶端);
- 能夠進(jìn)行自動切換粗俱。當(dāng)一個master節(jié)點(diǎn)不可用時说榆,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節(jié)點(diǎn)會將它所追隨的master的地址改為被提升為master的slave的新地址。
Sentinel支持集群
很顯然寸认,只使用單個sentinel進(jìn)程來監(jiān)控redis集群是不可靠的签财,當(dāng)sentinel進(jìn)程宕掉后(sentinel本身也有單點(diǎn)問題,single-point-of-failure)整個集群系統(tǒng)將無法按照預(yù)期的方式運(yùn)行偏塞。所以有必要將sentinel集群唱蒸,這樣有幾個好處:
- 即使有一些sentinel進(jìn)程宕掉了,依然可以進(jìn)行redis集群的主備切換灸叼;
- 如果只有一個sentinel進(jìn)程神汹,如果這個進(jìn)程運(yùn)行出錯,或者是網(wǎng)絡(luò)堵塞古今,那么將無法實(shí)現(xiàn)redis集群的主備切換(單點(diǎn)問題);
- 如果有多個sentinel屁魏,redis的客戶端可以隨意地連接任意一個sentinel來獲得關(guān)于redis集群中的信息。
Redis Replication
Redis-Sentinel是基于Redis的主從的捉腥,所以我們先看下Redis Replication氓拼。
- 一個master可以有多個slave
- Slave也可以有自己的slave,即級聯(lián)
- Master不受任何slave同步影響但狭,但slave端在第一次執(zhí)行同步時會阻塞讀
- 多個slave可以分擔(dān)讀壓力
- 可以用replication代替快照進(jìn)程(saving)披诗,利用replication的實(shí)時同步來災(zāi)備數(shù)據(jù)
Redis Replication配置也十分的簡單,只要在從服務(wù)上配置slaveof <master-ip> <master-port>即可立磁。主從配置成功后呈队,默認(rèn)從服務(wù)器只讀(當(dāng)然可以配置修改),當(dāng)我們在master上寫入數(shù)據(jù)唱歧,相應(yīng)地slave中也同步過來了宪摧。
竟然Redis有主從備份了粒竖,為什么還需要Redis Sentinel呢。我們知道几于,主從下蕊苗,如果Master服務(wù)宕機(jī)了,數(shù)據(jù)在從服務(wù)器上都存在沿彭,數(shù)據(jù)不會丟失朽砰。這個時候,我們的應(yīng)用服務(wù)鏈接的都是Master服務(wù)喉刘,應(yīng)用沒法動態(tài)切換到從服務(wù)器上去瞧柔,導(dǎo)致我們的應(yīng)用還是會訪問Redis異常。
Redis Sentinel
Redis-Sentinel是怎么做到高可用性(HA)的呢睦裳,我們先看下圖造锅。
Sentinel其實(shí)就是Client和Redis之間的橋梁,所有的客戶端都通過Sentinel程序獲取Redis的Master服務(wù)廉邑。首先Sentinel是集群部署的哥蔚,Client可以鏈接任何一個Sentinel服務(wù)所獲的結(jié)果都是一致的。其次蛛蒙,所有的Sentinel服務(wù)都會對Redis的主從服務(wù)進(jìn)行監(jiān)控糙箍,當(dāng)監(jiān)控到Master服務(wù)無響應(yīng)的時候,Sentinel內(nèi)部進(jìn)行仲裁宇驾,從所有的 Slave選舉出一個做為新的Master倍靡。并且把其他的slave作為新的Master的Slave。最后通知所有的客戶端新的Master服務(wù)地址课舍。如果舊的Master服務(wù)地址重新啟動塌西,這個時候,它將被設(shè)置為Slave服務(wù)筝尾。
Redis Sentinel配置使用
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
我們看到捡需,Redis-sentinel的配置相當(dāng)簡單,只要指定Master服務(wù)的ip和端口及其他timeout參數(shù)設(shè)置即可筹淫。相關(guān)配置的解釋這里就不說了站辉,在官方sentinel.conf文件中對每一個配置項都說明的很詳細(xì)(我不覺得我能解釋的比它更好)。
雖然sentinel集群中各個sentinel都互相連接彼此來檢查對方的可用性以及互相發(fā)送消息损姜。但是你不用在任何一個sentinel配置任何其它的sentinel的節(jié)點(diǎn)饰剥。因為sentinel利用了master的發(fā)布/訂閱機(jī)制去自動發(fā)現(xiàn)其它也監(jiān)控了統(tǒng)一master的sentinel節(jié)點(diǎn)。同樣摧阅,你也不需要在sentinel中配置某個master的所有slave的地址汰蓉,sentinel會通過詢問master來得到這些slave的地址的。
使用示例
這里我簡單的采用一個Master和一個Slave的Redis服務(wù)來進(jìn)行示例棒卷,相關(guān)配置如圖顾孽。
- 先保證我們的主從服務(wù)沒有問題祝钢,在Master寫的時候,Slave中能夠同步的有數(shù)據(jù)若厚。
- 使用#redis-cli -h 192.168.2.133 -p 26379連接Redis-Sentinel服務(wù)拦英,使用#info信息查看Sentinel服務(wù)信息: master0:name=mymaster,status=ok,address=192.168.2.133:6379,slaves=1,sentinels=2。我們看到Sentinel服務(wù)中得到了Master服務(wù)地址测秸。
- 手動將Redis的Master服務(wù)停止掉(shutdown)疤估。
- 查看Redis-sentinel服務(wù)信息:master0:name=mymaster,status=ok,address=192.168.2.128:6379,slaves=1,sentinels=2。128服務(wù)器上的Redis服務(wù)提升為Master乞封。
- 重新啟動133服務(wù)器上的Redis服務(wù)做裙,用info查看Redis的角色為slave岗憋。
小結(jié)
在Redis支持集群(3.0)之前肃晚,官方推薦高可用解決方案為Redis-sentinel,使用起來也比較簡單仔戈。在生產(chǎn)環(huán)境中也很穩(wěn)定关串。本篇文章沒有對Redis-sentinel的配置項進(jìn)行說明,相關(guān)說明在Redis官方源碼中提供的示例配置對每一個配置解釋的十分詳細(xì)监徘,大家可以參考晋修。當(dāng)然,如果有配置上的問題我很樂意為您服務(wù)(只要我會的)凰盔。