Redis6 主從復(fù)制及哨兵機(jī)制的實(shí)現(xiàn)
Redis 主從復(fù)制
什么是主從復(fù)制
如果單機(jī)情況下,機(jī)器重啟,內(nèi)存數(shù)據(jù)丟失,如何保證數(shù)據(jù)的高可用呢?持久化方案
如果機(jī)器硬盤壞掉,如何保證數(shù)據(jù)的高可用呢?主從復(fù)制
Redis的主從機(jī)制:主負(fù)責(zé)讀寫,從一般只讀不能寫(客戶端)。
持久化保證了即使 Redis 服務(wù)重啟也不會(huì)丟失數(shù)據(jù),因?yàn)?Redis 服務(wù)重啟后會(huì)將硬盤上持久化的數(shù)據(jù)恢復(fù)到內(nèi)存中,但是當(dāng) Redis 服務(wù)器的硬盤損壞了可能會(huì)導(dǎo)致數(shù)據(jù)丟失,不過通過 Redis 的主從復(fù)制
機(jī)制就可以避免這種單點(diǎn)故障,如下圖:
說明:
主 Redis 中的數(shù)據(jù)有兩個(gè)副本( replication )即從 redis1 和從 redis2 ,即使一臺(tái) Redis 服務(wù)器宕機(jī)其它兩臺(tái) Redis 服務(wù)也可以繼續(xù)提供服務(wù)。
主 Redis 中的數(shù)據(jù)和從 Redis 上的數(shù)據(jù)保持實(shí)時(shí)同步,當(dāng)主 Redis 寫入數(shù)據(jù)時(shí)通過主從復(fù)制機(jī)制會(huì)復(fù)制到兩個(gè)從 Redis 服務(wù)上。
只有一個(gè)主 Redis ,可以有多個(gè)從 Redis 。
主從復(fù)制不會(huì)阻塞 master ,在同步數(shù)據(jù)時(shí), master 可以繼續(xù)處理 client 請(qǐng)求。
一個(gè) Redis 可以即是主又是從,如下圖:
主從配置
主Redis配置
無(wú)需特殊配置
從Redis配置
修改從服務(wù)器上的 redis.conf 文件:
# slaveof <masterip> <masterport> # 表示當(dāng)前【從服務(wù)器】對(duì)應(yīng)的【主服務(wù)器】的IP是192.168.10.135,端口是6379。 slaveof 192.168.10.135 6379 replicaof 192.168.19.135 6379
實(shí)現(xiàn)原理
- Redis 的主從同步,分為全量同步和增量同步。
- 只有從機(jī)第一次連接上主機(jī)是全量同步。
- 斷線重連有可能觸發(fā)全量同步也有可能是增量同步( master 判斷 runid 是否一致)。
- 除此之外的情況都是增量同步。
全量同步
Redis 的全量同步過程主要分三個(gè)階段:
- 同步快照階段: Master 創(chuàng)建并發(fā)送快照給 Slave , Slave 載入并解析快照。 Master 同時(shí)將此階段所產(chǎn)生的新的寫命令存儲(chǔ)到緩沖區(qū)。
- 同步寫緩沖階段: Master 向 Slave 同步存儲(chǔ)在緩沖區(qū)的寫操作命令。
- 同步增量階段: Master 向 Slave 同步寫操作命令。
增量同步
- Redis 增量同步主要指 Slave 完成初始化后開始正常工作時(shí), Master 發(fā)生的寫操作同步到 Slave 的過程。
- 通常情況下, Master 每執(zhí)行一個(gè)寫命令就會(huì)向 Slave 發(fā)送相同的寫命令,然后 Slave 接收并執(zhí)行。
Redis 哨兵機(jī)制
Redis 主從復(fù)制的缺點(diǎn):沒有辦法對(duì) master 進(jìn)行動(dòng)態(tài)選舉,需要使用 Sentinel 機(jī)制完成動(dòng)態(tài)選舉。
簡(jiǎn)介
- Sentinel (哨兵)進(jìn)程是用于監(jiān)控 Redis 集群中 Master 主服務(wù)器工作的狀態(tài)
- 在 Master 主服務(wù)器發(fā)生故障的時(shí)候,可以實(shí)現(xiàn) Master 和 Slave 服務(wù)器的切換,保證系統(tǒng)的高可用( HA )
- 其已經(jīng)被集成在 redis2.6+ 的版本中, Redis 的哨兵模式到了 2.8 版本之后就穩(wěn)定了下來。
哨兵進(jìn)程的作用
- 監(jiān)控( Monitoring ): 哨兵( sentinel ) 會(huì)不斷地檢查你的 Master 和 Slave 是否運(yùn)作正常。
- 提醒( Notification ): 當(dāng)被監(jiān)控的某個(gè) Redis 節(jié)點(diǎn)出現(xiàn)問題時(shí), 哨兵( sentinel ) 可以通過API 向管理員或者其他應(yīng)用程序發(fā)送通知。
- 自動(dòng)故障遷移( Automatic failover ):當(dāng)一個(gè) Master 不能正常工作時(shí),哨兵( sentinel )會(huì)開始一次自動(dòng)故障遷移操作
故障判定原理分析
- 每個(gè) Sentinel (哨兵)進(jìn)程以每秒鐘一次的頻率向整個(gè)集群中的 Master 主服務(wù)器, Slave 從服務(wù)器以及其他 Sentinel (哨兵)進(jìn)程發(fā)送一個(gè) PING 命令。
- 如果一個(gè)實(shí)例( instance )距離最后一次有效回復(fù) PING 命令的時(shí)間超過 down-after- milliseconds 選項(xiàng)所指定的值, 則這個(gè)實(shí)例會(huì)被 Sentinel (哨兵)進(jìn)程標(biāo)記為主觀下線 ( SDOWN )。
- 如果一個(gè) Master 主服務(wù)器被標(biāo)記為主觀下線( SDOWN ),則正在監(jiān)視這個(gè) Master 主服務(wù)器的所有 Sentinel (哨兵)進(jìn)程要以每秒一次的頻率確認(rèn) Master 主服務(wù)器的確進(jìn)入了主觀下線狀態(tài)。
- 當(dāng)有足夠數(shù)量的 Sentinel (哨兵)進(jìn)程(大于等于配置文件指定的值)在指定的時(shí)間范圍內(nèi)確認(rèn) Master 主服務(wù)器進(jìn)入了主觀下線狀態(tài)( SDOWN ), 則 Master 主服務(wù)器會(huì)被標(biāo)記為客觀下線 ( ODOWN )。
- 在一般情況下, 每個(gè) Sentinel (哨兵)進(jìn)程會(huì)以每 10 秒一次的頻率向集群中的所有Master 主服務(wù)器、 Slave 從服務(wù)器發(fā)送 INFO 命令。
- 當(dāng) Master 主服務(wù)器被 Sentinel (哨兵)進(jìn)程標(biāo)記為客觀下線( ODOWN )時(shí), Sentinel (哨兵)進(jìn)程向下線的 Master 主服務(wù)器的所有 Slave 從服務(wù)器發(fā)送 INFO 命令的頻率會(huì)從 10秒一次改為每秒一次。
- 若沒有足夠數(shù)量的 Sentinel (哨兵)進(jìn)程同意 Master 主服務(wù)器下線, Master 主服務(wù)器的客觀下線狀態(tài)就會(huì)被移除。若 Master 主服務(wù)器重新向 Sentinel (哨兵)進(jìn)程發(fā)送 PING 命令返回有效回復(fù), Master 主服務(wù)器的主觀下線狀態(tài)就會(huì)被移除。
自動(dòng)故障遷移
- 它會(huì)將失效 Master 的其中一個(gè) Slave 升級(jí)為新的 Master , 并讓失效 Master 的其他 Slave 改為復(fù)制新的 Master ;
- 當(dāng)客戶端試圖連接失效的 Master 時(shí),集群也會(huì)向客戶端返回新 Master 的地址,使得集群可以使用現(xiàn)在的 Master 替換失效 Master 。
- Master 和 Slave 服務(wù)器切換后, Master 的 redis.conf 、 Slave 的 redis.conf 和 sentinel.conf 的配置文件的內(nèi)容都會(huì)發(fā)生相應(yīng)的改變,即, Master 主服務(wù)器的 redis.conf配置文件中會(huì)多一行 slaveof 的配置, sentinel.conf 的監(jiān)控目標(biāo)會(huì)隨之調(diào)換。
案例演示
修改從機(jī)的 sentinel.conf :
# 哨兵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 monitor <master-name> <master ip> <master port> <quorum> sentinel monitor mymaster 192.168.10.133 6379 1
其他配置項(xiàng)說明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 monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor mymaster 127.0.0.1 6379 2 # 當(dāng)在Redis實(shí)例中開啟了requirepass foobared 授權(quán)密碼 這樣所有連接Redis實(shí)例的客戶端都 要提供密碼 # 設(shè)置哨兵sentinel 連接主從的密碼 注意必須為主從設(shè)置一樣的驗(yàn)證密碼 # sentinel auth-pass <master-name> <password> sentinel auth-pass mymaster MySUPER--secret-0123passw0rd # 指定多少毫秒之后 主節(jié)點(diǎn)沒有應(yīng)答哨兵sentinel 此時(shí) 哨兵主觀上認(rèn)為主節(jié)點(diǎn)下線 默認(rèn)30秒 # sentinel down-after-milliseconds <master-name> <milliseconds> sentinel 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而不可用。 # 可以通過將這個(gè)值設(shè)為 1 來保證每次只有一個(gè)slave 處于不能處理命令請(qǐng)求的狀態(tài)。 # sentinel parallel-syncs <master-name> <numslaves> sentinel 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ù)開始計(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í)間。不過,即使過了這個(gè)超 時(shí),slaves依然會(huì)被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來了 # 默認(rèn)三分鐘 # sentinel failover-timeout <master-name> <milliseconds> sentinel failover-timeout mymaster 180000 # SCRIPTS EXECUTION # 配置當(dāng)某一事件發(fā)生時(shí)所需要執(zhí)行的腳本,可以通過腳本來通知管理員,例如當(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í)行過程中由于收到系統(tǒng)中斷信號(hào)被終止了,則同返回值為1時(shí)的行為相同。 #一個(gè)腳本的最大執(zhí)行時(shí)間為60s,如果超過這個(gè)時(shí)間,腳本將會(huì)被一個(gè)SIGKILL信號(hào)終止,之后重新執(zhí) 行。 #通知型腳本:當(dāng)sentinel有任何警告級(jí)別的事件發(fā)生時(shí)(比如說redis實(shí)例的主觀失效和客觀失效等 等),將會(huì)去調(diào)用這個(gè)腳本, #這時(shí)這個(gè)腳本應(yīng)該通過郵件,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-script <master-name> <script-path> sentinel 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í)傳給腳本: # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> # 目前<state>總是“failover”, # <role>是“l(fā)eader”或者“observer”中的一個(gè)。 # 參數(shù) from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的 slave)通信的 # 這個(gè)腳本應(yīng)該是通用的,能被多次調(diào)用,不是針對(duì)性的。 # sentinel client-reconfig-script <master-name> <script-path> sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
通過 redis-sentinel 啟動(dòng)哨兵服務(wù)
./redis-sentinel sentinel.conf
到此這篇關(guān)于Redis6 主從復(fù)制及哨兵機(jī)制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis6 主從復(fù)制及哨兵機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Govern Service 基于 Redis 的服務(wù)治理平臺(tái)安裝過程詳解
Govern Service 是一個(gè)輕量級(jí)、低成本的服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、 配置服務(wù) SDK,通過使用現(xiàn)有基礎(chǔ)設(shè)施中的 Redis 不用給運(yùn)維部署帶來額外的成本與負(fù)擔(dān),接下來通過本文給大家分享Govern Service 基于 Redis 的服務(wù)治理平臺(tái)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-05-05redis分布式鎖優(yōu)化的實(shí)現(xiàn)
本文主要介紹了redis分布式鎖優(yōu)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09如何使用redis的setnx實(shí)現(xiàn)分布式鎖
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時(shí),為 key 設(shè)置指定的值,這篇文章主要介紹了使用redis的setnx實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下2024-06-06redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08