1. 程式人生 > >Redis序列之Sentinel

Redis序列之Sentinel

前段時間一直在研究Redis的Sentinel叢集,實驗幾次也沒成功過,要麼是Master有問題,要麼是Mster宕機後,Slave沒能自動切換成新的Master,今天突發靈感,實驗一次成功,叢集配置如上:
Master:127.0.0.1:10001
Slave:127.0.0.1:10002,127.0.0.1:10003
Sentinel:127.0.0.1:26389,127.0.0.1:26489

首先新建10001,10002,10003資料夾,將redis.conf,redid-server分別Copy到資料夾中

longwentaodeMacBook-Pro:redis-cluster longwentao$ ls
10001
10002 10003 sentinel longwentaodeMacBook-Pro:redis-cluster longwentao$ ls 10001 redis-server redis.conf

修改redis.conf檔案中的埠號和資料夾保持一致

port 10001
port 10002
port 10003

修改10002,10003檔案下的redis.conf檔案,指定master為127.0.0.1:10001,其他使用預設配置

# slaveof <masterip> <masterport>
slaveof 127.0.0.1 10001

再建立sentinel資料夾,將redis-sentinel,sentinel.conf檔案Copy到資料夾中,將sentinel.conf檔案重新命名為sentinel_26379.conf,修改埠號及需要監控的master

port 26379
sentinel monitor mymaster 127.0.0.1 10001 1

1表示至少一個sentinel同意master宕機後,切換新的master

將sentinel_26379.conf Copy一份成sentinel_26479.conf,並修改埠號為26479,其他不變,最後sentinel資料夾中的內容如下

longwentaodeMacBook-Pro:sentinel longwentao$ ls
redis-sentinel      sentinel_26379.conf sentinel_26479.conf

一個conf檔案代表一個sentinel

到這裡整個叢集配置就完成了,接下來先啟動master和sentinel

longwentaodeMacBook-Pro:10001 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:sentinel longwentao$ ./redis-sentinel sentinel_26379.conf 
longwentaodeMacBook-Pro:sentinel longwentao$ ./redis-sentinel sentinel_26479.conf 

再啟動10002和10003

longwentaodeMacBook-Pro:10002 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:10003 longwentao$ ./redis-server redis.conf 

可以看到,sentinel中已經監控到增加了兩個slave

588:X 31 Dec 12:54:52.469 # Sentinel ID is 75e84135f9dddd13910b3e835f6836b0d861dbdb
588:X 31 Dec 12:54:52.469 # +monitor master mymaster 127.0.0.1 10001 quorum 1
588:X 31 Dec 12:54:52.470 * +slave slave 127.0.0.1:10002 127.0.0.1 10002 @ mymaster 127.0.0.1 10001
588:X 31 Dec 12:54:52.470 * +slave slave 127.0.0.1:10003 127.0.0.1 10003 @ mymaster 127.0.0.1 10001

在10001中檢視群集資訊,10001為Master,有兩個slave10002,10003

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 10001
127.0.0.1:10001> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=10002,state=online,offset=417020,lag=1
slave1:ip=127.0.0.1,port=10003,state=online,offset=417020,lag=1
master_repl_offset:417020
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:417019

在10002中檢視叢集資訊

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 10002
127.0.0.1:10002> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:10001
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:424608
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:10002> 

宕機驗證,將master停掉,sentinel中顯示10003自動變成了master

588:X 31 Dec 13:57:38.194 # +switch-master mymaster 127.0.0.1 10001 127.0.0.1 10003
588:X 31 Dec 13:57:38.195 * +slave slave 127.0.0.1:10002 127.0.0.1 10002 @ mymaster 127.0.0.1 10003
588:X 31 Dec 13:57:38.195 * +slave slave 127.0.0.1:10001 127.0.0.1 10001 @ mymaster 127.0.0.1 10003
588:X 31 Dec 13:58:08.268 # +sdown slave 127.0.0.1:10001 127.0.0.1 10001 @ mymaster 127.0.0.1 10003

再檢視叢集資訊,10003為master,有一個10002的slave節點

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 10003
127.0.0.1:10003> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=10002,state=online,offset=28740,lag=1
master_repl_offset:28874
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28873

再將10001啟動,sentinel顯示增加了一個10001的slave,master為10003

588:X 31 Dec 14:03:23.277 # -sdown slave 127.0.0.1:10001 127.0.0.1 10001 @ mymaster 127.0.0.1 10003
588:X 31 Dec 14:03:33.256 * +convert-to-slave slave 127.0.0.1:10001 127.0.0.1 10001 @ mymaster 127.0.0.1 10003

檢視叢集資訊,master還是10003,10001已經變成了slave

127.0.0.1:10003> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=10002,state=online,offset=60039,lag=1
slave1:ip=127.0.0.1,port=10001,state=online,offset=60039,lag=1
master_repl_offset:60039
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:60038
127.0.0.1:10003>