Centos7搭建Redis主從複製及sentinel監控

Centos7搭建Redis主從複製及sentinel監控

主從複製

本文介紹如何搭建Redis一主二從環境,需要先準備3個Redis單實例節點環境。
單實例節點環境搭建請參考:Centos7安裝Redis單節點 https://blog.csdn.net/iceliooo/article/details/102892062

IP 角色:端口
192.168.56.105 Master:6379
192.168.56.106 replica:6379
192.168.56.107 replica:6379

修改106及107節點redis.conf配置,添加如下配置信息:

286 # replicaof <masterip> <masterport>
287 replicaof 192.168.56.105 6379

重啓105,106, 107 節點Redis服務,查看主從複製狀態:
105Master節點:

[root@k8s-master src]# redis-server ../redis.conf
23141:C 04 Nov 2019 14:37:31.847 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23141:C 04 Nov 2019 14:37:31.847 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=23141, just started
23141:C 04 Nov 2019 14:37:31.847 # Configuration loaded
[root@k8s-master src]# redis-cli
127.0.0.1:6379> info replication
NOAUTH Authentication required.
127.0.0.1:6379> auth ******
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:c3bda75e828e43caee07f27dc191f98e661b82c2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

106 replica節點:

[root@k8s-node1 src]# redis-server ../redis.conf
13197:C 04 Nov 2019 14:38:40.254 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13197:C 04 Nov 2019 14:38:40.254 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=13197, just started
13197:C 04 Nov 2019 14:38:40.254 # Configuration loaded
[root@k8s-node1 src]# redis-cli 
127.0.0.1:6379> info replication
NOAUTH Authentication required.
127.0.0.1:6379> auth ******
OK
127.0.0.1:6379> info repilication
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1572849566
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c1b5f8a15f72d059bc1d523a12c4a4380391c35d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

發現主從配置失敗,主要是因爲Master節點配置了訪問密碼,所以需要在replica節點配置Master節點的訪問祕密:

294 # masterauth <master-password>
295 masterauth ******

重啓Master及replica節點,主從配置成功:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.106,port=6379,state=online,offset=254,lag=1
slave1:ip=192.168.56.107,port=6379,state=online,offset=254,lag=1
master_replid:c4b26a9a991c54e3110d3cf9479d997937532002
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:254
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:254

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:56
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c4b26a9a991c54e3110d3cf9479d997937532002
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56

Master節點執行命令,replica節點成功接收

127.0.0.1:6379> set iceliooo male
OK
127.0.0.1:6379>

從節點默認爲自讀

127.0.0.1:6379> get iceliooo
"male"
127.0.0.1:6379> set iceliooo male
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> 

sentinel監控,實現故障轉移failover

主從複製解決了數據備份問題,提升了性能,但Master節點不可用,將出現單點故障,需要手動切換Master節點,費時費力,還會造成服務不可用問題。
下面介紹如何通過sentinel實現Master自動切換。
sentinel監控主從集羣中所有Redis服務節點,sentinel本身也會存在單點故障問題,sentinel通過相互監控來解決。sentinel本身沒有主從之分。

Redis主從及Sentinel部署分佈

IP 角色:端口
192.168.56.105 Master:6379/sentinel:26379
192.168.56.106 replica:6379 /sentinel:26379
192.168.56.107 replica:6379/sentinel:26379

修改sentinel.conf配置文件

[root@k8s-master redis-5.0.5]# cp sentinel.conf sentinel.conf.bak
[root@k8s-master redis-5.0.5]# vi sentinel.conf

主要修改如下配置,其它使用默認值:

daemonize yes
port 16379
protected-mode no
dir "/usr/local/software/redis-5.0.5/sentinel-temp"
sentinel monitor redis-master 192.168.56.105 6379 2

啓動3臺服務器的redis服務和sentinel服務

[root@k8s-master redis-5.0.5]# cd src/
[root@k8s-master src]# redis-sentinel ../sentinel.conf
2489:X 04 Nov 2019 17:12:28.225 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2489:X 04 Nov 2019 17:12:28.225 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=2489, just started
2489:X 04 Nov 2019 17:12:28.225 # Configuration loaded
[root@k8s-master src]# ps -ef|grep redis
root      2490     1  0 17:12 ?        00:00:00 redis-sentinel *:16379 [sentinel]
root      3064 11611  0 17:13 pts/1    00:00:00 grep --color=auto redis
root     29488     1  0 14:50 ?        00:00:09 redis-server *:6379
[root@k8s-master src]# 

模擬Master故障:

106上查看集羣狀態:

127.0.0.1:6379> auth centos
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:12465
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c4b26a9a991c54e3110d3cf9479d997937532002
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12465
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12465
127.0.0.1:6379> 

關閉Master節點:

127.0.0.1:6379> SHUTDOWN
not connected> 

再次查看106上集羣狀態,30秒之後發現master節點切換失敗:

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:12605
master_link_down_since_seconds:35
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c4b26a9a991c54e3110d3cf9479d997937532002
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12605
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12605
127.0.0.1:6379> 

失敗原因主要是沒有在sentinel.conf配置文件中配置Redis集羣節點的訪問密碼(這裏要求集羣中每個節點的訪問密碼必須一致

121 sentinel monitor mymaster 192.168.56.107 6379 2
122 sentinel auth-pass mymaster ******

這裏還需要注意,“sentinel auth-pass mymaster ******” 必須配置在“sentinel monitor mymaster 192.168.56.107 6379 2” 之後,否則會出現如下異常:

[root@k8s-master src]# redis-sentinel ../sentinel.conf

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 104
>>> 'sentinel auth-pass mymaster ******'
No such master with specified name.

重新啓動各個節點的redis-sentinel服務及redis服務,106上查看集羣狀態:

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1596
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:09787ba9f25f74e8caac6c07808997c7d3d4a421
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1596
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1596

關閉Master節點,模擬Master節點故障:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.106,port=6379,state=online,offset=6786,lag=0
slave1:ip=192.168.56.107,port=6379,state=online,offset=6786,lag=1
master_replid:09787ba9f25f74e8caac6c07808997c7d3d4a421
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6786
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6786
127.0.0.1:6379> SHUTDOWN
not connected> 

30秒後,106上查看集羣狀態,切換成功,107成爲新的Master節點:

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.56.107
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:11842
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:569347a188791772e9f7ff3fa11048d0e6a86b01
master_replid2:09787ba9f25f74e8caac6c07808997c7d3d4a421
master_repl_offset:11842
second_repl_offset:8517
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:11842

啓動105redis節點,模擬原Master節點恢復,新Master中恢復到兩個replica節點:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.106,port=6379,state=online,offset=478823,lag=1
slave1:ip=192.168.56.105,port=6379,state=online,offset=478966,lag=0
master_replid:569347a188791772e9f7ff3fa11048d0e6a86b01
master_replid2:09787ba9f25f74e8caac6c07808997c7d3d4a421
master_repl_offset:478966
second_repl_offset:8517
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:478966

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