1. 程式人生 > >Redis的哨兵部署(sentinel)(實驗)

Redis的哨兵部署(sentinel)(實驗)

redis哨兵部署 redis哨兵搭建 redis哨兵使用 redis-sentinel部署 redis-sentinel詳解


首先感謝“吧喱公路”的引導,打開了我對哨兵的理解思路,再次謝謝。


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關鍵配置:這裏不絮訴基本配置了,主從配置參考:http://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,

這時,我們就需要在數據庫連接池做一些規則設置了。

由於目前我能力有限,無法解釋連接池問題,還請見諒。


Redis的哨兵部署(sentinel)(實驗)