zoukankan      html  css  js  c++  java
  • Redis-sentinel 哨兵(HA)

    Sentinel 介绍

    Redis-Sentinel 是 Redis 官方推荐的高可用性(HA)解决方案,当用 Redis 做 Master-slave 的高可用方案时,假如Master 宕机了,Redis 本身(包括它的很多客户端)都没有实现自动进行主备切换,而 Redis-sentinel 本身也是一个独立运行的进程,它能监控多个 Master-Slave 集群,发现 Master 宕机后能进行自动切换 。

    必须在 Redis 主从已经做好的前提下,再做 Redis 哨兵(高可用) 

    Sentinel 主要功能(转载

    Sentinel 是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作,

    如下图 Server1 为主库,其他 Server 为从库,Sentinel 监控着每一个 Redis 实例:

    img

    在 Server1 掉线后:

    img

    升级 Server2 为新的主服务器:

    img

    当 Server1 故障恢复重新上线时,Sentinel 会将 Server1 重新配置为从库,指向新的主库 Server2 ! 

    Sentinel 其他功能

    提醒(Notification): 当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知

    自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器 。

    Sentinel 工作流程

    1. Sentinel 通过用户给定的配置文件来发现主服务器

    2. Sentinel 会与被监视的主服务器创建两个网络连接: 命令连接用于向主服务器发送命令; 订阅连接用于订阅指定的频道,从而发现监视同一主服务器的其他 Sentinel

    3. Sentinel 通过向主服务器发送 INFO 命令来自动获得所有从服务器的地址

    4. 发现其他 Sentinel Sentinel 会通过命令连接向被监视的主从服务器发送 "HELLO" 信息,该消息包含 Sentinel 的 IP、端口号、ID 等内容,以此来向其他 Sentinel 宣告自己的存在;与此同时 Sentinel 会通过订阅连接接收其他 Sentinel 的 "HELLO" 信息,以此来发现监视同一个主服务器的其他 Sentinel 。

    5. 多个 Sentinel 之间只会互相创建命令连接,用于进行通信,因为已经有主从服务器作为发送和接收 "HELLO" 信息的中介,所以 Sentinel 之间不会创建订阅连接 。

    6. 检测实例的状态 Sentinel 使用 PING 命令来检测实例的状态:如果实例在指定的时间内没有返回回复,或者返回错误的回复,那么该实例会被 Sentinel 判断为下线 。 Redis 的 Sentinel 中关于下线(down)有两个不同的概念: 1)主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断; 2)客观下线(Objectively Down,简称 ODOWN)指的是多个Sentinel实例在对同一个服务器做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的服务器下线判断 。(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器判断已下线 )

    Sentinel 故障转移流程

    一次故障转移操作由以下步骤组成:
    1.发现主服务器已经进入客观下线状态。
    2.基于 Raft leader election 协议,进行投票选举
    3.如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。如果当选成功,那么执行以下步骤。
     - 1)选出一个从服务器,并将它升级为主服务器。
     - 2)向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
     - 3)通过发布与订阅功能,将更新后的配置传播给所有其他Sentinel,其他Sentinel对它们自己的配置进行更新。
     - 4)向已下线主服务器的从服务器发送SLAVEOF命令,让它们去复制新的主服务器。
     - 5)当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。
    

    Sentinel 选择主库的规则

    • 在失效主服务器属下的从服务器当中,那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰;
    • 在失效主服务器属下的从服务器当中,那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰;
    • 在经历了以上两轮淘汰之后剩下来的从服务器中,我们选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器;如果复制偏移量不可用,或者从服务器的复制偏移量相同,那么带有最小运行 ID 的那个从服务器成为新的主服务器

    Sentinel 实战

    环境准备

    角色 主机 IP 端口
    主库 db01 172.16.1.51 6379
    从库 db02 172.16.1.52 6379
    从库 db03 172.16.1.53 6379

    恢复主从状态

    # 修复坏掉的主库
    [root@db01 ~]# redis-server /service/redis/6379/redis.conf 
    [root@db01 ~]# redis-cli -h 172.16.1.51
    172.16.1.51:6379> info replication
    172.16.1.51:6379> SLAVEOF 172.16.1.52 6379
    OK
    172.16.1.51:6379> info replication
    
    # 主库查看
    172.16.1.52:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.16.1.53,port=6379,state=online,offset=4229,lag=1
    slave1:ip=172.16.1.51,port=6379,state=online,offset=4229,lag=1
    master_repl_offset:4229
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:4228
    

    Sentinel 配置

    如果 Redis 设置了密码,需要配置以下参数: sentinel auth-pass <master-name> <password> 

    # 创建目录(随便创建)
    [root@db01 ~]# mkdir /service/redis/26379
    
    # 编辑 Sentinel 配置文件
    [root@db01 ~]# vim /service/redis/26379/sentinel.conf
    port 26379
    daemonize yes
    pidfile /service/redis/26379/sentinel.pid
    logfile /service/redis/26379/sentinel.log
    dir /service/redis/26379
    bind 172.16.1.51 127.0.0.1
    # 定义一个监控的主节点名(mymaster),IP + 端口,法定人数(1,即多个 Sentinel 投票选取从库变更为新主节点,超过 N 票,则选为主节点)
    sentinel monitor mymaster 172.16.1.52 6379 1
    # 检测主库心跳,用 PING 命令检测是否返回 PONG,如果超过 5s 没有回应,判定主库宕机
    sentinel down-after-milliseconds mymaster 5000
    # 执行故障转移的超时时间
    sentinel failover-timeout mymaster 180000
    # 执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
    sentinel parallel-syncs mymaster 1
    
    
    ============= parallel-syncs
    # 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,
    # 但是如果这个数字越大,就意味着在某一个时间点,越多的 Slave 因为 Replication 而不可用,可以通过将这个值设为 1 ,
    # 来保证每次只有一个slave处于不能处理命令请求的状态 。
    ============================
    

    启动 Sentinel

    [root@db01 ~]# redis-sentinel /service/redis/26379/sentinel.conf
    
    #启动之后配置文件会发生改变
    [root@db01 ~]# vim /service/redis/26379/sentinel.conf
    port 26379
    daemonize yes
    pidfile "/service/redis/26379/sentinel.pid"
    logfile "/service/redis/26379/sentinel.log"
    dir "/service/redis/26379"
    bind 172.16.1.51 127.0.0.1
    sentinel myid 7d430385a1269307819e5300ecf09dfbf92b46f5
    sentinel monitor mymaster 172.16.1.52 6379 1
    sentinel down-after-milliseconds mymaster 5000
    sentinel config-epoch mymaster 0
    # Generated by CONFIG REWRITE
    sentinel leader-epoch mymaster 0
    sentinel known-slave mymaster 172.16.1.51 6379
    sentinel known-slave mymaster 172.16.1.53 6379
    sentinel current-epoch 0
    

    停止 Sentinel

    [root@db01 ~]# redis-cli -p 26379 shutdown
    

    测试 Sentinel

    # 关闭主库的 redis
    [root@db02 ~]# redis-cli shutdown
    
    # 查看其它从库主从状态
    172.16.1.51:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=172.16.1.53,port=6379,state=online,offset=586,lag=1
    master_repl_offset:723
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:722
    

    恢复故障节点

    # 修复故障节点
    [root@db02 ~]# redis-server /service/redis/6379/redis.conf 
    
    # 查看主库状态
    172.16.1.51:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.16.1.53,port=6379,state=online,offset=5077,lag=1
    slave1:ip=172.16.1.52,port=6379,state=online,offset=5077,lag=1
    master_repl_offset:5077
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:5076
    

    Sentinel 管理命令(不常用)

    # 连接 Sentinel 管理端口
    [root@db01 ~]# redis-cli -p 26379
    
    # 检测状态,返回 PONG
    127.0.0.1:26379> ping
    PONG
    
    # 列出所有被监视的主服务器
    127.0.0.1:26380> SENTINEL masters
    
    # 列出所有被监视的从服务器
    127.0.0.1:26380> SENTINEL slaves mymaster
    
    # 返回给定名字的主服务器的IP地址和端口号
    127.0.0.1:26380> SENTINEL get-master-addr-by-name mymaster
    1) "172.16.1.51"
    2) "6379
    
    # 重置所有名字和给定模式
    127.0.0.1:26380> SENTINEL reset mymaster
    
    # 当主服务器失效时,在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移 
    127.0.0.1:26380> SENTINEL failover mymaster
    

    设置权重,指定升级为主库的优先级

    # 查看 db02 的权重
    172.16.1.52:6379> CONFIG GET slave-priority
    1) "slave-priority"
    2) "100"
    
    # 修改 db02 的权重值为 0
    172.16.1.52:6379> CONFIG set slave-priority 0
    OK
    
    172.16.1.52:6379> CONFIG GET slave-priority
    1) "slave-priority"
    2) "0"
    
    # 权重值越低越不会优先切换为主库
    
    # 强制开始一次自动故障迁移
    127.0.0.1:26380> SENTINEL failover mymaster
    
    # 再次查看,主库为 db03
    172.16.1.53:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.16.1.52,port=6379,state=online,offset=71377,lag=0
    slave1:ip=172.16.1.51,port=6379,state=online,offset=71377,lag=0
    master_repl_offset:71514
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:70496
    repl_backlog_histlen:1019
    
  • 相关阅读:
    ecos之widget
    一个php小白找工作的历程
    php知识点总结(待续)
    2
    php笔试题1
    兄弟连面试宝典php
    第二十一章 消费者选择理论
    第二十章 收入不平等与贫困
    第十九章 收入与歧视
    第十八章 生产要素市场
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13448273.html
Copyright © 2011-2022 走看看