Sentinel(哨兵)是Redis 的高可用性解決方案:由一個(gè)或多個(gè)Sentinel 實(shí)例組成的Sentinel 系統(tǒng)可以監(jiān)視任意多個(gè)主服務(wù)器,以及這些主服務(wù)器屬下的所有從服務(wù)器,并在被監(jiān)視的主服務(wù)器進(jìn)入下線狀態(tài)時(shí),自動(dòng)將下線主服務(wù)器屬下的某個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器。簡(jiǎn)單的說(shuō)哨兵就是帶有自動(dòng)故障轉(zhuǎn)移功能的主從架構(gòu)。
無(wú)法解決:1.單節(jié)點(diǎn)并發(fā)壓力問(wèn)題 2.單節(jié)點(diǎn)內(nèi)存和磁盤(pán)物理上限
主從切換技術(shù)的方法是:當(dāng)主服務(wù)器宕機(jī)后,需要手動(dòng)把一臺(tái)從服務(wù)器切換為主服務(wù)器,這就需要人工干預(yù),費(fèi)事費(fèi)力,還會(huì)造成一段時(shí)間內(nèi)服務(wù)不可用。這不是一種推薦的方式,更多時(shí)候,我們優(yōu)先考慮哨兵模式。
2 哨兵架構(gòu)原理單機(jī)單個(gè)哨兵
哨兵的作用:
然而一個(gè)哨兵進(jìn)程對(duì)redis服務(wù)器進(jìn)行監(jiān)控,可能會(huì)出現(xiàn)問(wèn)題,為此,我們可以使用多個(gè)哨兵進(jìn)行監(jiān)控。各個(gè)哨兵之間還會(huì)進(jìn)行監(jiān)控,這樣就形成了多哨兵模式。
假設(shè)主服務(wù)器宕機(jī),哨兵1先檢測(cè)到這個(gè)結(jié)果,系統(tǒng)并不會(huì)立馬進(jìn)行failover過(guò)程,僅僅是哨兵1主觀的認(rèn)為主服務(wù)器不可用,這個(gè)現(xiàn)象稱為主觀下線。當(dāng)后面的哨兵也檢測(cè)到主服務(wù)器不可用,并且達(dá)到一定數(shù)量,那么哨兵之間會(huì)進(jìn)行一次投票,投票的結(jié)果由一個(gè)哨兵發(fā)起,進(jìn)行failover(故障轉(zhuǎn)移操作)。q切換成功后,通過(guò)發(fā)布訂閱模式,讓各個(gè)哨兵把自己的監(jiān)控的從服務(wù)器實(shí)現(xiàn)切換主機(jī),這個(gè)過(guò)稱為客觀下線。
哨兵的核心配置
sentinel monitor mymaster 127.0.0.1 6379 1
1.在主節(jié)點(diǎn)上創(chuàng)建哨兵配置
$ vi sentinel.conf
2.配置哨兵,在sentinel.conf文件中填入內(nèi)容:
$ sentinel monitor myredis 127.0.0.1 6379 1
3.啟動(dòng)哨兵模式進(jìn)行測(cè)試
- redis-sentinel config/sentinel.conf
如果master節(jié)點(diǎn)斷開(kāi)了,就會(huì)從從機(jī)中選擇一個(gè)作為主機(jī)。
如果主機(jī)此時(shí)回來(lái)了,只能歸并到新的主機(jī)下,當(dāng)作從機(jī),這就是哨兵模式的規(guī)則。
優(yōu)點(diǎn):
缺點(diǎn):
完整的哨兵配置
# Example sentinel.conf
# 哨兵sentinel實(shí)例運(yùn)行的端口 默認(rèn)26379
port 26379
# 哨兵sentinel的工作目錄
dir /tmp
# 哨兵sentinel監(jiān)控的redis主節(jié)點(diǎn)的 ip port
# master-name 可以自己命名的主節(jié)點(diǎn)名字 只能由字母A-z、數(shù)字0-9 、這三個(gè)字符".-_"組成。
# quorum 當(dāng)這些quorum個(gè)數(shù)sentinel哨兵認(rèn)為master主節(jié)點(diǎn)失聯(lián) 那么這時(shí) 客觀上認(rèn)為主節(jié)點(diǎn)失聯(lián)了
# sentinel monitorsentinel monitor mymaster 127.0.0.1 6379 1
# 當(dāng)在Redis實(shí)例中開(kāi)啟了requirepass foobared 授權(quán)密碼 這樣所有連接Redis實(shí)例的客戶端都要提供密碼
# 設(shè)置哨兵sentinel 連接主從的密碼 注意必須為主從設(shè)置一樣的驗(yàn)證密碼
# sentinel auth-passsentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主節(jié)點(diǎn)沒(méi)有應(yīng)答哨兵sentinel 此時(shí) 哨兵主觀上認(rèn)為主節(jié)點(diǎn)下線 默認(rèn)30秒
# sentinel down-after-millisecondssentinel down-after-milliseconds mymaster 30000
# 這個(gè)配置項(xiàng)指定了在發(fā)生failover主備切換時(shí)最多可以有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行 同步,
這個(gè)數(shù)字越小,完成failover所需的時(shí)間就越長(zhǎng),
但是如果這個(gè)數(shù)字越大,就意味著越 多的slave因?yàn)閞eplication而不可用。
可以通過(guò)將這個(gè)值設(shè)為 1 來(lái)保證每次只有一個(gè)slave 處于不能處理命令請(qǐng)求的狀態(tài)。
# sentinel parallel-syncssentinel parallel-syncs mymaster 1
# 故障轉(zhuǎn)移的超時(shí)時(shí)間 failover-timeout 可以用在以下這些方面:
#1. 同一個(gè)sentinel對(duì)同一個(gè)master兩次failover之間的間隔時(shí)間。
#2. 當(dāng)一個(gè)slave從一個(gè)錯(cuò)誤的master那里同步數(shù)據(jù)開(kāi)始計(jì)算時(shí)間。直到slave被糾正為向正確的master那里同步數(shù)據(jù)時(shí)。
#3.當(dāng)想要取消一個(gè)正在進(jìn)行的failover所需要的時(shí)間。
#4.當(dāng)進(jìn)行failover時(shí),配置所有slaves指向新的master所需的大時(shí)間。不過(guò),即使過(guò)了這個(gè)超時(shí),slaves依然會(huì)被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來(lái)了
# 默認(rèn)三分鐘
# sentinel failover-timeoutsentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置當(dāng)某一事件發(fā)生時(shí)所需要執(zhí)行的腳本,可以通過(guò)腳本來(lái)通知管理員,例如當(dāng)系統(tǒng)運(yùn)行不正常時(shí)發(fā)郵件通知相關(guān)人員。
#對(duì)于腳本的運(yùn)行結(jié)果有以下規(guī)則:
#若腳本執(zhí)行后返回1,那么該腳本稍后將會(huì)被再次執(zhí)行,重復(fù)次數(shù)目前默認(rèn)為10
#若腳本執(zhí)行后返回2,或者比2更高的一個(gè)返回值,腳本將不會(huì)重復(fù)執(zhí)行。
#如果腳本在執(zhí)行過(guò)程中由于收到系統(tǒng)中斷信號(hào)被終止了,則同返回值為1時(shí)的行為相同。
#一個(gè)腳本的大執(zhí)行時(shí)間為60s,如果超過(guò)這個(gè)時(shí)間,腳本將會(huì)被一個(gè)SIGKILL信號(hào)終止,之后重新執(zhí)行。
#通知型腳本:當(dāng)sentinel有任何警告級(jí)別的事件發(fā)生時(shí)(比如說(shuō)redis實(shí)例的主觀失效和客觀失效等等),將會(huì)去調(diào)用這個(gè)腳本,
#這時(shí)這個(gè)腳本應(yīng)該通過(guò)郵件,SMS等方式去通知系統(tǒng)管理員關(guān)于系統(tǒng)不正常運(yùn)行的信息。調(diào)用該腳本時(shí),將傳給腳本兩個(gè)參數(shù),
#一個(gè)是事件的類型,
#一個(gè)是事件的描述。
#如果sentinel.conf配置文件中配置了這個(gè)腳本路徑,那么必須保證這個(gè)腳本存在于這個(gè)路徑,并且是可執(zhí)行的,否則sentinel無(wú)法正常啟動(dòng)成功。
#通知腳本
# sentinel notification-scriptsentinel notification-script mymaster /var/redis/notify.sh
# 客戶端重新配置主節(jié)點(diǎn)參數(shù)腳本
# 當(dāng)一個(gè)master由于failover而發(fā)生改變時(shí),這個(gè)腳本將會(huì)被調(diào)用,通知相關(guān)的客戶端關(guān)于master地址已經(jīng)發(fā)生改變的信息。
# 以下參數(shù)將會(huì)在調(diào)用腳本時(shí)傳給腳本:
## 目前總是“failover”,
#是“l(fā)eader”或者“observer”中的一個(gè)。
# 參數(shù) from-ip, from-port, to-ip, to-port是用來(lái)和舊的master和新的master(即舊的slave)通信的
# 這個(gè)腳本應(yīng)該是通用的,能被多次調(diào)用,不是針對(duì)性的。
# sentinel client-reconfig-scriptsentinel client-reconfig-script mymaster /var/redis/reconfig.sh
4 通過(guò)springboot操作哨兵# redis sentinel 配置
# master書(shū)寫(xiě)是使用哨兵監(jiān)聽(tīng)的那個(gè)名稱
spring.redis.sentinel.master=mymaster
# 連接的不再是一個(gè)具體redis主機(jī),書(shū)寫(xiě)的是多個(gè)哨兵節(jié)點(diǎn)
spring.redis.sentinel.nodes=192.168.202.206:26379
注意:如果連接過(guò)程中出現(xiàn)如下錯(cuò)誤:RedisConnectionException: 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
解決方案:在哨兵的配置文件中加入bind 0.0.0.0 開(kāi)啟遠(yuǎn)程連接權(quán)限
一般在port下面加入即可bind 0.0.0.0
redis發(fā)布訂閱(pub/sub)是一種消息通測(cè)試
發(fā)布者
127.0.0.1:6379>PUBLISH xxx hello,qqqq # 發(fā)布消息hello,qqq到xxx頻道
(integer) 1
127.0.0.1:6379>PUBLISH xxx hello,redis
(integer) 1
訂閱者
127.0.0.1:6379>SUBSCRIBE xxx # 訂閱頻道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "xxx"
3) (integer) 1
#等待消息
1) "message" # 消息
2) "xxx" # 消息頻道
3) "hello,qqqq" # 消息內(nèi)容
4) "message"
5) "xxx"
6) "hello,redis"
原理:
Redis是使用C實(shí)現(xiàn)的,通過(guò)分析redis源碼里的pubsub.cc文件,了解發(fā)布和訂閱機(jī)制的底層實(shí)現(xiàn),借此加深堆redis的理解。
redis是通過(guò)PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令實(shí)現(xiàn)發(fā)布和訂閱功能。
通過(guò)SUBSCRIBE命令訂閱某頻道后,redis-server里維護(hù)了一個(gè)字典,字典的鍵就是一個(gè)一個(gè)個(gè)channel, 而字典的值則是一個(gè)鏈表,鏈表中保存了所有訂閱這個(gè)channel的客戶端。SUBSCRIBE命令的關(guān)鍵就是將客戶端添加到給定的channel的訂閱鏈表中。
通過(guò)PUBLISH命令向訂閱者發(fā)送消息,redis-server會(huì)使用給定的頻道作為鍵,在它所維護(hù)的channel字典中查找記錄了訂閱這個(gè)頻道的客戶端的鏈表,遍歷這個(gè)鏈表,將消息發(fā)布給所有的訂閱者。
pub/sub從字面上理解就是發(fā)布(Publish)和訂閱(Subscribe),在redis中,可以設(shè)定對(duì)某一個(gè)key值進(jìn)行消息發(fā)布幾消息訂閱,當(dāng)一個(gè)key值上進(jìn)行了消息發(fā)布后,所有訂閱它的客戶端都會(huì)收到相應(yīng)的消息。這一功能最明顯的用法就是用作實(shí)時(shí)消息系統(tǒng),比如一個(gè)普通的即時(shí)聊天,群聊等。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱:Redis哨兵機(jī)制以及發(fā)布訂閱-創(chuàng)新互聯(lián)
鏈接地址:http://www.rwnh.cn/article34/doecse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、企業(yè)建站、品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容