文章目录
一、概述
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。
注:配置带有密码认证的哨兵集群,需要将主从节点的密码都配置成一直,如以下的环境,主与从节点的密码都为“000000”。
二、测试环境
系统 | IP | 主机名 | redis版本 |
---|---|---|---|
centos-7.2 | 10.0.0.67 | redis-master | redis-4.0.9.tar.gz |
centos-7.2 | 10.0.0.68 | redis-slave01 | redis-4.0.9.tar.gz |
centos-7.2 | 10.0.0.69 | redis-slave02 | redis-4.0.9.tar.gz |
三、主从环境(具体配置方法:https://blog.csdn.net/liang_operations/article/details/89419220)
1.主从文件配置
步骤一:主环境下添加masterauth 密码,不然主宕机无法自动切换成从节点。
[root@redis redis]# egrep -v “^$|#” /application/redis/redis.conf|egrep “slaveof|master”
masterauth 000000
步骤二:配置从节点01
[root@redis-slave01 ~]# egrep -v “^$|#” /application/redis/redis.conf|egrep “slaveof|master”
slaveof 10.0.0.67 6379 ###复制对应的master
masterauth “000000” ###主节点的密码
步骤三 :配置从节点02
[root@redis-slave02 ~]# egrep -v “^$|#” /application/redis/redis.conf|egrep “slaveof|master”
masterauth “000000”
slaveof 10.0.0.67 6379
2.重启主从redis
步骤一:重启主节点
[root@redis redis]# /etc/init.d/redis restart
Restarting redis (via systemctl): [ OK ]
步骤二:重启从节点001
[root@redis-slave01 ~]# /etc/init.d/redis restart
Restarting redis (via systemctl): [ OK ]
步骤三:重启从节点02
[root@redis-slave02 ~]# /etc/init.d/redis restart
Restarting redis (via systemctl): [ OK ]
3.验证主从环境
步骤一:在主机节点查看主从信息
[root@redis redis]# ./redis-cli -h 10.0.0.67 -a 000000 info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=10.0.0.69,port=6379,state=online,offset=0,lag=1
slave1:ip=10.0.0.68,port=6379,state=online,offset=0,lag=1
master_replid:3c9e6c2a02ac1b566ca2680aa777a599cab29a5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
三、哨兵环境配置
1.参数解释
port 26379
哨兵监听的端口
daemonize yes
后台启动
protected-mode no
关闭保护模式
sentinel monitor master01 10.0.0.68 6379 2
该行的意思是:监控的master的名字叫做master01(自定义),地址为10.0.0.68:6379(主节点的ip与端口),行尾最后的一个2代表在sentinel集群中,多少个sentinel认为masters死了,才能真正认为该master不可用了。
sentinel auth-pass master01 000000
连接密码
sentinel down-after-milliseconds master01 15000
sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒
sentinel failover-timeout master01 120000
failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
sentinel parallel-syncs master01 1
在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1来保证每次只有一个slave处于不能处理命令请求的状态。
2.sentinel.conf配置
这里实验配置三个哨兵,都在主节点上运行。
步骤一:sentinel_26379配置
[root@redis redis-sentinel]# cat sentinel_26379.conf
port 26379
dir “/var/lib/sentinel_26379”
logfile “/var/log/redis/sentinel_26379.log”
daemonize yes
protected-mode no
sentinel monitor master01 10.0.0.68 6379 2
sentinel auth-pass master01 000000
sentinel down-after-milliseconds master01 15000
sentinel failover-timeout master01 120000
sentinel parallel-syncs master01 1
步骤二:sentinel_26380配置
[root@redis redis-sentinel]# cat sentinel_26380.conf
port 26379
dir “/var/lib/sentinel_26380”
logfile “/var/log/redis/sentinel_26380.log”
daemonize yes
protected-mode no
sentinel monitor master01 10.0.0.67 6379 2
sentinel auth-pass master01 000000
sentinel down-after-milliseconds master01 15000
sentinel failover-timeout master01 120000
sentinel parallel-syncs master01 1
步骤三:sentinel_26381配置
[root@redis redis-sentinel]# cat sentinel_26381.conf
port 26379
dir “/var/lib/sentinel_26381”
logfile “/var/log/redis/sentinel_26381.log”
daemonize yes
protected-mode no
sentinel monitor master01 10.0.0.67 6379 2
sentinel auth-pass master01 000000
sentinel down-after-milliseconds master01 15000
sentinel failover-timeout master01 120000
sentinel parallel-syncs master01 1
四、启动哨兵
步骤一:启动三个哨兵
[root@redis redis-sentinel]# ./redis-sentinel sentinel_26379.conf
[root@redis redis-sentinel]# ./redis-sentinel sentinel_26380.conf
[root@redis redis-sentinel]# ./redis-sentinel sentinel_26381.conf
步骤二:查看日志输出
[root@redis redis-sentinel]# tailf /var/log/redis/sentinel_26379.log
3915:X 20 Apr 23:46:52.520 # +monitor master master01 10.0.0.67 6379 quorum 1
3915:X 20 Apr 23:46:52.522 * +slave slave 10.0.0.69:6379 10.0.0.69 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:46:52.525 * +slave slave 10.0.0.68:6379 10.0.0.68 6379 @ master01 10.0.0.67 637
五、测试
步骤一:停止主节点并查看日志输出
[root@redis redis]# /etc/init.d/redis stop
Stopping redis (via systemctl): [ OK ]
[root@redis redis-sentinel]# tailf /var/log/redis/sentinel_26379.log
3915:X 20 Apr 23:47:48.011 # +sdown master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.012 # +odown master master01 10.0.0.67 6379 #quorum 1/1
3915:X 20 Apr 23:47:48.012 # +new-epoch 1
3915:X 20 Apr 23:47:48.012 # +try-failover master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.015 # +vote-for-leader b49546b1e974bdaaa95bbbd1caf7e9ed26787589 1
3915:X 20 Apr 23:47:48.015 # +elected-leader master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.015 # +failover-state-select-slave master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.091 # +selected-slave slave 10.0.0.68:6379 10.0.0.68 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.092 * +failover-state-send-slaveof-noone slave 10.0.0.68:6379 10.0.0.68 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:48.193 * +failover-state-wait-promotion slave 10.0.0.68:6379 10.0.0.68 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:49.117 # +promoted-slave slave 10.0.0.68:6379 10.0.0.68 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:49.117 # +failover-state-reconf-slaves master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:49.190 * +slave-reconf-sent slave 10.0.0.69:6379 10.0.0.69 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:50.132 * +slave-reconf-inprog slave 10.0.0.69:6379 10.0.0.69 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:50.132 * +slave-reconf-done slave 10.0.0.69:6379 10.0.0.69 6379 @ master01 10.0.0.67 6379
3915:X 20 Apr 23:47:50.189 # +failover-end master master01 10.0.0.67 6379
3915:X 20 Apr 23:47:50.189 # +switch-master master01 10.0.0.67 6379 10.0.0.68 6379
3915:X 20 Apr 23:47:50.190 * +slave slave 10.0.0.69:6379 10.0.0.69 6379 @ master01 10.0.0.68 6379
3915:X 20 Apr 23:47:50.190 * +slave slave 10.0.0.67:6379 10.0.0.67 6379 @ master01 10.0.0.68 6379
步骤二:查看新的主节点
[root@redis redis]# ./redis-cli -h 10.0.0.68 -a 000000 info replication
# Replication
role:master
connected_slaves:1
步骤三:启动旧主节点并查看日志输出
[root@redis redis]# /etc/init.d/redis start
Starting redis (via systemctl): [ OK ]
[root@redis redis-sentinel]# tailf /var/log/redis/sentinel_26379.log
3915:X 20 Apr 23:49:01.584 * +convert-to-slave slave 10.0.0.67:6379 10.0.0.67 6379 @ master01 10.0.0.68 6379
步骤四:新节点查看信息
[root@redis redis]# ./redis-cli -h 10.0.0.68 -a 000000 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.69,port=6379,state=online,offset=17912,lag=0
slave1:ip=10.0.0.67,port=6379,state=online,offset=17912,lag=0
步骤五:新节点添加字符串测试
[root@redis-slave01 redis]# ./redis-cli -h 10.0.0.68 -a 000000
10.0.0.68:6379> set test01 123456
OK
步骤六:从节点(10.0.0.67 )查看
[root@redis redis]# ./redis-cli -h 10.0.0.67 -a 000000 get test01
“123456”
步骤七:从节点(10.0.0.69)查看
[root@redis-slave02 redis]# ./redis-cli -h 10.0.0.69 -a 000000 get test01
“123456”