Redis 哨兵

Posted 黄土地上的黑石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 哨兵相关的知识,希望对你有一定的参考价值。

哨兵简介

哨兵定义

哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有 slave 连接到新的 master。

疑问:投票规则是啥、

哨兵作用

  • 监控
    • 不断地检查 master 和 slave 是否正常运行
    • master 存活检测、master 与 slave 运行情况检测
  • 通知(提醒)
    • 当被监控的服务器出现问题时,向其他(哨兵间、客户端)发送通知
  • 自动故障转移
    • 断开 master 与 slave 连接,选取一个 slave 作为 master,将其他 slave 连接到新的 master,并告知客户端新的服务器地址

注意:哨兵也是一台 redis 服务器,只是不提供数据服务;通常哨兵配置数量为单数(一般很少配1个,都是3个起步,配单数是为了投票的时候不会出现票数相同的情况)

启用哨兵模式

配置哨兵

  • 配置一拖二的主从结构

  • 配置三个哨兵(配置相同,端口不同)

    • 参看 sentinel.conf
  • 启动哨兵

    redis-sentinel sentinel-端口号.conf

启用哨兵操作步骤:

  1. 查看 master 服务配置,之前都配好了,确认一下

  2. 查看 slave 服务配置,之前也配置好了

  3. 配置三个哨兵

    哨兵配置文件(三个哨兵的配置相同,端口不同),sentinel-26379.conf 配置如下:

    # 端口号
    port 26379
    # 日志等信息存放目录,可以自行改动
    dir /tmp
    # mymaster 是自己起的名字,就是个称呼可以随便起
    # 最后的数字 2 代表:如果有两个哨兵认为 mymaster 主服务器挂掉,则主服务器被判定为挂掉,这个值通常设定为哨兵数量的一半+1
    sentinel monitor mymaster 127.0.0.1 6379 2
    # 主服务器连接多长时间没响应会被判定为挂掉,默认为30s(下面的3000单位是毫秒)
    sentinel down-after-milliseconds mymaster 3000
    # 当主机挂掉后,新换上来的主机数据同步并行线程数
    parallel-syncs mymaster 1
    # 新主机换上来后,数据同步时间超过 180s 就算超时
    sentinel failover-timeout mymaster 180000
    

    执行下面两条命令,生成 sentinel-26380.conf 和 sentinel-26381.conf

    sed \'s/26379/26380/g\' sentinel-26379.conf > sentinel-26380.conf
    sed \'s/26379/26381/g\' sentinel-26379.conf > sentinel-26381.conf
    
  4. 启动 master 服务

    redis-server /redis-4.0.0/conf/redis-6379.conf

  5. 启动 slave 服务

    redis-server /redis-4.0.0/conf/redis-6380.conf
    redis-server /redis-4.0.0/conf/redis-6380.conf
    
  6. 启动哨兵服务

    redis-sentinel /redis-4.0.0/conf/sentinel-26379.conf
    redis-sentinel /redis-4.0.0/conf/sentinel-26380.conf
    redis-sentinel /redis-4.0.0/conf/sentinel-26381.conf
    

    启动完成之后,就可以用哨兵客户端连接服务端进行信息查看了,连接命令和正常 reids 客户端连接命令一样,比如我们要连接端口为26379的哨兵服务:reids-cli -p 26379,哨兵客户端不支持 getset 相关的操作指令,只支持哨兵相关操作指令

  7. 测试 master slave 服务有没有问题

    在 master 服务器新的命令窗口中,执行redis-cli -p 6379连接服务,紧接着执行set name zhangsan;
    在 slave 服务器新的命令行窗口中,执行redis-cli -p 6380连接服务,紧接着执行get name如果获取到 “zhangsan”,则测试通过。

  8. 测试哨兵服务是否有效

    将原来的 master 服务停掉,等待30s(因为在哨兵配置文件中设定的时间是30s),后如果重新选出了新的 master 则测试通过。

哨兵工作原理

主从切换

哨兵在进行主从切换过程中主要经历三个阶段:监控、通知、故障转移

阶段一:监控

阶段二:通知阶段

哨兵之间维护一个长期信息对等的阶段

阶段三:故障转移

  1. 先确认故障

  2. 通过投票的方式从多个哨兵中选出真正处理故障的一个哨兵。假如有 5 个哨兵,此时大家都会同时向其余哨兵进行广播,广播的时候会带上自己之前被选举出来的次数等信息,假如我是 2 号哨兵,我先收到 1 号哨兵的消息后,我会投票给 1 号,就这样进行选举,如果一轮没有选出来,还会继续下一轮,直到选出票数最高的为止

  3. 上一步中被选出来的哨兵会在多个 slave 中选出一个作为 master

    排除掉的:

    • 不在线

    • 响应慢

    • 与原 master 断开时间久的

    优先原则:

    • 优先级
    • offset: offset 小的更优先
    • runid: runid 小的更优先

    哨兵向 master(被选出来的 slave) 发送指令

    • slaveof no one 断开与原 master 的连接
    • 向其它 slave 发送 slaveof 新master_IP 新master_端口

从哨兵服务的日志中,我们可以看到哨兵是怎么一步步完成这些操作的,每一条日志都写得很好理解。

以上是关于Redis 哨兵的主要内容,如果未能解决你的问题,请参考以下文章

Redis主从与哨兵架构详解 Redis主从架构 如何在同一台机器搭建主从架构 Redis主从工作原理 数据部分复制 Jedis使用 Redis的管道(Pipeline) Redis Lua脚本(代码

高级开发运维从简单学:Redis哨兵和集群小贴士

高级开发运维从简单学:Redis哨兵和集群小贴士

redis主从+哨兵

Redis的哨兵(Sentinel)分析

Spring之redis主从复制(非哨兵模式)