Redis入門指南之哨兵
Redis復(fù)制的原理和使用方式,在一主多從的Redis系統(tǒng)中,從數(shù)據(jù)庫(kù)在整個(gè)系統(tǒng)中起到了數(shù)據(jù)冗余備份和讀寫分離的作用。
當(dāng)主數(shù)據(jù)庫(kù)遇到異常中斷服務(wù)后,開發(fā)者可以通過手動(dòng)的方式選擇一個(gè)從數(shù)據(jù)庫(kù)來升格為主數(shù)據(jù)庫(kù),以使得系統(tǒng)能夠繼續(xù)提供服務(wù)。然而整個(gè)過程相對(duì)麻煩且需要人工介入。 為此,Redis 2.8中提供了哨兵工具來實(shí)現(xiàn)自動(dòng)化的系統(tǒng)監(jiān)控和故障恢復(fù)功能。
哨兵的作用就是監(jiān)控Redis系統(tǒng)的運(yùn)行狀況。它的功能包括以下兩個(gè)。
1.監(jiān)控主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是否正常運(yùn)行。?
2.主數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí)自動(dòng)將從數(shù)據(jù)庫(kù)轉(zhuǎn)換為主數(shù)據(jù)庫(kù)。
在一主多從的Redis系統(tǒng)中,可以使用多個(gè)哨兵進(jìn)行監(jiān)控任務(wù)以保證系統(tǒng)足夠穩(wěn)健,此時(shí)不僅哨兵會(huì)同時(shí)監(jiān)控主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù),哨兵之間也會(huì)互相監(jiān)控。
配置哨兵
[root@TA30-53?redis_master]#?vi?sentinel.conf
sentinel?monitor?mymaster?127.0.0.1?6379?2 sentinel?auth-pass?mymaster?123456
其中mymaster表示要監(jiān)控的主數(shù)據(jù)庫(kù)的名字,可以自定義。這個(gè)名字必須僅由大小寫字母、數(shù)字和“.-_”這 3 個(gè)字符組成。
后兩個(gè)參數(shù)表示主數(shù)據(jù)庫(kù)的地址和端口。
最后的1表示最低通過票數(shù)。
接下來執(zhí)行來啟動(dòng)Sentinel進(jìn)程,并將上述配置文件的路徑傳遞給哨兵:
[root@TA30-53?local]#?cd?redis_master/src/ [root@TA30-53?src]#?./redis-sentinel?../sentinel.conf
?配置哨兵監(jiān)控一個(gè)系統(tǒng)時(shí),只需要配置其監(jiān)控主數(shù)據(jù)庫(kù)即可,哨兵會(huì)自動(dòng)發(fā)現(xiàn)所有復(fù)制該主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)。?
啟動(dòng)哨兵后,哨兵輸出如下內(nèi)容:
[root@TA30-53?redis_master]#?./src/redis-sentinel?./sentinel.conf?? 30327:X?26?Jun?16:49:08.340?*?Increased?maximum?number?of?open?files?to?10032?(it?was?originally?set?to?1024). ????????????????_._?????????????????????????????????????????????????? ???????????_.-``__?''-._????????????????????????????????????????????? ??????_.-``????`.??`_.??''-._???????????Redis?3.0.7?(00000000/0)?64?bit ??.-``?.-```.??```/????_.,_?''-._??????????????????????????????????? ?(????'??????,???????.-`??|?`,????)?????Running?in?sentinel?mode ?|`-._`-...-`?__...-.``-._|'`?_.-'|?????Port:?26379 ?|????`-._???`._????/?????_.-'????|?????PID:?30327 ??`-._????`-._??`-./??_.-'????_.-'??????????????????????????????????? ?|`-._`-._????`-.__.-'????_.-'_.-'|?????????????????????????????????? ?|????`-._`-._????????_.-'_.-'????|???????????http://redis.io???????? ??`-._????`-._`-.__.-'_.-'????_.-'??????????????????????????????????? ?|`-._`-._????`-.__.-'????_.-'_.-'|?????????????????????????????????? ?|????`-._`-._????????_.-'_.-'????|?????????????????????????????????? ??`-._????`-._`-.__.-'_.-'????_.-'??????????????????????????????????? ??????`-._????`-.__.-'????_.-'??????????????????????????????????????? ??????????`-._????????_.-'??????????????????????????????????????????? ??????????????`-.__.-'??????????????????????????????????????????????? 30327:X?26?Jun?16:49:08.342?#?WARNING:?The?TCP?backlog?setting?of?511?cannot?be?enforced?because?/proc/sys/net/core/somaxconn?is?set?to?the?lower?value?of?128. 30327:X?26?Jun?16:49:08.342?#?Sentinel?runid?is?9bcfa5e06a5218120fb698fb41fce1cc7dc41251 30327:X?26?Jun?16:49:08.342?#?+monitor?master?mymaster?127.0.0.1?6379?quorum?1 30327:X?26?Jun?16:49:08.353?*?+slave?slave?127.0.0.1:6380?127.0.0.1?6380?@?mymaster?127.0.0.1?6379 30327:X?26?Jun?16:49:08.354?*?+slave?slave?127.0.0.1:6381?127.0.0.1?6381?@?mymaster?127.0.0.1?6379
其中+slave 表示新發(fā)現(xiàn)了從數(shù)據(jù)庫(kù)。
現(xiàn)在哨兵已經(jīng)在監(jiān)控這3個(gè)Redis實(shí)例了,這時(shí)我們將主數(shù)據(jù)庫(kù)(即運(yùn)行在6379端口上的Redis實(shí)例)關(guān)閉,等待指定時(shí)間后(可以配置,默認(rèn)為 30 秒),哨兵會(huì)輸出如下內(nèi)容:
30553:X?26?Jun?16:58:52.100?#?+sdown?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.100?#?+odown?master?mymaster?127.0.0.1?6379?#quorum?1/1
+sdown表示哨兵主觀認(rèn)為主數(shù)據(jù)庫(kù)停止服務(wù)了,+odown則表示哨兵客觀認(rèn)為主數(shù)據(jù)庫(kù)停止服務(wù)了。
此時(shí)哨兵開始執(zhí)行故障恢復(fù),即挑選一個(gè)從數(shù)據(jù)庫(kù),將其升格為主數(shù)據(jù)庫(kù)。同時(shí)輸出如下內(nèi)容:
30553:X?26?Jun?16:57:45.646?#?Sentinel?runid?is?cbf8017edb7e379fef7d2984be1d2a22c95f7835 30553:X?26?Jun?16:57:45.646?#?+monitor?master?mymaster?127.0.0.1?6379?quorum?1 30553:X?26?Jun?16:58:52.100?#?+sdown?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.100?#?+odown?master?mymaster?127.0.0.1?6379?#quorum?1/1 30553:X?26?Jun?16:58:52.100?#?+new-epoch?1 30553:X?26?Jun?16:58:52.100?#?+try-failover?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.109?#?+vote-for-leader?cbf8017edb7e379fef7d2984be1d2a22c95f7835?1 30553:X?26?Jun?16:58:52.109?#?+elected-leader?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.109?#?+failover-state-select-slave?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.171?#?+selected-slave?slave?127.0.0.1:6381?127.0.0.1?6381?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.171?*?+failover-state-send-slaveof-noone?slave?127.0.0.1:6381?127.0.0.1?6381?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:52.243?*?+failover-state-wait-promotion?slave?127.0.0.1:6381?127.0.0.1?6381?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:53.163?#?+promoted-slave?slave?127.0.0.1:6381?127.0.0.1?6381?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:53.163?#?+failover-state-reconf-slaves?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:53.246?*?+slave-reconf-sent?slave?127.0.0.1:6380?127.0.0.1?6380?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:54.211?*?+slave-reconf-inprog?slave?127.0.0.1:6380?127.0.0.1?6380?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:55.240?*?+slave-reconf-done?slave?127.0.0.1:6380?127.0.0.1?6380?@?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:55.331?#?+failover-end?master?mymaster?127.0.0.1?6379 30553:X?26?Jun?16:58:55.331?#?+switch-master?mymaster?127.0.0.1?6379?127.0.0.1?6381 30553:X?26?Jun?16:58:55.331?*?+slave?slave?127.0.0.1:6380?127.0.0.1?6380?@?mymaster?127.0.0.1?6381 30553:X?26?Jun?16:58:55.331?*?+slave?slave?127.0.0.1:6379?127.0.0.1?6379?@?mymaster?127.0.0.1?6381 30553:X?26?Jun?16:59:25.352?#?+sdown?slave?127.0.0.1:6379?127.0.0.1?6379?@?mymaster?127.0.0.1?6381
+try-failover表示哨兵開始進(jìn)行故障恢復(fù),
+failover-end表示哨兵完成故障恢復(fù),期間涉及領(lǐng)頭哨兵的選舉、備選從數(shù)據(jù)庫(kù)的選擇等
+switch-master表示主數(shù)據(jù)庫(kù)從6379遷移到6381,即6381的從數(shù)據(jù)庫(kù)被升為主數(shù)據(jù)庫(kù),同時(shí)兩個(gè)+slave則列出了新的主數(shù)據(jù)庫(kù)的兩個(gè)從數(shù)據(jù)庫(kù),為6380和6379。
6379就是之前停止服務(wù)的主數(shù)據(jù)庫(kù),停止服務(wù)了,而6381端口的從數(shù)據(jù)庫(kù)已經(jīng)升為主數(shù)據(jù)庫(kù),當(dāng)6379端口的實(shí)例恢復(fù)服務(wù)后,會(huì)轉(zhuǎn)變?yōu)?381端口實(shí)例的從數(shù)據(jù)庫(kù)來運(yùn)行,所以哨兵將6379端口實(shí)例的信息修改成了6381端口實(shí)例的從數(shù)據(jù)庫(kù)。
故障恢復(fù)完成后,可以使用Redis命令行客戶端重新檢查6380和6381兩個(gè)端口上的實(shí)例的復(fù)制信息:
[root@TA30-53?local]#?./redis_slave1/src/redis-cli?-p?6380?-a?123456 127.0.0.1:6380>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6381 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:54239 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
[root@TA30-53?redis_slave2]#?./src/redis-cli?-p?6381?-a?123456?info?replication #?Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=57634,lag=1 master_repl_offset:57767 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:57766
可以看到6381端口上的實(shí)例已經(jīng)確實(shí)升格為主數(shù)據(jù)庫(kù)了,同時(shí)6380端口上的實(shí)例是其從數(shù)據(jù)庫(kù)。整個(gè)故障恢復(fù)過程就此完成。
此時(shí)將6379端口上的實(shí)例重新啟動(dòng),
[root@TA30-53?local]#?./redis_master/src/redis-server?./redis_master/redis.conf
哨兵會(huì)監(jiān)控到這一變化,并輸出:
30553:X?26?Jun?17:17:07.568?#?-sdown?slave?127.0.0.1:6379?127.0.0.1?6379?@?mymaster?127.0.0.1?6381 30553:X?26?Jun?17:17:17.528?*?+convert-to-slave?slave?127.0.0.1:6379?127.0.0.1?6379?@?mymaster?127.0.0.1?6381
-sdown表示實(shí)例6379已經(jīng)恢復(fù)服務(wù)了(與+sdown相反),
+convert-to-slave表示將6379端口的實(shí)例設(shè)置為6381端口實(shí)例的從數(shù)據(jù)庫(kù)。
這時(shí)使用Redis命令行客戶端查看6379端口實(shí)例的復(fù)制信息為:
[root@TA30-53?local]#?./redis_master/src/redis-cli?-p?6379?-a?123456?info?replication???????????? #?Replication role:slave master_host:127.0.0.1 master_port:6381 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:1 master_link_down_since_seconds:1498469302 slave_priority:100 slave_read_only:1 connected_slaves:0 min_slaves_good_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
同時(shí)6381端口實(shí)例的復(fù)制信息為:
127.0.0.1:6380>?info?replication #?Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=8683,lag=0 master_repl_offset:8683 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:8682
為什么不是倆,后面再研究。。。。
原理
一個(gè)哨兵進(jìn)程啟動(dòng)時(shí)會(huì)讀取配置文件的內(nèi)容,通過如下的配置找出需要監(jiān)控的主數(shù)據(jù)庫(kù):
?sentinel monitor master-name ip redis-port quorum?
其中 master-name 是一個(gè)由大小寫字母、數(shù)字和“.-_”組成的主數(shù)據(jù)庫(kù)的名字,
考慮到故障恢復(fù)后當(dāng)前監(jiān)控的系統(tǒng)的主數(shù)據(jù)庫(kù)的地址和端口會(huì)產(chǎn)生變化,所以哨兵提供了命令可以通過主數(shù)據(jù)庫(kù)的名字獲取當(dāng)前系統(tǒng)的主數(shù)據(jù)庫(kù)的地址和端口號(hào)。
ip 表示當(dāng)前系統(tǒng)中主數(shù)據(jù)庫(kù)的地址,redis-port 表示端口號(hào),quorum用來表示執(zhí)行故障恢復(fù)操作前至少需要幾個(gè)哨兵節(jié)點(diǎn)同意。
一個(gè)哨兵節(jié)點(diǎn)可以同時(shí)監(jiān)控多個(gè)Redis主從系統(tǒng),只需要提供多個(gè)sentinel monitor配置即可,例如:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor othermaster 192.168.1.3 6380 4
同時(shí)多個(gè)哨兵節(jié)點(diǎn)也可以同時(shí)監(jiān)控同一個(gè) Redis 主從系統(tǒng),從而形成網(wǎng)狀結(jié)構(gòu)。
哨兵啟動(dòng)后,會(huì)與要監(jiān)控的主數(shù)據(jù)庫(kù)建立兩條連接,這兩個(gè)連接的建立方式與普通的Redis客戶端無(wú)異。其中一條連接用來訂閱該主數(shù)據(jù)的__sentinel__:hello頻道以獲取其他同樣監(jiān)控該數(shù)據(jù)庫(kù)的哨兵節(jié)點(diǎn)的信息,另外哨兵也需要定期向主數(shù)據(jù)庫(kù)發(fā)送 INFO 等命令來獲取主數(shù)據(jù)庫(kù)本身的信息
和主數(shù)據(jù)庫(kù)的連接建立完成后,哨兵會(huì)定時(shí)執(zhí)行下面3個(gè)操作。 (1)每10秒哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)發(fā)送INFO命令。 (2)每 2 秒哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)的__sentinel__:hello 頻道發(fā)送自己的信息。 (3)每1秒哨兵會(huì)向主數(shù)據(jù)庫(kù)、從數(shù)據(jù)庫(kù)和其他哨兵節(jié)點(diǎn)發(fā)送PING命令。
首先,發(fā)送INFO命令使得哨兵可以獲得當(dāng)前數(shù)據(jù)庫(kù)的相關(guān)信息(包括運(yùn)行ID、復(fù)制信息等)從而實(shí)現(xiàn)新節(jié)點(diǎn)的自動(dòng)發(fā)現(xiàn)。
配置哨兵監(jiān)控 Redis 主從系統(tǒng)時(shí)只需要指定主數(shù)據(jù)庫(kù)的信息即可,哨兵借助 INFO 命令來獲取所有復(fù)制該主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)信息的。
啟動(dòng)后,哨兵向主數(shù)據(jù)庫(kù)發(fā)送 INFO 命令,通過解析返回結(jié)果來得知從數(shù)據(jù)庫(kù)列表,而后對(duì)每個(gè)從數(shù)據(jù)庫(kù)同樣建立兩個(gè)連接,兩個(gè)連接的作用和前文介紹的與主數(shù)據(jù)庫(kù)建立的兩個(gè)連接完全一致。在此之后,哨兵會(huì)每 10 秒定時(shí)向已知的所有主從數(shù)據(jù)庫(kù)發(fā)送INFO命令來獲取信息更新并進(jìn)行相應(yīng)操作,比如對(duì)新增的從數(shù)據(jù)庫(kù)建立連接并加入監(jiān)控列表,對(duì)主從數(shù)據(jù)庫(kù)的角色變化(由故障恢復(fù)操作引起)進(jìn)行信息更新等。
接下來哨兵向主從數(shù)據(jù)庫(kù)的__sentinel__:hello 頻道發(fā)送信息來與同樣監(jiān)控該數(shù)據(jù)庫(kù)的哨兵分享自己的信息。
發(fā)送的消息內(nèi)容為:
可以看到消息包括的哨兵的基本信息,以及其監(jiān)控的主數(shù)據(jù)庫(kù)的信息。哨兵會(huì)訂閱每個(gè)其監(jiān)控的數(shù)據(jù)庫(kù)的__sentinel__:hello頻道,所以當(dāng)其他哨兵收到消息后,會(huì)判斷發(fā)消息的哨兵是不是新發(fā)現(xiàn)的哨兵。如果是則將其加入已發(fā)現(xiàn)的哨兵列表中并創(chuàng)建一個(gè)到其的連接(與數(shù)據(jù)庫(kù)不同,哨兵與哨兵之間只會(huì)創(chuàng)建一條連接用來發(fā)送 PING命令,而不需要?jiǎng)?chuàng)建另外一條連接來訂閱頻道,因?yàn)樯诒恍枰嗛啍?shù)據(jù)庫(kù)的頻道即可實(shí)現(xiàn)自動(dòng)發(fā)現(xiàn)其他哨兵)。同時(shí)哨兵會(huì)判斷信息中主數(shù)據(jù)庫(kù)的配置版本,如果該版本比當(dāng)前記錄的主數(shù)據(jù)庫(kù)的版本高,則更新主數(shù)據(jù)庫(kù)的數(shù)據(jù)。
實(shí)現(xiàn)了自動(dòng)發(fā)現(xiàn)從數(shù)據(jù)庫(kù)和其他哨兵節(jié)點(diǎn)后,哨兵要做的就是定時(shí)監(jiān)控這些數(shù)據(jù)庫(kù)和節(jié)點(diǎn)有沒有停止服務(wù)。
每隔一定時(shí)間向這些節(jié)點(diǎn)發(fā)送PING命令。
時(shí)間間隔與down-after-milliseconds選項(xiàng)有關(guān),當(dāng)down-after-milliseconds的值小于1秒時(shí),哨兵會(huì)每隔down-after-milliseconds指定的時(shí)間發(fā)送一次PING命令,
當(dāng)down-after-milliseconds的值大于1秒時(shí),哨兵會(huì)每隔1秒發(fā)送一次PING命令。
例如:?
//每隔 1 秒發(fā)送一次 PING命令?
sentinel down-after-milliseconds mymaster 60000?
//每隔 600 毫秒發(fā)送一次 PING命令?
sentinel down-after-milliseconds othermaster 600?
當(dāng)超過down-after-milliseconds選項(xiàng)指定時(shí)間后,如果被PING的數(shù)據(jù)庫(kù)或節(jié)點(diǎn)仍然未進(jìn)行回復(fù),則哨兵認(rèn)為其主觀下線(subjectively down)。
主觀下線表示從當(dāng)前的哨兵進(jìn)程看來,該節(jié)點(diǎn)已經(jīng)下線。
如果該節(jié)點(diǎn)是主數(shù)據(jù)庫(kù),則哨兵會(huì)進(jìn)一步判斷是否需要對(duì)其進(jìn)行故障恢復(fù):哨兵發(fā)送 SENTINEL is-master-down-by-addr命令詢問其他哨兵節(jié)點(diǎn)以了解他們是否也認(rèn)為該主數(shù)據(jù)庫(kù)主觀下線,如果達(dá)到指定數(shù)量時(shí),哨兵會(huì)認(rèn)為其客觀下線(objectively down),并選舉領(lǐng)頭的哨兵節(jié)點(diǎn)對(duì)主從系統(tǒng)發(fā)起故障恢復(fù)。這個(gè)指定數(shù)量即為quorum參數(shù)。
例如,
sentinel monitor mymaster 127.0.0.1 6379 2
該配置表示只有當(dāng)至少兩個(gè) Sentinel 節(jié)點(diǎn)(包括當(dāng)前節(jié)點(diǎn))認(rèn)為該主數(shù)據(jù)庫(kù)主觀下線時(shí),當(dāng)前哨兵節(jié)點(diǎn)才會(huì)認(rèn)為該主數(shù)據(jù)庫(kù)客觀下線。
進(jìn)行接下來的選舉領(lǐng)頭哨兵步驟。
雖然當(dāng)前哨兵節(jié)點(diǎn)發(fā)現(xiàn)了主數(shù)據(jù)庫(kù)客觀下線,需要故障恢復(fù),但是故障恢復(fù)需要由領(lǐng)頭的哨兵來完成,這樣可以保證同一時(shí)間只有一個(gè)哨兵節(jié)點(diǎn)來執(zhí)行故障恢復(fù)。
選舉領(lǐng)頭哨兵的過程使用了Raft算法,具體過程如下。
(1)發(fā)現(xiàn)主數(shù)據(jù)庫(kù)客觀下線的哨兵節(jié)點(diǎn)(下面稱作A)向每個(gè)哨兵節(jié)點(diǎn)發(fā)送命令,要求對(duì)方選自己成為領(lǐng)頭哨兵。
(2)如果目標(biāo)哨兵節(jié)點(diǎn)沒有選過其他人,則會(huì)同意將A設(shè)置成領(lǐng)頭哨兵。
(3)如果A發(fā)現(xiàn)有超過半數(shù)且超過quorum參數(shù)值的哨兵節(jié)點(diǎn)同意選自己成為領(lǐng)頭哨兵,則A成功成為領(lǐng)頭哨兵。
(4)當(dāng)有多個(gè)哨兵節(jié)點(diǎn)同時(shí)參選領(lǐng)頭哨兵,則會(huì)出現(xiàn)沒有任何節(jié)點(diǎn)當(dāng)選的可能。此時(shí)每個(gè)參選節(jié)點(diǎn)將等待一個(gè)隨機(jī)時(shí)間重新發(fā)起參選請(qǐng)求,進(jìn)行下一輪選舉,直到選舉成功。
選出領(lǐng)頭哨兵后,領(lǐng)頭哨兵將會(huì)開始對(duì)主數(shù)據(jù)庫(kù)進(jìn)行故障恢復(fù)。
故障恢復(fù)的過程相如下。
?首先領(lǐng)頭哨兵將從停止服務(wù)的主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)中挑選一個(gè)來充當(dāng)新的主數(shù)據(jù)庫(kù)。挑選的依據(jù)如下。
(1)所有在線的從數(shù)據(jù)庫(kù)中,選擇優(yōu)先級(jí)最高的從數(shù)據(jù)庫(kù)。優(yōu)先級(jí)可以通過slave-priority選項(xiàng)來設(shè)置。
(2)如果有多個(gè)最高優(yōu)先級(jí)的從數(shù)據(jù)庫(kù),則復(fù)制的命令偏移量越大(即復(fù)制越完整)越優(yōu)先。
(3)如果以上條件都一樣,則選擇運(yùn)行ID較小的從數(shù)據(jù)庫(kù)。
選出一個(gè)從數(shù)據(jù)庫(kù)后,領(lǐng)頭哨兵將向從數(shù)據(jù)庫(kù)發(fā)送 SLAVEOF NO ONE命令使其升格為主數(shù)據(jù)庫(kù)。
而后領(lǐng)頭哨兵向其他從數(shù)據(jù)庫(kù)發(fā)送SLAVEOF命令來使其成為新主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)。
最后一步則是更新內(nèi)部的記錄,將已經(jīng)停止服務(wù)的舊的主數(shù)據(jù)庫(kù)更新為新的主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù),使得當(dāng)其恢復(fù)服務(wù)時(shí)自動(dòng)以從數(shù)據(jù)庫(kù)的身份繼續(xù)服務(wù)。
哨兵的部署
哨兵以獨(dú)立進(jìn)程的方式對(duì)一個(gè)主從系統(tǒng)進(jìn)行監(jiān)控,監(jiān)控的效果好壞與否取決于哨兵的視角是否有代表性。
如果一個(gè)主從系統(tǒng)中配置的哨兵較少,哨兵對(duì)整個(gè)系統(tǒng)的判斷的可靠性就會(huì)降低。
整體來講,相對(duì)穩(wěn)妥的哨兵部署方案是使得哨兵的視角盡可能地與每個(gè)節(jié)點(diǎn)的視角一致,即:
(1)為每個(gè)節(jié)點(diǎn)(無(wú)論是主數(shù)據(jù)庫(kù)還是從數(shù)據(jù)庫(kù))部署一個(gè)哨兵;
(2)使每個(gè)哨兵與其對(duì)應(yīng)的節(jié)點(diǎn)的網(wǎng)絡(luò)環(huán)境相同或相近。?
這樣的部署方案可以保證哨兵的視角擁有較高的代表性和可靠性。





