1、准備三個Redis配置文件、redis6379.conf、redis6380.conf、redis6381.conf,其中6379為主機,6380,6381為從機
--6379文件 # bind 127.0.0.1 -::1 # 靜止綁定本地ip protected-mode no # 保護模式關閉 port 6379 # 端口號6379 daemonize yes # 默認守護進程修改 pidfile /var/run/redis_6379.pid # 守護進程id logfile "6379.log" # 日志文件名 dbfilename dump6379.rdb # rdb文件名修改
--6380文件 port 6380 # 端口號6380 pidfile /var/run/redis_6380.pid # 守護進程id logfile "6380.log" # 日志文件名 dbfilename dump6380.rdb # rdb文件名修改
--6381文件 port 6381 # 端口號6381 pidfile /var/run/redis_6381.pid # 守護進程id logfile "6381.log" # 日志文件名 dbfilename dump6381.rdb # rdb文件名修改
2、來到redis的安裝路徑會看到一個redis-sentinel,配置一個初步的哨兵文件:
sentinel monitor myredis 192.168.25.110 6379 1 sentinel monitor 主機名稱 ip 端口 1(表示主機掛了,會有一個投票的過程)
3、啟動哨兵
[root@centos-oracle config_sentinel]# redis-sentinel sentinel.conf 23819:X 07 Sep 2021 07:57:38.717 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 23819:X 07 Sep 2021 07:57:38.717 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=23819, just started 23819:X 07 Sep 2021 07:57:38.717 # Configuration loaded 23819:X 07 Sep 2021 07:57:38.720 * Increased maximum number of open files to 10032 (it was originally set to 1024). 23819:X 07 Sep 2021 07:57:38.720 * monotonic clock: POSIX clock_gettime _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 6.2.1 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 23819 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 23819:X 07 Sep 2021 07:57:38.723 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 23819:X 07 Sep 2021 07:57:38.727 # Sentinel ID is a595dbeb27b5482d5401ad2466cbedb4f6431cd7 23819:X 07 Sep 2021 07:57:38.727 # +monitor master myredis 192.168.25.110 6379 quorum 1 23819:X 07 Sep 2021 07:57:38.730 * +slave slave 192.168.25.110:6380 192.168.25.110 6380 @ myredis 192.168.25.110 6379 23819:X 07 Sep 2021 07:57:38.746 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 192.168.25.110 6379
4、完成基本的主從操作測試,增刪操作,可以看見完全支持基本的主從操作。
5、如果主機6379宕機,原來的主機6379回來了,會自動配置到6380(6380是由哨兵配置文件的從機6380、6381選出的6380為主機)下面當從機
優點
1、哨兵集群,基於主從復制模式,所有的主從配置優點,它全有
2、主從切換,故障可轉移,系統可用性好
3、哨兵模式就是主從模式的升級,手動到自動,更加健壯
缺點
1、Redis不好在線擴容,集群容量一旦達到上限,在線擴容很麻煩
2、實現哨兵模式的配置其實是很麻煩的,里面有很多選擇
哨兵模式的全部配置,可根據自己需要進行相關配置
# Example sentinel.conf # 哨兵sentinel實例運行的端口 默認26379 port 26379 # 哨兵sentinel的工作目錄 dir /tmp # 哨兵sentinel監控的redis主節點的 ip port # master-name 可以自己命名的主節點名字 只能由字母A-z、數字0-9 、這三個字符".-_"組成。 # quorum 當這些quorum個數sentinel哨兵認為master主節點失聯 那么這時 客觀上認為主節點失聯了 # sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor mymaster 127.0.0.1 6379 1 # 當在Redis實例中開啟了requirepass foobared 授權密碼 這樣所有連接Redis實例的客戶端都要提供密碼 # 設置哨兵sentinel 連接主從的密碼 注意必須為主從設置一樣的驗證密碼 # sentinel auth-pass <master-name> <password> sentinel auth-pass mymaster MySUPER--secret-0123passw0rd # 指定多少毫秒之后 主節點沒有應答哨兵sentinel 此時 哨兵主觀上認為主節點下線 默認30秒 # sentinel down-after-milliseconds <master-name> <milliseconds> sentinel down-after-milliseconds mymaster 30000 # 這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步, 這個數字越小,完成failover所需的時間就越長, 但是如果這個數字越大,就意味着越 多的slave因為replication而不可用。 可以通過將這個值設為 1 來保證每次只有一個slave 處於不能處理命令請求的狀態。 # sentinel parallel-syncs <master-name> <numslaves> sentinel parallel-syncs mymaster 1 # 故障轉移的超時時間 failover-timeout 可以用在以下這些方面: #1. 同一個sentinel對同一個master兩次failover之間的間隔時間。 #2. 當一個slave從一個錯誤的master那里同步數據開始計算時間。直到slave被糾正為向正確的master那里同步數據時。 #3.當想要取消一個正在進行的failover所需要的時間。 #4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規則來了 # 默認三分鍾 # sentinel failover-timeout <master-name> <milliseconds> sentinel failover-timeout mymaster 180000 # SCRIPTS EXECUTION #配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理員,例如當系統運行不正常時發郵件通知相關人員。 #對於腳本的運行結果有以下規則: #若腳本執行后返回1,那么該腳本稍后將會被再次執行,重復次數目前默認為10 #若腳本執行后返回2,或者比2更高的一個返回值,腳本將不會重復執行。 #如果腳本在執行過程中由於收到系統中斷信號被終止了,則同返回值為1時的行為相同。 #一個腳本的最大執行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執行。 #通知型腳本:當sentinel有任何警告級別的事件發生時(比如說redis實例的主觀失效和客觀失效等等),將會去調用這個腳本, #這時這個腳本應該通過郵件,SMS等方式去通知系統管理員關於系統不正常運行的信息。調用該腳本時,將傳給腳本兩個參數, #一個是事件的類型, #一個是事件的描述。 #如果sentinel.conf配置文件中配置了這個腳本路徑,那么必須保證這個腳本存在於這個路徑,並且是可執行的,否則sentinel無法正常啟動成功。 #通知腳本 # sentinel notification-script <master-name> <script-path> sentinel notification-script mymaster /var/redis/notify.sh # 客戶端重新配置主節點參數腳本 # 當一個master由於failover而發生改變時,這個腳本將會被調用,通知相關的客戶端關於master地址已經發生改變的信息。 # 以下參數將會在調用腳本時傳給腳本: # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> # 目前<state>總是“failover”, # <role>是“leader”或者“observer”中的一個。 # 參數 from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的slave)通信的 # 這個腳本應該是通用的,能被多次調用,不是針對性的。 # sentinel client-reconfig-script <master-name> <script-path> sentinel client-reconfig-script mymaster /var/redis/reconfig.sh