一 Redis-Sentinel简介
Redis-Sentinel是Redis官方推荐的针对主从结构的高可用性解决方案,当master不可用,sentinel能监控多个master-slave集群,发现master宕机后能进行自动切换。
,Redis-sentinel本身是一个独立运行的进程,可以监控一个或者多个主从集群。当然生产环境中如果规模比较小可以使用一对多的方式进行监控,如果是规模比较大,尽可能的独立部署监控集群。
环境准备
sentinel 节点
qabb-qa-mysql0 10.215.20.24 26379
qabb-qa-mysql1 10.215.20.19 26379
qabb-qa-mysql2 10.215.20.7 26379
复制
搭建redis 主备节点
qabb-qa-mysql1 10.215.20.19 6379 主库
qabb-qa-mysql2 10.215.20.7 6379 从库
复制
安装redis
yum install -y yz-redis
生成redis实例
sh /opt/isys/bin/db/init_redis.sh -p 6379 -m 1G
配置主从
slaveof 10.215.20.7 6379
二 sentinel 实践
在三台sentinel节点服务器上依次操作,创建sentinel节点
创建对应目录
mkdir -p /data/redis/sentinel/{conf,data,log}
编辑配置文件 /data/redis/sentinel/conf/sentinel-26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir "/data/redis/sentinel/"
sentinel monitor mymaster 10.215.20.7 6379 2
sentinel down-after-milliseconds master 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
复制
修改文件夹的属组权限为redis
chown -R redis:redis /data/redis/sentinel/
启动 sentinel
需要注意的是必须等redis 主从启动之后才能启动redis sentinel 。每个节点的启动方式如下,不要使用root用户直接启动,有一定的安全风险。
sudo -u redis /opt/redis/bin/redis-sentinel /data/redis/sentinel/conf/sentinel-26379.conf
启动日志 如下:
24189:X 22 Jan 2020 23:02:19.126 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24189:X 22 Jan 2020 23:02:19.126 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=24189, just started
24189:X 22 Jan 2020 23:02:19.126 # Configuration loaded
24190:X 22 Jan 2020 23:02:19.128 * Running mode=sentinel, port=26379.
24190:X 22 Jan 2020 23:02:19.128 # Sentinel ID is b57983116e92a089ab7fff22584c1aaa128d83b8
24190:X 22 Jan 2020 23:02:19.128 # +monitor master mymaster 10.215.20.24 6379 quorum 2
24190:X 22 Jan 2020 23:02:49.170 # +sdown slave 10.215.20.7:6379 10.215.20.7 6379 @ mymaster 10.215.20.24 6379
复制
配置文件说明
Sentinel实例的端口号
port 26379
#Sentinel 实例的目录
dir /data/redis/sentinel/
#日志文件
logfile "26379.log"
#后台执行
daemonize yes
#3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问,否则最好关闭,设置为no。
protected-mode no
#格式:sentinel <option_name> <master_name> <option_value>;这一行代表sentinel监控的master的名字叫做mymaster,地址为10.215.20.7:6379,行尾最后的2代表,当集群中有2个sentinel认为master不可用时,才真正认为该master不可用。
sentinel monitor mymaster 10.215.20.7 6379 2
#sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,默认单位是毫秒,默认30秒。
sentinel down-after-milliseconds mymaster 30000
#在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1
#failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3minutes.
sentinel failover-timeout mymaster 180000
#设置连master和slaves验证密码,在监控redis实例时很有用
#sentinel auth-pass mymaster xxxxxxx
#发生切换之后执行的一个自定义脚本:如发邮件、vip切换等
#sentinel notification-script <master-name> <script-path>
#发生切换之后执行的一个自定义脚本:如发邮件、vip切换等
#sentinel client-reconfig-script <master-name> /opt/redis/script/notify.py
复制
查看sentinel的信息
# redis-cli -h 127.0.0.1 -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.215.20.24:6379,slaves=2,sentinels=3
127.0.0.1:26379>
复制
failover 切换测试
直接关闭主库,然后观察sentinel的日志,发生切换选择10.215.20.19 6379为主库。
具体sentinel的工作机制下一篇文章具体分析。
启动老的主库之后,sentinel会将redis 添加为 10.215.20.19 6379的slave。
[root@qabb-qa-mysql0 23:37:50 /data/redis/sentinel]
# sudo -u redis /opt/redis/bin/redis-server /data/redis/6379/conf/6379.conf
[root@qabb-qa-mysql0 23:38:21 /data/redis/sentinel]
# yzcli 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.215.20.19
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1179166458
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2e97737def093096d21d51a5f4c7e6871fda97bc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1179166458
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1179158906
repl_backlog_histlen:7553
复制
sentinel的log
14842:X 22 Jan 2020 23:38:22.009 # -sdown slave 10.215.20.24:6379 10.215.20.24 6379 @ mymaster 10.215.20.19 6379
切换过程对主库不可用探测时间比较久,这点在生产上可以调整sentinel的配置,缩短判断不可用的时间长度,达到快速切换的目的。
三 总结
本文大概介绍Sentinel的搭建过程和redis主从failover的过程。后面再详细介绍sentinel的工作原理。
-The End-
本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。