1.爲什麼要用哨兵?
在主從複製架構中,難免會出現宕機的情況,需要分情況看:
1.1 從庫宕機
在Redis中從庫重新啓動後會自動加入到主從架構中,自動完成同步數據(版本2.8之後是增量複製)。
1.2 主庫宕機
分兩步:
第一步,在從數據庫中執行SLAVEOF NO ONE命令,斷開主從關係並且提升爲主庫繼續服務;
第二步,將主庫重新啓動後,執行SLAVEOF命令,將其設置爲其他庫的從庫,這時數據就能更新回來;
很明顯,手動恢復是比較麻煩的,所以這個時候就用到哨兵機制了。
2.什麼是哨兵?
從字面的意思來看,哨兵的作用就是對redis的運行情況的一個監控,它是一個獨立的進程。功能有兩個:
2.1 監控主從數據庫是否運行正常
2.2 主數據庫故障後,自動的將從數據庫轉爲主數據庫
3.環境
一主多從6379,6380,6381
4.哨兵配置
先要創建哨兵配置文件
vim sentinel.conf
輸入內容:
sentinel monitor redisMaster 127.0.0.16379 1
參數說明:
redisMaster:監控主數據的名稱,自定義即可,可以使用大小寫字母和“.-_”符號
127.0.0.1:監控的主數據庫的IP
6379:監控的主數據庫的端口
1:最低通過票數
啓動哨兵進程:
redis-sentinel ./sentinel.conf
由上圖可以看到:
1、 哨兵已經啓動,它有一個自己的runid
2、 爲master數據庫添加了一個監控
3、 發現了2個slave(所以,哨兵無需配置slave,只需要指定master,哨兵會自動發現slave)
5.宕機分類 5.1從庫宕機
[root@localhost 6380]# redis-server redis.conf
[root@localhost 6380]# ps -ef|grep redis
root 2563 1 0 13:40 ? 00:00:05 redis-server *:6379
root 2772 2704 0 14:37 pts/0 00:00:11 redis-sentinel *:26379 [sentinel]
root 2781 1 0 14:38 ? 00:00:02 redis-server *:6381
root 2847 1 0 15:18 ? 00:00:00 redis-server *:6380
root 2852 2435 0 15:18 pts/1 00:00:00 grep --color=auto redis
kill -9 2847 將6380從庫強制殺掉,在哨兵的控制檯過一會會輸出: 2772:X 09 Nov 15:18:19.010 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
說明已經監控到slave宕機了,那麼,如果我們將6380端口的redis實例啓動後,會自動加入到主從複製嗎?
2772:X 09 Nov 15:23:17.709 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
2772:X 09 Nov 15:23:17.798 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
可以看出,slave從新加入到了主從複製中。-sdown:說明是恢復服務。
5.2 主庫宕機2772:X 09 Nov 15:27:31.135 # +sdown master redisMaster 127.0.0.1 6379 master服務已經宕機
2772:X 09 Nov 15:27:31.135 # +odown master redisMaster 127.0.0.1 6379 #quorum 1/1
2772:X 09 Nov 15:27:31.135 # +new-epoch 1
2772:X 09 Nov 15:27:31.135 # +try-failover master redisMaster 127.0.0.1 6379 開始恢復故障
2772:X 09 Nov 15:27:31.136 # +vote-for-leader 3063f4b0bfc7a657383266ffcb0d2fa9f5ab9b84 1 投票選舉哨兵leader,現在就一個哨兵所以leader就是自己
2772:X 09 Nov 15:27:31.137 # +elected-leader master redisMaster 127.0.0.1 6379 選中leader
2772:X 09 Nov 15:27:31.137 # +failover-state-select-slave master redisMaster 127.0.0.1 6379 選中其中的一個slave當做master
2772:X 09 Nov 15:27:31.220 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redisMaster 127.0.0.1 6379 選中6381
2772:X 09 Nov 15:27:31.221 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ redisMaster 127.0.0.1 6379 發送slaveof no one命令
2772:X 09 Nov 15:27:31.276 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ redisMaster 127.0.0.1 6379 等待升級master
2772:X 09 Nov 15:27:32.172 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redisMaster 127.0.0.1 6379 升級6381爲master
2772:X 09 Nov 15:27:32.172 # +failover-state-reconf-slaves master redisMaster 127.0.0.1 6379
2772:X 09 Nov 15:27:32.223 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
2772:X 09 Nov 15:27:33.219 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
2772:X 09 Nov 15:27:34.245 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6379
2772:X 09 Nov 15:27:34.346 # +failover-end master redisMaster 127.0.0.1 6379 故障恢復完成
2772:X 09 Nov 15:27:34.346 # +switch-master redisMaster 127.0.0.1 6379 127.0.0.1 6381 主數據庫從6379轉變爲6381
2772:X 09 Nov 15:27:34.346 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redisMaster 127.0.0.1 6381 添加6380爲6381的從庫
2772:X 09 Nov 15:27:34.346 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redisMaster 127.0.0.1 6381 添加6379爲6381的從庫
可以看到6381是主庫,它有一個從庫6380[root@localhost 6380]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=29050,lag=1
master_repl_offset:29050
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:29049
127.0.0.1:6381>
將6379恢復,接下來,我們恢復6379查看狀態:
2772:X 09 Nov 15:37:07.409 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redisMaster 127.0.0.1 6381 379已經恢復服務
2772:X 09 Nov 15:37:17.373 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redisMaster 127.0.0.1 6381 將6379設置爲6381的slave
6.配置多個哨兵
配置如下,但是我沒有測試,你們可以測試一下。
vim sentinel.conf
輸入內容:
sentinel monitor taotaoMaster 127.0.0.1 6381 2
sentinel monitor taotaoMaster2 127.0.0.16381 1