Redis集群的Sentinel(哨兵)模式的搭建
一、哨兵模式整體架構(gòu):主從結(jié)構(gòu)+哨兵(sentinel),實現(xiàn)容災(zāi)的自動切換。
一個主節(jié)點(master)可擁有多個從節(jié)點(slave),從節(jié)點實現(xiàn)對主節(jié)點的復(fù)制,保證數(shù)據(jù)同步。而哨兵(sentinel)則對各節(jié)點進行監(jiān)控,主要包括主節(jié)點存活檢測、主從運行情況檢測等,一旦主節(jié)點宕機,哨兵可自動進行故障轉(zhuǎn)移 (failover)、主從切換。通常建議至少部署三個哨兵實例,這樣即使一個哨兵實例發(fā)生故障,其他兩個可以繼續(xù)進行故障檢測和轉(zhuǎn)移決策。
二、主從配置:
1、
配置文件中的各個參數(shù),詳解
2、主機(master)配置:bind:0.0.0.0 #表示允許所有遠(yuǎn)程訪問。如果想指定限制訪問,可設(shè)置對應(yīng)的 ip。port:6379 #關(guān)閉保護模式,可以外部訪問。 daemonize:yes # 設(shè)置為后臺啟動。logfile:./redis.log # 日志文件。requirepass:pwdtest@2019 #設(shè)置 redis 連接密碼。masterauth:pwdtest@2019 #slave 服務(wù)連接 master 的密碼
3、從機(slave)的配置和主機相似,不同的地方是需要使用replicaof指定主機(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof
當(dāng)本機為 slave 服務(wù)時,設(shè)置 master 服務(wù)的IP地址及端口,在 redis 啟動的時候會自動跟 master 進行數(shù)據(jù)同步
4、啟動:切換到 bin 目錄,使用./redis-server
即可啟動 redis 服務(wù),但是這種方式?jīng)]有指明配置文件,redis 將采用默認(rèn)配置,所以我們需要讓 redis 按照我們的配置文件來啟動,啟動時指定剛才我們復(fù)制到 etc 文件夾下的redis.conf
三、Sentinel(哨兵)模式:1、哨兵模式詳解 Redis Sentinel是Redis 的高可用性解決方案,由一個或多個Sentinel(哨兵)實例組成。它可以監(jiān)視任意多個主服務(wù)器,以及這些主服務(wù)器屬下的所有從服務(wù)器,并在被監(jiān)視的主服務(wù)器進入下線狀態(tài)時,自動將下線主服務(wù)器屬下的某個從服務(wù)器升級為新的主服務(wù)器,它的主要功能如下: 監(jiān)控(Monitoring):Sentinel會不斷地檢查你的主服務(wù)器和從服務(wù)器是否運作正常。 通知(Notification):當(dāng)被監(jiān)控的某個 Redis 服務(wù)器出現(xiàn)問題時, Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。 故障遷移:當(dāng)主服務(wù)器不能正常工作時,Sentinel會自動進行故障遷移,也就是主從切換。 統(tǒng)一的配置管理:連接者詢問sentinel取得主從的地址。
2、原理: Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系統(tǒng),系統(tǒng)容錯,以及Leader選舉,每個Sentinel都需要定期的執(zhí)行以下任務(wù): 每個 Sentinel 會自動發(fā)現(xiàn)其他 Sentinel 和從服務(wù)器,它以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實例發(fā)送一個 PING 命令。 如果一個實例(instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那么這個實例會被 Sentinel 標(biāo)記為主觀下線。 有效回復(fù)可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。 如果一個主服務(wù)器被標(biāo)記為主觀下線, 那么正在監(jiān)視這個主服務(wù)器的所有Sentinel要以每秒一次的頻率確認(rèn)主服務(wù)器的確進入了主觀下線狀態(tài)。 如果一個主服務(wù)器被標(biāo)記為主觀下線, 并且有足夠數(shù)量的Sentinel(至少要達(dá)到配置文件指定的數(shù)量)在指定的時間范圍內(nèi)同意這一判斷, 那么這個主服務(wù)器被標(biāo)記為客觀下線。 在一般情況下, 每個Sentinel會以每 10 秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送 INFO 命令。 當(dāng)一個主服務(wù)器被Sentinel標(biāo)記為客觀下線時,Sentinel向下線主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次。 當(dāng)沒有足夠數(shù)量的Sentinel同意主服務(wù)器已經(jīng)下線, 主服務(wù)器的客觀下線狀態(tài)就會被移除。 當(dāng)主服務(wù)器重新向Sentinel的 PING 命令返回有效回復(fù)時, 主服務(wù)器的主管下線狀態(tài)就會被移除。 3、哨兵的配置主要就是修改sentinel.conf配置文件中的參數(shù),在Redis安裝目錄即可看到此配置文件
# 哨兵sentinel實例運行的端口,默認(rèn)26379
port 26379
# 哨兵sentinel的工作目錄
dir ./
# 是否開啟保護模式,默認(rèn)開啟。
protected-mode:no
# 是否設(shè)置為后臺啟動。
daemonize:yes
# 哨兵sentinel的日志文件
logfile:./sentinel.log
# 哨兵sentinel監(jiān)控的redis主節(jié)點的
## ip:主機ip地址
## port:哨兵端口號
## master-name:可以自己命名的主節(jié)點名字(只能由字母A-z、數(shù)字0-9 、這三個字符".-_"組成。)
## quorum:當(dāng)這些quorum個數(shù)sentinel哨兵認(rèn)為master主節(jié)點失聯(lián) 那么這時 客觀上認(rèn)為主節(jié)點失聯(lián)了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 當(dāng)在Redis實例中開啟了requirepass,所有連接Redis實例的客戶端都要提供密碼。
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
# 指定主節(jié)點應(yīng)答哨兵sentinel的最大時間間隔,超過這個時間,哨兵主觀上認(rèn)為主節(jié)點下線,默認(rèn)30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 指定了在發(fā)生failover主備切換時,最多可以有多少個slave同時對新的master進行同步。這個數(shù)字越小,完成failover所需的時間就越長;反之,但是如果這個數(shù)字越大,就意味著越多的slave因為replication而不可用??梢酝ㄟ^將這個值設(shè)為1,來保證每次只有一個slave,處于不能處理命令請求的狀態(tài)。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障轉(zhuǎn)移的超時時間failover-timeout,默認(rèn)三分鐘,可以用在以下這些方面:
## 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
## 2. 當(dāng)一個slave從一個錯誤的master那里同步數(shù)據(jù)時開始,直到slave被糾正為從正確的master那里同步數(shù)據(jù)時結(jié)束。
## 3. 當(dāng)想要取消一個正在進行的failover時所需要的時間。
## 4.當(dāng)進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來同步數(shù)據(jù)了
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# 當(dāng)sentinel有任何警告級別的事件發(fā)生時(比如說redis實例的主觀失效和客觀失效等等),將會去調(diào)用這個腳本。一個腳本的最大執(zhí)行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執(zhí)行。
# 對于腳本的運行結(jié)果有以下規(guī)則:
## 1. 若腳本執(zhí)行后返回1,那么該腳本稍后將會被再次執(zhí)行,重復(fù)次數(shù)目前默認(rèn)為10。
## 2. 若腳本執(zhí)行后返回2,或者比2更高的一個返回值,腳本將不會重復(fù)執(zhí)行。
## 3. 如果腳本在執(zhí)行過程中由于收到系統(tǒng)中斷信號被終止了,則同返回值為1時的行為相同。
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 這個腳本應(yīng)該是通用的,能被多次調(diào)用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/
4、搭建:編輯 sentinel.conf,配置文件修改如
//端口默認(rèn)為26379。
port:26379
//關(guān)閉保護模式,可以外部訪問。
protected-mode:no
//設(shè)置為后臺啟動。
daemonize:yes
//日志文件。
logfile:./sentinel.log
//指定主機IP地址和端口,并且指定當(dāng)有2臺哨兵認(rèn)為主機掛了,則對主機進行容災(zāi)切換。
sentinel monitor mymaster 192.168.231.130 6379 2
//當(dāng)在Redis實例中開啟了requirepass,這里就需要提供密碼。
sentinel auth-pass mymaster pwdtest@2019
//這里設(shè)置了主機多少秒無響應(yīng),則認(rèn)為掛了。
sentinel down-after-milliseconds mymaster 3000
//主備切換時,最多有多少個slave同時對新的master進行同步,這里設(shè)置為默認(rèn)的1。
sentinel parallel-syncs mymaster 1
//故障轉(zhuǎn)移的超時時間,這里設(shè)置為三分鐘。
sentinel failover-timeout mymaster 180000
5、啟動:redis-sentinel ./entinel.conf(配置文件路徑)
三、缺點:
資源使用:每個 Sentinel 實例也會占用系統(tǒng)資源,包括 CPU 和內(nèi)存,尤其是在大型集群中。網(wǎng)絡(luò)依賴性:Sentinel 的效果很大程度上依賴于網(wǎng)絡(luò)的可靠性。網(wǎng)絡(luò)分區(qū)或是延遲高的情況可能會導(dǎo)致誤判或故障轉(zhuǎn)移延遲。冷啟動問題:如果所有 Redis 節(jié)點同時宕機,Sentinel 系統(tǒng)無法自動恢復(fù),需要手動干預(yù)來重新設(shè)置主節(jié)點和從節(jié)點。數(shù)據(jù)丟失風(fēng)險:在發(fā)生故障轉(zhuǎn)移時,如果還有未同步到從節(jié)點的數(shù)據(jù),那么這部分?jǐn)?shù)據(jù)可能會丟失。這是因為 Redis 使用異步復(fù)制。
四、寫操作局限性單點瓶頸:在一主多從架構(gòu)中,所有寫操作都必須由主節(jié)點處理。這意味著主節(jié)點的處理能力和資源(CPU、內(nèi)存、網(wǎng)絡(luò)帶寬)將直接限制系統(tǒng)的寫入吞吐量。數(shù)據(jù)同步延遲:盡管從節(jié)點可以提供讀擴展性,它們依賴于與主節(jié)點的數(shù)據(jù)同步。高寫負(fù)載情況下,數(shù)據(jù)復(fù)制到從節(jié)點可能會經(jīng)歷延遲,影響了數(shù)據(jù)的最終一致性。故障風(fēng)險:如主節(jié)點出現(xiàn)故障,整個系統(tǒng)的寫能力會喪失直到故障轉(zhuǎn)移完成并且一個從節(jié)點被提升為新的主節(jié)點。這個過程可能會導(dǎo)致服務(wù)中斷。
當(dāng)本機為 slave 服務(wù)時,設(shè)置 master 服務(wù)的IP地址及端口,在 redis 啟動的時候會自動跟 master 進行數(shù)據(jù)同步
4、啟動:切換到 bin 目錄,使用
./redis-server
即可啟動 redis 服務(wù),但是這種方式?jīng)]有指明配置文件,redis 將采用默認(rèn)配置,所以我們需要讓 redis 按照我們的配置文件來啟動,啟動時指定剛才我們復(fù)制到 etc 文件夾下的redis.conf
三、Sentinel(哨兵)模式:
1、哨兵模式詳解
Redis Sentinel是Redis 的高可用性解決方案,由一個或多個Sentinel(哨兵)實例組成。它可以監(jiān)視任意多個主服務(wù)器,以及這些主服務(wù)器屬下的所有從服務(wù)器,并在被監(jiān)視的主服務(wù)器進入下線狀態(tài)時,自動將下線主服務(wù)器屬下的某個從服務(wù)器升級為新的主服務(wù)器,它的主要功能如下:
監(jiān)控(Monitoring):Sentinel會不斷地檢查你的主服務(wù)器和從服務(wù)器是否運作正常。
通知(Notification):當(dāng)被監(jiān)控的某個 Redis 服務(wù)器出現(xiàn)問題時, Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。
故障遷移:當(dāng)主服務(wù)器不能正常工作時,Sentinel會自動進行故障遷移,也就是主從切換。
統(tǒng)一的配置管理:連接者詢問sentinel取得主從的地址。
2、原理:
Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系統(tǒng),系統(tǒng)容錯,以及Leader選舉,每個Sentinel都需要定期的執(zhí)行以下任務(wù):
每個 Sentinel 會自動發(fā)現(xiàn)其他 Sentinel 和從服務(wù)器,它以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實例發(fā)送一個 PING 命令。
如果一個實例(instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那么這個實例會被 Sentinel 標(biāo)記為主觀下線。 有效回復(fù)可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
如果一個主服務(wù)器被標(biāo)記為主觀下線, 那么正在監(jiān)視這個主服務(wù)器的所有Sentinel要以每秒一次的頻率確認(rèn)主服務(wù)器的確進入了主觀下線狀態(tài)。
如果一個主服務(wù)器被標(biāo)記為主觀下線, 并且有足夠數(shù)量的Sentinel(至少要達(dá)到配置文件指定的數(shù)量)在指定的時間范圍內(nèi)同意這一判斷, 那么這個主服務(wù)器被標(biāo)記為客觀下線。
在一般情況下, 每個Sentinel會以每 10 秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送 INFO 命令。 當(dāng)一個主服務(wù)器被Sentinel標(biāo)記為客觀下線時,Sentinel向下線主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
當(dāng)沒有足夠數(shù)量的Sentinel同意主服務(wù)器已經(jīng)下線, 主服務(wù)器的客觀下線狀態(tài)就會被移除。 當(dāng)主服務(wù)器重新向Sentinel的 PING 命令返回有效回復(fù)時, 主服務(wù)器的主管下線狀態(tài)就會被移除。
3、哨兵的配置主要就是修改sentinel.conf配置文件中的參數(shù),在Redis安裝目錄即可看到此配置文件

# 哨兵sentinel實例運行的端口,默認(rèn)26379
port 26379
# 哨兵sentinel的工作目錄
dir ./
# 是否開啟保護模式,默認(rèn)開啟。
protected-mode:no
# 是否設(shè)置為后臺啟動。
daemonize:yes
# 哨兵sentinel的日志文件
logfile:./sentinel.log
# 哨兵sentinel監(jiān)控的redis主節(jié)點的
## ip:主機ip地址
## port:哨兵端口號
## master-name:可以自己命名的主節(jié)點名字(只能由字母A-z、數(shù)字0-9 、這三個字符".-_"組成。)
## quorum:當(dāng)這些quorum個數(shù)sentinel哨兵認(rèn)為master主節(jié)點失聯(lián) 那么這時 客觀上認(rèn)為主節(jié)點失聯(lián)了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 當(dāng)在Redis實例中開啟了requirepass,所有連接Redis實例的客戶端都要提供密碼。
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
# 指定主節(jié)點應(yīng)答哨兵sentinel的最大時間間隔,超過這個時間,哨兵主觀上認(rèn)為主節(jié)點下線,默認(rèn)30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 指定了在發(fā)生failover主備切換時,最多可以有多少個slave同時對新的master進行同步。這個數(shù)字越小,完成failover所需的時間就越長;反之,但是如果這個數(shù)字越大,就意味著越多的slave因為replication而不可用??梢酝ㄟ^將這個值設(shè)為1,來保證每次只有一個slave,處于不能處理命令請求的狀態(tài)。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障轉(zhuǎn)移的超時時間failover-timeout,默認(rèn)三分鐘,可以用在以下這些方面:
## 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
## 2. 當(dāng)一個slave從一個錯誤的master那里同步數(shù)據(jù)時開始,直到slave被糾正為從正確的master那里同步數(shù)據(jù)時結(jié)束。
## 3. 當(dāng)想要取消一個正在進行的failover時所需要的時間。
## 4.當(dāng)進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來同步數(shù)據(jù)了
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# 當(dāng)sentinel有任何警告級別的事件發(fā)生時(比如說redis實例的主觀失效和客觀失效等等),將會去調(diào)用這個腳本。一個腳本的最大執(zhí)行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執(zhí)行。
# 對于腳本的運行結(jié)果有以下規(guī)則:
## 1. 若腳本執(zhí)行后返回1,那么該腳本稍后將會被再次執(zhí)行,重復(fù)次數(shù)目前默認(rèn)為10。
## 2. 若腳本執(zhí)行后返回2,或者比2更高的一個返回值,腳本將不會重復(fù)執(zhí)行。
## 3. 如果腳本在執(zhí)行過程中由于收到系統(tǒng)中斷信號被終止了,則同返回值為1時的行為相同。
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 這個腳本應(yīng)該是通用的,能被多次調(diào)用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/
4、搭建:編輯 sentinel.conf,配置文件修改如
//端口默認(rèn)為26379。 port:26379 //關(guān)閉保護模式,可以外部訪問。 protected-mode:no //設(shè)置為后臺啟動。 daemonize:yes //日志文件。 logfile:./sentinel.log //指定主機IP地址和端口,并且指定當(dāng)有2臺哨兵認(rèn)為主機掛了,則對主機進行容災(zāi)切換。 sentinel monitor mymaster 192.168.231.130 6379 2 //當(dāng)在Redis實例中開啟了requirepass,這里就需要提供密碼。 sentinel auth-pass mymaster pwdtest@2019 //這里設(shè)置了主機多少秒無響應(yīng),則認(rèn)為掛了。 sentinel down-after-milliseconds mymaster 3000 //主備切換時,最多有多少個slave同時對新的master進行同步,這里設(shè)置為默認(rèn)的1。 sentinel parallel-syncs mymaster 1 //故障轉(zhuǎn)移的超時時間,這里設(shè)置為三分鐘。 sentinel failover-timeout mymaster 180000
//端口默認(rèn)為26379。 port:26379 //關(guān)閉保護模式,可以外部訪問。 protected-mode:no //設(shè)置為后臺啟動。 daemonize:yes //日志文件。 logfile:./sentinel.log //指定主機IP地址和端口,并且指定當(dāng)有2臺哨兵認(rèn)為主機掛了,則對主機進行容災(zāi)切換。 sentinel monitor mymaster 192.168.231.130 6379 2 //當(dāng)在Redis實例中開啟了requirepass,這里就需要提供密碼。 sentinel auth-pass mymaster pwdtest@2019 //這里設(shè)置了主機多少秒無響應(yīng),則認(rèn)為掛了。 sentinel down-after-milliseconds mymaster 3000 //主備切換時,最多有多少個slave同時對新的master進行同步,這里設(shè)置為默認(rèn)的1。 sentinel parallel-syncs mymaster 1 //故障轉(zhuǎn)移的超時時間,這里設(shè)置為三分鐘。 sentinel failover-timeout mymaster 180000
5、啟動:redis-sentinel ./entinel.conf(配置文件路徑)
三、缺點:
三、缺點:
資源使用:每個 Sentinel 實例也會占用系統(tǒng)資源,包括 CPU 和內(nèi)存,尤其是在大型集群中。
網(wǎng)絡(luò)依賴性:Sentinel 的效果很大程度上依賴于網(wǎng)絡(luò)的可靠性。網(wǎng)絡(luò)分區(qū)或是延遲高的情況可能會導(dǎo)致誤判或故障轉(zhuǎn)移延遲。
冷啟動問題:如果所有 Redis 節(jié)點同時宕機,Sentinel 系統(tǒng)無法自動恢復(fù),需要手動干預(yù)來重新設(shè)置主節(jié)點和從節(jié)點。
數(shù)據(jù)丟失風(fēng)險:在發(fā)生故障轉(zhuǎn)移時,如果還有未同步到從節(jié)點的數(shù)據(jù),那么這部分?jǐn)?shù)據(jù)可能會丟失。這是因為 Redis 使用異步復(fù)制。
四、寫操作局限性
四、寫操作局限性
單點瓶頸:在一主多從架構(gòu)中,所有寫操作都必須由主節(jié)點處理。這意味著主節(jié)點的處理能力和資源(CPU、內(nèi)存、網(wǎng)絡(luò)帶寬)將直接限制系統(tǒng)的寫入吞吐量。
數(shù)據(jù)同步延遲:盡管從節(jié)點可以提供讀擴展性,它們依賴于與主節(jié)點的數(shù)據(jù)同步。高寫負(fù)載情況下,數(shù)據(jù)復(fù)制到從節(jié)點可能會經(jīng)歷延遲,影響了數(shù)據(jù)的最終一致性。
故障風(fēng)險:如主節(jié)點出現(xiàn)故障,整個系統(tǒng)的寫能力會喪失直到故障轉(zhuǎn)移完成并且一個從節(jié)點被提升為新的主節(jié)點。這個過程可能會導(dǎo)致服務(wù)中斷。
posted on 2024-07-11 22:22 Benjamin 閱讀(74) 評論(0) 編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫