哨兵是建立在redis主從集羣的基礎上的,所以本文是承接上一篇redis主從複製的。一主二從三哨兵,哨兵也是部在主從節點上的,端口爲26379
主從節點
master
node01 192.168.71.101 6379
slave1
node02 192.168.71.102 6379
slave2
node03 192.168.71.103 6379
哨兵節點
sentinel1
192.168.71.101 26379
sentinel2
192.168.71.102 26379
sentinel3
192.168.71.103 26379
哨兵配置
開啓守護進程
daemonize yes
關閉保護模式
protected-mode no
指定監聽主服務器名稱、ip、port和幾個sentinel檢測異常執行故障轉移
#mymaster是自定義的,因爲我是三哨兵,所以指定當有2個哨兵檢測到異常才執行故障轉移
sentinel monitor mymaster 192.168.71.102 6379 2
指定監聽服務器密碼
#注意這個步驟必須在指定監聽服務器名稱後面,不然會報不知道mymaster
sentinel auth-pass mymaster 123456
其他配置使用默認配置
端口
port 26379
指定sentinel判定master斷線時長
sentinel down-after-milliseconds mymaster 30000
指定故障切換超時時長
sentinel failover-timeout mymaster 900000
指定sentinel日誌文件
logfile "/opt/redis/log/sentinel.log"
三臺哨兵的配置都是一樣的,配置完成後,分別啓動三臺機子的redis服務進程和sentinel服務進程
#啓動redis服務進程
./redis-server ../redis.conf
#啓動sentinel服務進程
./redis-server ../sentinel.conf --sentinel
#或者
./redis-sentinel ../sentinel.conf
打開192.168.71.101節點的sentinel日誌文件查看有以下內容
[root@node03 log]# tail -20 sentinel.log
10656:X 17 Jun 14:00:43.355 * Running mode=sentinel, port=26379.
10656:X 17 Jun 14:00:43.356 # Sentinel ID is 69eba2364497f8ea68131787de656207cec5ee0e
10656:X 17 Jun 14:00:43.356 # +monitor master mymaster 192.168.71.101 6379 quorum 2
10656:X 17 Jun 14:00:43.356 * +slave slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:00:43.372 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:01:10.429 * +sentinel sentinel f0fc111b6d3ad60914566d2df3b5ee592415f3e4 192.168.71.102 26379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:01:26.347 * +sentinel sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
打開192.168.71.102節點的sentinel日誌文件查看有以下內容
[root@node03 log]# tail -20 sentinel.log
6254:X 17 Jun 14:01:34.097 * Running mode=sentinel, port=26379.
6254:X 17 Jun 14:01:34.098 # Sentinel ID is f0fc111b6d3ad60914566d2df3b5ee592415f3e4
6254:X 17 Jun 14:01:34.098 # +monitor master mymaster 192.168.71.101 6379 quorum 2
6254:X 17 Jun 14:01:34.099 * +slave slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
6254:X 17 Jun 14:01:34.118 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
6254:X 17 Jun 14:01:35.644 * +sentinel sentinel 69eba2364497f8ea68131787de656207cec5ee0e 192.168.71.101 26379 @ mymaster 192.168.71.101 6379
6254:X 17 Jun 14:01:52.041 * +sentinel sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
打開192.168.71.103節點的sentinel日誌文件查看有以下內容
[root@node03 log]# tail -20 sentinel.log
3798:X 18 Jun 03:43:30.475 * Running mode=sentinel, port=26379.
3798:X 18 Jun 03:43:30.475 # Sentinel ID is d445b01ec9d79f90fe9f3d0377906be2290399f3
3798:X 18 Jun 03:43:30.475 # +monitor master mymaster 192.168.71.101 6379 quorum 2
3798:X 18 Jun 03:43:30.476 * +slave slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:43:30.486 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:43:30.769 * +sentinel sentinel f0fc111b6d3ad60914566d2df3b5ee592415f3e4 192.168.71.102 26379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:43:32.396 * +sentinel sentinel 69eba2364497f8ea68131787de656207cec5ee0e 192.168.71.101 26379 @ mymaster 192.168.71.101 6379
驗證高可用
手動kill掉master 192.168.71.101節點的redis服務進程
[root@node01 log]# ps -ef|grep redis
root 10644 1 0 13:56 ? 00:00:00 src/redis-server 0.0.0.0:6379
root 10656 10545 0 14:00 pts/1 00:00:00 ./redis-server *:26379 [sentinel]
root 10695 10676 0 14:05 pts/0 00:00:00 grep redis
[root@node01 log]# kill -9 10644
30s後觀察192.168.71.102和192.168.71.103兩臺sentinel日誌文件變化,這個30s就是上面指定sentinel判定master斷線的時長
sentinel down-after-milliseconds mymaster 30000
可以看到sentinel在投票選舉新的master,並會自動修改redis.conf和sentinel.conf文件保證集羣的高可用。
192.168.71.101節點的sentinel日誌
[root@node01 log]# tail -f sentinel.log
10656:X 17 Jun 14:01:10.429 * +sentinel sentinel f0fc111b6d3ad60914566d2df3b5ee592415f3e4 192.168.71.102 26379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:01:26.347 * +sentinel sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:06:36.683 # +sdown master mymaster 192.168.71.101 6379
10656:X 17 Jun 14:06:36.827 # +new-epoch 1
10656:X 17 Jun 14:06:36.830 # +vote-for-leader d445b01ec9d79f90fe9f3d0377906be2290399f3 1
10656:X 17 Jun 14:06:37.309 # +config-update-from sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
10656:X 17 Jun 14:06:37.310 # +switch-master mymaster 192.168.71.101 6379 192.168.71.102 6379
10656:X 17 Jun 14:06:37.310 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.102 6379
10656:X 17 Jun 14:06:37.310 * +slave slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
10656:X 17 Jun 14:07:07.316 # +sdown slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
192.168.71.102節點的sentinel日誌
6254:X 17 Jun 14:07:02.426 # +sdown master mymaster 192.168.71.101 6379
6254:X 17 Jun 14:07:02.519 # +new-epoch 1
6254:X 17 Jun 14:07:02.524 # +vote-for-leader d445b01ec9d79f90fe9f3d0377906be2290399f3 1
6254:X 17 Jun 14:07:02.526 # +odown master mymaster 192.168.71.101 6379 #quorum 2/2
6254:X 17 Jun 14:07:02.526 # Next failover delay: I will not start a failover before Mon Jun 17 14:37:03 2019
6254:X 17 Jun 14:07:03.004 # +config-update-from sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
6254:X 17 Jun 14:07:03.004 # +switch-master mymaster 192.168.71.101 6379 192.168.71.102 6379
6254:X 17 Jun 14:07:03.004 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 14:07:03.004 * +slave slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 14:07:33.052 # +sdown slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
192.168.71.103節點的sentinel日誌
3798:X 18 Jun 03:48:42.871 # +sdown master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:42.943 # +odown master mymaster 192.168.71.101 6379 #quorum 3/2
3798:X 18 Jun 03:48:42.943 # +new-epoch 1
3798:X 18 Jun 03:48:42.943 # +try-failover master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:42.945 # +vote-for-leader d445b01ec9d79f90fe9f3d0377906be2290399f3 1
3798:X 18 Jun 03:48:42.952 # f0fc111b6d3ad60914566d2df3b5ee592415f3e4 voted for d445b01ec9d79f90fe9f3d0377906be2290399f3 1
3798:X 18 Jun 03:48:42.952 # 69eba2364497f8ea68131787de656207cec5ee0e voted for d445b01ec9d79f90fe9f3d0377906be2290399f3 1
3798:X 18 Jun 03:48:43.001 # +elected-leader master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.001 # +failover-state-select-slave master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.067 # +selected-slave slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.067 * +failover-state-send-slaveof-noone slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.168 * +failover-state-wait-promotion slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.324 # +promoted-slave slave 192.168.71.102:6379 192.168.71.102 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.324 # +failover-state-reconf-slaves master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:43.423 * +slave-reconf-sent slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:44.064 # -odown master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:44.354 * +slave-reconf-inprog slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:44.354 * +slave-reconf-done slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:44.444 # +failover-end master mymaster 192.168.71.101 6379
3798:X 18 Jun 03:48:44.444 # +switch-master mymaster 192.168.71.101 6379 192.168.71.102 6379
3798:X 18 Jun 03:48:44.444 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.102 6379
3798:X 18 Jun 03:48:44.444 * +slave slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
3798:X 18 Jun 03:49:14.487 # +sdown slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
從日誌可以看出最後新投票選的master是192.168.71.102節點,這時再去啓動老master 192.168.71.101的redis服務,哨兵會將192.168.71.101轉成192.168.71.102的slave,從192.168.71.102 sentinel日誌可以看到信息
[root@node02 log]# tail -f sentinel.log
6254:X 17 Jun 14:07:02.426 # +sdown master mymaster 192.168.71.101 6379
6254:X 17 Jun 14:07:02.519 # +new-epoch 1
6254:X 17 Jun 14:07:02.524 # +vote-for-leader d445b01ec9d79f90fe9f3d0377906be2290399f3 1
6254:X 17 Jun 14:07:02.526 # +odown master mymaster 192.168.71.101 6379 #quorum 2/2
6254:X 17 Jun 14:07:02.526 # Next failover delay: I will not start a failover before Mon Jun 17 14:37:03 2019
6254:X 17 Jun 14:07:03.004 # +config-update-from sentinel d445b01ec9d79f90fe9f3d0377906be2290399f3 192.168.71.103 26379 @ mymaster 192.168.71.101 6379
6254:X 17 Jun 14:07:03.004 # +switch-master mymaster 192.168.71.101 6379 192.168.71.102 6379
6254:X 17 Jun 14:07:03.004 * +slave slave 192.168.71.103:6379 192.168.71.103 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 14:07:03.004 * +slave slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 14:07:33.052 # +sdown slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 18:14:50.840 # -sdown slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 18:15:00.777 * +convert-to-slave slave 192.168.71.101:6379 192.168.71.101 6379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 18:15:06.193 # +sdown sentinel 69eba2364497f8ea68131787de656207cec5ee0e 192.168.71.101 26379 @ mymaster 192.168.71.102 6379
6254:X 17 Jun 18:16:17.556 # -sdown sentinel 69eba2364497f8ea68131787de656207cec5ee0e 192.168.71.101 26379 @ mymaster 192.168.71.102 6379