Redis使用sentinel機制來實現(xiàn)高可用,sentinel是另外一個集群,主要是用來監(jiān)控所有的Redis服務(wù)器,所有redis主節(jié)點和redis從節(jié)點,監(jiān)控方式使用的是ping指令,sentinel每隔1秒向master發(fā)送【ping】,如果在一段時間內(nèi)沒有收到【pong】或者收到無效回復(fù),則認(rèn)為master下線。
sentinel對下線有兩種定義:
a.主觀下線(sdown):sentinel實例本身對服務(wù)實例的判斷
b.客觀下線(odown):多個sentinel實例對同一個服務(wù)SDOWN的狀態(tài)做出協(xié)商后的判斷,只有master才可能在odown狀態(tài) 。
簡單的說,一個sentinel單獨做出的判斷只能是sdown,是沒有任何官方效力的,只有多個sentinel大家商量好,得到一致,才能將某個master狀態(tài)從sdown置為odown,只有確定master的狀態(tài)轉(zhuǎn)換為odown狀態(tài)后,才能做后續(xù)failover的操作。
sentinel能夠?qū)崿F(xiàn)監(jiān)控整個主從復(fù)制架構(gòu),你只要告訴sentinel誰是主服務(wù)器就行了,它會從主服務(wù)器上,也就是向主服務(wù)發(fā)送info指令,了解這個主下面有哪些從服務(wù)器,如果發(fā)現(xiàn)主服務(wù)器離線了,它會自動從這個主服務(wù)器下面的某個從服務(wù)器中選舉一個當(dāng)新的主節(jié)點,那么此前從節(jié)點連的主節(jié)點是原來的老主,原來的主節(jié)點不在了怎么辦,sentinel告訴客戶端新的主是誰 ,向客戶端發(fā)送slaveof指定讓從節(jié)點重新選擇主節(jié)點。
如果sentinel連不主節(jié)點或者sentinel本身故障了怎么辦,所以sentinel需要做一個集群。由集群中的每個節(jié)點來共同判斷redis節(jié)點是否down了。
Sentinel作用是管理多個redis服務(wù)實現(xiàn)HA
監(jiān)控:Sentinel 會不斷地檢查你的主服務(wù)器和從服務(wù)器是否運作正常。
通知:當(dāng)被監(jiān)控的某個Redis服務(wù)器出現(xiàn)問題時, Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。
自動故障轉(zhuǎn)移:當(dāng)一個主服務(wù)器不能正常工作時, Sentinel會開始一次自動故障遷移操作,它會將失效主服務(wù)器的其中一個從服務(wù)器升級為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當(dāng)客戶端試圖連接失效的主服務(wù)器時,集群也會向客戶端返回新主服務(wù)器的地址,使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
使用的是流言協(xié)議,投票協(xié)議。
堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都門窗定制小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站定制營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
啟動方式有兩種:
#通過redis-server 的sentinel參數(shù)啟動:
redis-servier /etc/sentinel.conf --sentinel
#通過redis-sentinel命令啟動:
redis-sentinel /etc/sentinel.conf
Sentinel依賴于配置文件,它必須用配置文件不停保存自已的狀態(tài)信息。
啟動一個sentinel有以下幾個步驟:
#sentinel.conf為其專用配置文件,主要設(shè)置如下參數(shù):
#默認(rèn)Port
port 26379
#指定要監(jiān)控的master,mymaster是定義的master名字,quorum為法定票數(shù)2,此處指的是sentinel的數(shù),只有指定的sentinel同意時才認(rèn)為sentinel做的決策是有效的,一般大于sentinel數(shù)量的半數(shù)??梢杂卸鄠€master,一組sentinel集群可以監(jiān)控N個主從復(fù)制架構(gòu)
sentinel monitor mymaster 127.0.0.1 6379 2
#指定要連接的redis master密碼
sentinel auth-pass mymaster redis
#至少多長時間 連不上才認(rèn)為主的離線了。單位為ms, 即連接超時時長
sentinel down-after-milliseconds mymaster 30000
# 剛剛設(shè)定為新主時,允許同時有多少個從向主發(fā)起同步請求。
sentinel parallel-syncs 1
#當(dāng)master故障時,把新的從提升為master,多長時間提不上就認(rèn)為故障轉(zhuǎn)移失敗。
sentinel failover-timeout mymaster 180000 #故障轉(zhuǎn)移的超時時長
sentinel masters #獲取所有監(jiān)控的master
sentinel slaves <master name> #列出該master的所有從節(jié)點
sentinel get-master-addr-by-name <master name>#根據(jù)master名字來獲取地址
sentinel reset #重置所有,從頭再來
sentinel failover <mater name> #手動故障轉(zhuǎn)移,并指明向哪組master發(fā)起手動
Redis版本:3.2.2
一主兩從:
主:10.3.1.15 6379
從:10.3.1.15 6378
從:10.3.1.15 6376
一個Sentinel:10.3.1.17
slaveof <masterip> <masterport>
在redis.conf配置文件中bind監(jiān)聽如果有多個IP,應(yīng)將本機IP放在前面,回環(huán)地址放在最后,因為redis通常用最前面的IP與master通信。
#可以看到主從關(guān)系已正常
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.3.1.15,port=6378,state=online,offset=5204,lag=1
slave1:ip=10.3.1.15,port=6376,state=online,offset=5204,lag=1
master_repl_offset:5218
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5217
127.0.0.1:6379>
#啟動sentinel
./bin/redis-sentinel /data/service/redis/sentinel.conf
18844:X 23 Mar 18:34:58.053 * Increased maximum number of open files to 10032 (it was originally set to 1024).
...
...
18844:X 23 Mar 18:34:58.054 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
18844:X 23 Mar 18:34:58.056 # Sentinel ID is 524c94beed78f379e4a0b3b641992449b0cdcf7f
18844:X 23 Mar 18:34:58.056 # +monitor master mymaster 10.3.1.15 6379 quorum 2
18844:X 23 Mar 18:34:58.057 * +slave slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379
18844:X 23 Mar 18:34:58.059 * +slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379
#啟動完成,從控制臺上面可以看到sentinel已經(jīng)找到master和slave。
下面是連入sentinel 查看master信息:
root@ubuntu17:$ redis-cli -h 10.3.1.17 -p 26379
10.3.1.17:26379> info
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
如上,輸入info后報錯說是redis工作在保護模式下,通過'CONFIG SET protected-mode no 來關(guān)閉,因為默認(rèn)protected-mode 為yes。
所以在所有的redis,即一主兩從上都加上這句話,然后再進入sentinel輸入info,仍然報此錯,于是嘗試在sentinel本身的sentinel.conf文件中加入了這句,保存并重啟sentinel,然后執(zhí)行info就不報錯了。
#顯示正常
10.3.1.17:26379> INFO
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.3.1.15:6379,slaves=2,sentinels=1
10.3.1.17:26379>
#獲取sentinel 所監(jiān)控的redis master服務(wù)器信息
10.3.1.17:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "10.3.1.15"
5) "port"
6) "6379"
7) "runid"
8) "3520e56cadc7a3cd591da0094199d46a83771318"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "697"
19) "last-ping-reply"
20) "697"
21) "down-after-milliseconds"
22) "30000"
62360:X 24 Mar 13:05:53.197 # +sdown master mymaster 10.3.1.15 6379 #主觀認(rèn)為master已失效
62360:X 24 Mar 13:05:53.197 # +odown master mymaster 10.3.1.15 6379 #quorum 1/1 #客觀認(rèn)為master已失效
62360:X 24 Mar 13:06:07.965 # +new-epoch 13 #準(zhǔn)備進master新一紀(jì)元,第13次選舉。
62360:X 24 Mar 13:06:07.965 # +try-failover master mymaster 10.3.1.15 6379 #嘗試轉(zhuǎn)移master
62360:X 24 Mar 13:06:07.967 # +vote-for-leader 9cf767f451de09136054ccc6afc6dcc5f939b5a0 13 #投票選舉leader
62360:X 24 Mar 13:06:07.967 # +elected-leader master mymaster 10.3.1.15 6379 #之前被選舉出來的 master
62360:X 24 Mar 13:06:07.967 # +failover-state-select-slave master mymaster 10.3.1.15 6379 #Leader開始select合適的master
62360:X 24 Mar 13:06:08.034 # +selected-slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #已找到了合適的從10.3.1.15:6376為主
62360:X 24 Mar 13:06:08.034 * +failover-state-send-slaveof-noone slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #Leader 向 slave 發(fā)送“slaveof no one”指令,此時 slave 已經(jīng)完成角色轉(zhuǎn)換,此 slave 即為 master
62360:X 24 Mar 13:06:08.093 * +failover-state-wait-promotion slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #等待其他 sentinel 確認(rèn) slave
62360:X 24 Mar 13:06:09.116 # +promoted-slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #確認(rèn)成功
62360:X 24 Mar 13:06:09.116 # +failover-state-reconf-slaves master mymaster 10.3.1.15 6379 #開始對slaves進行reconfig 操作
62360:X 24 Mar 13:06:09.176 * +slave-reconf-sent slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379 #向指定的slave 發(fā)送“slaveof”指令,告知此 slave 跟隨新的 master
62360:X 24 Mar 13:06:10.132 * +slave-reconf-inprog slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379 開始對slaves進行reconfig 操作
然后進入sentinel中查看新的master:
10.3.1.17:26379> sentinel masters
#可以看到master已經(jīng)發(fā)生了改變
1) 1) "name"
2) "mymaster"
3) "ip"
4) "10.3.1.15"
5) "port"
6) "6376"
7) "runid"
回到某個slave節(jié)點查看:
10.3.1.15:6378> config get slaveof
1) "slaveof"
2) "10.3.1.15 6376"
10.3.1.15:6378>
現(xiàn)在把原來的master 6379啟動起來,再看下它是主還是從:
10.3.1.15:6379> config get slaveof
1) "slaveof"
2) "10.3.1.15 6376"
#原來的master,此時已是從節(jié)點了
現(xiàn)在進入新選舉出來的master查看:
10.3.1.15:6376> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.3.1.15,port=6379,state=online,offset=707098,lag=1
slave1:ip=10.3.1.15,port=6379,state=online,offset=707013,lag=1
master_repl_offset:707098
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:707097
10.3.1.15:6376>
以上就是Redis sentinel就是高可用功能,應(yīng)用程序應(yīng)該向sentinel發(fā)請求,去尋求新Master的地址,這時要用redis專用程序,根據(jù)sentinel反饋來聯(lián)絡(luò)新服務(wù)器。
名稱欄目:Redis高可用部署
文章鏈接:http://www.rwnh.cn/article10/jjssdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)、App開發(fā)、用戶體驗、網(wǎng)站排名、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)