配置文件中的各個(gè)參數(shù),詳解
2、主機(jī)(master)配置:
bind:0.0.0.0 #表示允許所有遠(yuǎn)程訪問。如果想指定限制訪問,可設(shè)置對(duì)應(yīng)的 ip。
port:6379 #關(guān)閉保護(hù)模式,可以外部訪問。
daemonize:yes # 設(shè)置為后臺(tái)啟動(dòng)。
logfile:./redis.log # 日志文件。
requirepass:pwdtest@2019 #設(shè)置 redis 連接密碼。
masterauth:pwdtest@2019 #slave 服務(wù)連接 master 的密碼
3、從機(jī)(slave)的配置和主機(jī)相似,不同的地方是需要使用replicaof指定主機(jī)(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof
當(dāng)本機(jī)為 slave 服務(wù)時(shí),設(shè)置 master 服務(wù)的IP地址及端口,在 redis 啟動(dòng)的時(shí)候會(huì)自動(dòng)跟 master 進(jìn)行數(shù)據(jù)同步
4、啟動(dòng):切換到 bin 目錄,使用./redis-server
即可啟動(dòng) redis 服務(wù),但是這種方式?jīng)]有指明配置文件,redis 將采用默認(rèn)配置,所以我們需要讓 redis 按照我們的配置文件來啟動(dòng),啟動(dòng)時(shí)指定剛才我們復(fù)制到 etc 文件夾下的redis.conf
三、Sentinel(哨兵)模式:
1、哨兵模式詳解
Redis Sentinel是Redis 的高可用性解決方案,由一個(gè)或多個(gè)Sentinel(哨兵)實(shí)例組成。它可以監(jiān)視任意多個(gè)主服務(wù)器,以及這些主服務(wù)器屬下的所有從服務(wù)器,并在被監(jiān)視的主服務(wù)器進(jìn)入下線狀態(tài)時(shí),自動(dòng)將下線主服務(wù)器屬下的某個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,它的主要功能如下:
監(jiān)控(Monitoring):Sentinel會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
通知(Notification):當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問題時(shí), Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。
故障遷移:當(dāng)主服務(wù)器不能正常工作時(shí),Sentinel會(huì)自動(dòng)進(jìn)行故障遷移,也就是主從切換。
統(tǒng)一的配置管理:連接者詢問sentinel取得主從的地址。
2、原理:
Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系統(tǒng),系統(tǒng)容錯(cuò),以及Leader選舉,每個(gè)Sentinel都需要定期的執(zhí)行以下任務(wù):
每個(gè) Sentinel 會(huì)自動(dòng)發(fā)現(xiàn)其他 Sentinel 和從服務(wù)器,它以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令。
如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù) PING 命令的時(shí)間超過 down-after-milliseconds 選項(xiàng)所指定的值, 那么這個(gè)實(shí)例會(huì)被 Sentinel 標(biāo)記為主觀下線。 有效回復(fù)可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
如果一個(gè)主服務(wù)器被標(biāo)記為主觀下線, 那么正在監(jiān)視這個(gè)主服務(wù)器的所有Sentinel要以每秒一次的頻率確認(rèn)主服務(wù)器的確進(jìn)入了主觀下線狀態(tài)。
如果一個(gè)主服務(wù)器被標(biāo)記為主觀下線, 并且有足夠數(shù)量的Sentinel(至少要達(dá)到配置文件指定的數(shù)量)在指定的時(shí)間范圍內(nèi)同意這一判斷, 那么這個(gè)主服務(wù)器被標(biāo)記為客觀下線。
在一般情況下, 每個(gè)Sentinel會(huì)以每 10 秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送 INFO 命令。 當(dāng)一個(gè)主服務(wù)器被Sentinel標(biāo)記為客觀下線時(shí),Sentinel向下線主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為每秒一次。
當(dāng)沒有足夠數(shù)量的Sentinel同意主服務(wù)器已經(jīng)下線, 主服務(wù)器的客觀下線狀態(tài)就會(huì)被移除。 當(dāng)主服務(wù)器重新向Sentinel的 PING 命令返回有效回復(fù)時(shí), 主服務(wù)器的主管下線狀態(tài)就會(huì)被移除。
3、哨兵的配置主要就是修改sentinel.conf配置文件中的參數(shù),在Redis安裝目錄即可看到此配置文件

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