暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis Sentinel 学习笔记

yangyidba 2020-01-23
1095

一 Redis-Sentinel简介

Redis-Sentinel是Redis官方推荐的针对主从结构的高可用性解决方案,当master不可用,sentinel能监控多个master-slave集群,发现master宕机后能进行自动切换。

,Redis-sentinel本身是一个独立运行的进程,可以监控一个或者多个主从集群。当然生产环境中如果规模比较小可以使用一对多的方式进行监控,如果是规模比较大,尽可能的独立部署监控集群。

环境准备

sentinel 节点

  1. qabb-qa-mysql0 10.215.20.24 26379

  2. qabb-qa-mysql1 10.215.20.19 26379

  3. qabb-qa-mysql2 10.215.20.7 26379

复制

搭建redis 主备节点

  1. qabb-qa-mysql1 10.215.20.19 6379 主库

  2. 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

  1. port 26379

  2. daemonize yes

  3. logfile "26379.log"

  4. dir "/data/redis/sentinel/"

  5. sentinel monitor mymaster 10.215.20.7 6379 2

  6. sentinel down-after-milliseconds master 30000

  7. sentinel parallel-syncs mymaster 1

  8. 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

启动日志 如下:

  1. 24189:X 22 Jan 2020 23:02:19.126 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

  2. 24189:X 22 Jan 2020 23:02:19.126 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=24189, just started

  3. 24189:X 22 Jan 2020 23:02:19.126 # Configuration loaded

  4. 24190:X 22 Jan 2020 23:02:19.128 * Running mode=sentinel, port=26379.

  5. 24190:X 22 Jan 2020 23:02:19.128 # Sentinel ID is b57983116e92a089ab7fff22584c1aaa128d83b8

  6. 24190:X 22 Jan 2020 23:02:19.128 # +monitor master mymaster 10.215.20.24 6379 quorum 2

  7. 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

复制

配置文件说明

  1. Sentinel实例的端口号

  2. port 26379

  3. #Sentinel 实例的目录

  4. dir /data/redis/sentinel/

  5. #日志文件

  6. logfile "26379.log"

  7. #后台执行

  8. daemonize yes

  9. #3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问,否则最好关闭,设置为no。

  10. protected-mode no

  11. #格式:sentinel <option_name> <master_name> <option_value>;这一行代表sentinel监控的master的名字叫做mymaster,地址为10.215.20.7:6379,行尾最后的2代表,当集群中有2个sentinel认为master不可用时,才真正认为该master不可用。

  12. sentinel monitor mymaster 10.215.20.7 6379 2

  13. #sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,默认单位是毫秒,默认30秒。

  14. sentinel down-after-milliseconds mymaster 30000

  15. #在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。

  16. sentinel parallel-syncs mymaster 1

  17. #failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3minutes.

  18. sentinel failover-timeout mymaster 180000

  19. #设置连master和slaves验证密码,在监控redis实例时很有用

  20. #sentinel auth-pass mymaster xxxxxxx

  21. #发生切换之后执行的一个自定义脚本:如发邮件、vip切换等

  22. #sentinel notification-script <master-name> <script-path>

  23. #发生切换之后执行的一个自定义脚本:如发邮件、vip切换等

  24. #sentinel client-reconfig-script <master-name> /opt/redis/script/notify.py

复制

查看sentinel的信息

  1. # redis-cli -h 127.0.0.1 -p 26379

  2. 127.0.0.1:26379> info sentinel

  3. # Sentinel

  4. sentinel_masters:1

  5. sentinel_tilt:0

  6. sentinel_running_scripts:0

  7. sentinel_scripts_queue_length:0

  8. sentinel_simulate_failure_flags:0

  9. master0:name=mymaster,status=ok,address=10.215.20.24:6379,slaves=2,sentinels=3

  10. 127.0.0.1:26379>

复制

failover 切换测试

直接关闭主库,然后观察sentinel的日志,发生切换选择10.215.20.19 6379为主库。

具体sentinel的工作机制下一篇文章具体分析。

启动老的主库之后,sentinel会将redis 添加为 10.215.20.19 6379的slave。

  1. [root@qabb-qa-mysql0 23:37:50 /data/redis/sentinel]

  2. # sudo -u redis /opt/redis/bin/redis-server /data/redis/6379/conf/6379.conf

  3. [root@qabb-qa-mysql0 23:38:21 /data/redis/sentinel]

  4. # yzcli 6379

  5. 127.0.0.1:6379> info replication

  6. # Replication

  7. role:slave

  8. master_host:10.215.20.19

  9. master_port:6379

  10. master_link_status:up

  11. master_last_io_seconds_ago:1

  12. master_sync_in_progress:0

  13. slave_repl_offset:1179166458

  14. slave_priority:100

  15. slave_read_only:1

  16. connected_slaves:0

  17. master_replid:2e97737def093096d21d51a5f4c7e6871fda97bc

  18. master_replid2:0000000000000000000000000000000000000000

  19. master_repl_offset:1179166458

  20. second_repl_offset:-1

  21. repl_backlog_active:1

  22. repl_backlog_size:1048576

  23. repl_backlog_first_byte_offset:1179158906

  24. 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-


本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。

最后修改时间:2020-01-23 15:06:19
文章转载自yangyidba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论