首先感謝“吧喱公路”的引導,打開了我對哨兵的理解思路,再次謝謝。
Redis的哨兵(sentinel) ??
? ? 哨兵適用于非集群結構的redis環境,比如:redis主從環境。
? ? 關于哨兵集群,我這里就不做實驗了,網上有大量的配置方法。
? ? 哨兵集群的核心思想,就是解決哨兵的單點故障問題。
? ? 個人認為,有做哨兵集群的經費,不如直接做個redis集群了。
環境描述:(主從從結構)
? ? master:192.168.2.100:6379 ? ? ?#單節點sentinel運行在這個環境上
? ? slave:192.168.2.200:6379 ??
? ? savle:192.168.2.201:6379 ? ?
? ??
redis安裝路徑:/usr/local/redis-3.0.6-6379
redis.conf關鍵配置:(這里不絮訴基本配置了,主從配置參考:https://blog.51cto.com/13690439/2118890)
? ? master:
? ? ? ? # vim redis.conf
? ? ? ? ? ? requirepass "123456" ? ? ? ?//設置連接master密碼
? ? ? ? ? ? masterauth "123456" ? ? ? //登錄master時,調用該參數
? ? ? ? ? ??
? ? slave:
? ? ? ? # vim etc/redis.conf
? ? ? ? ? ? slaveof 192.168.2.100 6379 ? ? ? ? ?//指定主庫IP和端口
? ? ? ? ? ? requirepass "123456" ? ? ? ?//之所以3個redis都這樣寫,是為了故障切換后,info replication顯示slave0信息
? ? ? ? ? ? masterauth 123456 ? ? ? ? ?//登錄master時,調用該參數
? ? ? ? ? ??
哨兵關鍵配置:(sentinel.conf)
? ? # vim sentinel.conf
? ? ? ? port 26379 ? ? ? ?//端口
? ? ? ? sentinel monitor mymaster 192.168.2.100 6379 1 ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? //master-name可以自定義、監聽IP:port ?幾個sentinel認為故障時,才算真正的故障
? ? ? ? sentinel down-after-milliseconds mymaster 3000
? ? ? ? ? ? ? ? ? ? ? ? //哨兵發送PING消息,等待PONG消息的時間,超過設定時間表示故障;毫秒
? ? ? ? sentinel failover-timeout mymaster 10000 ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? //故障轉移(failover)超時時間,超過設定時間表示故障轉移失??;毫秒
? ? ? ? sentinel auth-pass mymaster 123456 ? ? ? ? ?//設置連接master需要的密碼
? ? ??
啟動master的redis:
? ? # redis-server redis.conf
? ? ? ??
啟動哨兵:(新開一個xshell)
? ? # redis-sentinel sentinel.conf?
啟動slave的redis:
? ? # redis-server redis.conf
? ??
哨兵的輸出:
? ? # Sentinel runid is e49df1197325687d9a40508c00f466a8c6e596db
? ? ? ? ? ? ? ? ? ? //哨兵ID
? ? # +monitor master mymaster 192.168.2.100 6379 quorum 1
? ? ? ? ? ? ? ? ? ? //+monitor:增加了一個master監控,后面就是master的信息
? ? * +slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //+salve:增加了一個salve監控,后面是salve的信息
? ? * +slave slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //+salve:增加了一個salve監控,后面是salve的信息
? ? ? ? ? ? ? ? ? ??
master上登錄redis:
? ? # redis-cli -h 192.168.2.100 -p 6379 -a 123456
? ? ? ? 192.168.2.100:6379> set name zhangsan
? ? ? ? OK
? ? ? ? 192.168.2.100:6379> set age 26
? ? ? ? OK
? ? ? ? 192.168.2.100:6379> set home beijing
? ? ? ? OK
? ? ? ? 192.168.2.100:6379> keys *
? ? ? ? 1) "name"
? ? ? ? 2) "home"
? ? ? ? 3) "age"
salve上登錄redis:(兩個salve登錄查看,數據同步正常)
? ? # redis-cli -h 192.168.2.200 -p 6379 -a 123456
? ? ? ? 192.168.2.200:6379> keys *
? ? ? ? 1) "name"
? ? ? ? 2) "home"
? ? ? ? 3) "age"
? ??
停止master的redis:(注意觀察哨兵的輸出)
? ? # ps -ef |grep redis
? ? ? ? root ? ? ?11467 ? ? ?1 ?0 17:12 ? ? ? ? ?00:00:00 redis-server *:6379
? ? ? ? root ? ? ?11473 ? 4650 ?0 17:12 pts/1 ? ?00:00:00 redis-sentinel *:26379 [sentinel]
? ? ? ? root ? ? ?11513 ? 4339 ?0 17:16 pts/0 ? ?00:00:00 grep --color=auto redis
? ? # kill 11467
? ??
哨兵的輸出:
? ? # +sdown master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //+sdown:master節點掛了。后面是master信息
? ? # +odown master mymaster 192.168.2.100 6379 #quorum 1/1
? ? # +new-epoch 14
? ? # +try-failover master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //開始恢復故障
? ? # +vote-for-leader e49df1197325687d9a40508c00f466a8c6e596db 14
? ? ? ? ? ? ? ? ? ? //投票選舉節點的哨兵信息,因為我們就一個哨兵,所以就是自己 leader
? ? # +elected-leader master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //選舉節點后替換誰
? ? # +failover-state-select-slave master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //開始為故障的master選舉
? ? # +selected-slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //節點選舉結果,選中192.168.2.200:6379來替換master
? ? * +failover-state-send-slaveof-noone slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //確認節點選舉結果
? ? * +failover-state-wait-promotion slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //選中的節點正在升級為master
? ? # +promoted-slave slave 192.168.2.200:6379 192.168.2.200 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //選中的節點已成功升級為master
? ? # +failover-state-reconf-slaves master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //切換故障master的狀態
? ? * +slave-reconf-sent slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //
? ? * +slave-reconf-inprog slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //其他節點同步故障master信息
? ? * +slave-reconf-done slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //其他節點完成故障master的同步
? ? # +failover-end master mymaster 192.168.2.100 6379
? ? ? ? ? ? ? ? ? ? //故障恢復完成
? ? # +switch-master mymaster 192.168.2.100 6379 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //master從192.168.2.100:6379 ?變為 192.168.2.200:6379
? ? * +slave slave 192.168.2.201:6379 192.168.2.201 6379 @ mymaster 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //其他節點指定新的master
? ? * +slave slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //故障master指定新的master
? ? # +sdown slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //192.168.2.100:6379宕機,待恢復
啟動master的redis(注意觀察哨兵的輸出)
? ? # redis-server redis.conf
? ??
哨兵的輸出:
? ? # -sdown slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //故障master節點已經恢復
? ? * +convert-to-slave slave 192.168.2.100:6379 192.168.2.100 6379 @ mymaster 192.168.2.200 6379
? ? ? ? ? ? ? ? ? ? //故障master節點變為salve,他的master為192.168.2.200:6379
現在我們查看主從的狀態:
? ? 192.168.2.100上查看:
? ? ? ? # redis-cli -h 192.168.2.100 -p 6379 -a 123456
? ? ? ? ? ? 192.168.2.100:6379> info replication
? ? ? ? ? ? # Replication
? ? ? ? ? ? role:slave
? ? ? ? ? ? master_host:192.168.2.200
? ? ? ? ? ? master_port:6379
? ? ? ? ? ? master_link_status:up
? ? ? ? ? ? 192.168.2.100:6379> set ab 123
? ? ? ? ? ? (error) READONLY You can't write against a read only slave.
? ? ? ? ? ? 192.168.2.100:6379> get name
? ? ? ? ? ? "zhagnsan"
? ? ? ? ? ??
? ? 192.168.2.201上查看:
? ? ? ? # redis-cli -h 192.168.2.201 -p 6379 -a 123456
? ? ? ? ? ? 192.168.2.201:6379> info replication
? ? ? ? ? ? # Replication
? ? ? ? ? ? role:slave
? ? ? ? ? ? master_host:192.168.2.200
? ? ? ? ? ? master_port:6379
? ? ? ? ? ? master_link_status:up
? ? ? ? ? ? 192.168.2.201:6379> set ab 123
? ? ? ? ? ? (error) READONLY You can't write against a read only slave.
? ? ? ? ? ? 192.168.2.201:6379> get name
? ? ? ? ? ? "zhagnsan"
? ? ? ? ? ??
? ? 192.168.2.200上查看:
? ? ? ? # redis-cli -h 192.168.2.200 -p 6379 -a 123456
? ? ? ? ? ? 192.168.2.200:6379> info replication
? ? ? ? ? ? # Replication
? ? ? ? ? ? role:master
? ? ? ? ? ? connected_slaves:2
? ? ? ? ? ? slave0:ip=192.168.2.201,port=6379,state=online,offset=24990,lag=1
? ? ? ? ? ? slave1:ip=192.168.2.100,port=6379,state=online,offset=24990,lag=0
? ? ? ? ? ? 192.168.2.200:6379> set ab 123
? ? ? ? ? ? OK
? ? ? ? ? ? 192.168.2.200:6379> keys *
? ? ? ? ? ? 1) "name"
? ? ? ? ? ? 2) "home"
? ? ? ? ? ? 3) "age"
? ? ? ? ? ? 4) "ab"
?
?總結:通過哨兵(sentinel)實現了主從從環境高可用效果。
? ? ? ?master在宕機后,通過哨兵自動將其中一個salve提升為master,切換過程中,數據保存完整。
? ? ? ?但我們也發現,原master不能繼續插入key了, 而客戶端連接還是會連原master,
? ? ? ?這時,我們就需要在數據庫連接池做一些規則設置了。
? ? ? ?由于目前我能力有限,無法解釋連接池問題,還請見諒。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。