请选择 进入手机版 | 继续访问电脑版

Redis中国用户组(CRUG)论坛

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1818|回复: 0

Redis简单高可用实践:Redis Sentinel故障迁移

[复制链接]
  • TA的每日心情
    开心
    2019-4-19 23:07
  • 签到天数: 95 天

    [LV.6]常住居民II

    406

    主题

    515

    帖子

    3981

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3981

    最佳新人活跃会员宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-8-30 15:41:12 | 显示全部楼层 |阅读模式
    redis通过sentinel机制进行故障的主从切换,这个特性在2.8以上版本已经内置支持,配置和使用起来也很简单。但是有一点:发生故障后,主从自动切换,master的ip下线不可用,slave被选举为master,但是我们的client端中怎么获知server端新的master ip呢?java有强大的Jedis、Redisson比较方便。
    环境搭建
    centos 6.8,安装redis-3.0.5
    1. $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz
    2. $ tar xzf redis-3.0.5.tar.gz
    3. $ cd redis-3.0.5
    4. $ make&make install
    复制代码

    为了模拟主从,我们新建目录作为slave,复制一份redis.conf进去,并且更改文件中的port端口为6378和slaveof值
    master和slave、sentinel先后启动,启动时候加载不同的配置
    1、启动master:redis-server  redis-3.0.5/redis.conf
    2、启动slave:redis-server redis-slave/redis.conf
    3、启动sentinel:redis-server redis-3.0.5/sentinel.conf –sentinel
    4、进入当前master可以查看主从信息:info Replication
    客户端感知故障迁移
    一、客户端主动获取
    redis官方提供了php库PSredis,功能还是比较强大的,实现了多Sentinel 监控,其原理也比较简单:客户端连接Sentinel实例,通过Sentinel提供的命令来获取master:SENTINEL get-master-addr-by-name <master>
    二、Sentinel推送客户端
    在Sentinel的配置文件中,提供了sentinel client-reconfig-script <master>参数:当主机因故障切换而更改时,可以调用指定脚本来通知客户端地址已经发生了变化。它会传递7个参数给脚本,具体解释如下:
    1. # CLIENTS RECONFIGURATION SCRIPT
    2. #
    3. # sentinel client-reconfig-script <master-name> <script-path>
    4. #
    5. # When the master changed because of a failover a script can be called in
    6. # order to perform application-specific tasks to notify the clients that the
    7. # configuration has changed and the master is at a different address.
    8. #
    9. # The following arguments are passed to the script:
    10. #
    11. # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
    12. #
    13. # <state> is currently always "failover"
    14. # <role> is either "leader" or "observer"
    15. #
    16. # The arguments from-ip, from-port, to-ip, to-port are used to communicate
    17. # the old address of the master and the new address of the elected slave
    18. # (now a master).
    19. #
    20. # This script should be resistant to multiple invocations.
    21. #
    22. # Example:
    23. #
    24. # sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
    复制代码

    既然脚本可以获取新的master,那么就可以做许多事情了:可以去改client的redis 配置,可以去改写host配置,可以发送通知邮件….我写了一个简单记录日志的shell:
    1. #!/bin/bash
    2. mastername=$1
    3. role=$2
    4. state=$3
    5. formip=$4
    6. fromport=$5
    7. toip=$6
    8. toport=$7
    9. time="`date '+%Y-%m-%d %H:%M:%S'`"
    10. log="${time},redis failover success,from ${formip}:${fromport} , to ${toip}:${toport}"
    11. echo $log >> /var/redis/redisinfo.log
    复制代码

    需要注意的是,shell脚本需要给可执行权限,不然sentinel启动会报错:
    结语:
    master如果被下线后再次上线加入集群,那么sentinel会把该实例做为slave而不是master,当然也可以强制恢复之前的master-slave关系;sentinel做迁移的过程中会rewrite各个实例的配置文件。
    redis sentinel内部实现原理和故障迁移原理还有许多知识要学,比如它是怎么实现的监控,怎么做出下线判断,多sentinel之间怎么联系,故障迁移的过程等等。。
    参考:
    http://download.redis.io/redis-stable/sentinel.conf
    http://www.redis.cn/topics/sentinel.html
    https://redis.io/topics/sentinel
    http://www.cnblogs.com/gomysql/p/5040847.html
    http://www.cnblogs.com/ssslinppp/p/5661419.html


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Redis中国用户组 ( 京ICP备15003959号

    GMT+8, 2019-10-17 13:48 , Processed in 0.085944 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表