redis哨兵

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章