• 基于docker搭建redis哨兵模式


    github学习笔记

    Redis 哨兵架构

    1. redis 哨兵模式介绍
    1) 哨兵模式是Redis的高可用方式,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。
    
    2) 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点挂掉时,哨兵会第一时间感知到,并且在slave节点中重新选出来一个新的master,然后将新的master信息通知给client端,从而实现高可用。这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息
    
    3) Sentinel 哨兵是redis官方提供的高可用方案,它可以用来监听多个redis实例的运行情况.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    哨兵原理示意图
    在这里插入图片描述

    1.1 哨兵的功能与作用

    监控(monitoring)

    Sentinel 会不断的检查集群中的Master和Slave是否正常运行.
    
    • 1

    提醒(Notifation)

    当redis集群中被监听的某个redis服务器出现问题时,Sentinel会通过API向管理员或者其他应用程序发送通知.
    
    • 1

    自动故障转移(Automatic failover)

    1) 当一个Master不能正常工作时,Sintinel会开始一次自动故障转移操作,它会将失效的Master的其中一个Slave升级为新的Master,并让失效的其他Slave改为复制新的Master
    2) 当客户端尝试连接失效的Master时,集群会向客户端返回新的Master地址,保证集群可以使用新的Master替代失效的Master.
    
    • 1
    • 2
    1.2 哨兵工作原理
    1) 在redis sentinel中,一共有3个定时任务,通过这些任务,来发现新增节点和节点的状态。
        A) 每10秒每个sentinel节点对master节点和slave节点执行info操作
        B) 每2秒每个sentinel节点通过master节点的channel (sentinel:hello)交换信息
        C) 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
    
    2) 主观下线(SDOWN)︰当前sentintel节点认为某个redis节点不可用。
        A) 如果一个实例(instance))距离最后一次有效回复PING命令的时间超过down-after-miliseconds所指定的值,那么这个实例会被Sentinel标记为主观下线。
        C) 如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有Sentinel节点,要以每秒一次的频率确认主服务器的确进入了主观下线状态。
    
    3) 客观下线(ODOWN)一定数量sentinel节点认为某个redis节点不可用。
        A) 如果一个主服务器被标记为主观下线,并且有足够数量的Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这—判断,那么这个主服务器被标记为客观下线。
        B) 在一般情况下,每个Sentinel会以每10秒一次的频率,向它已知的所有主服务器和从服务器发送INFO命令。当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送INFO命令的频率,会从10秒一次改为每秒一次。
        C) Sentinel和其他Sentinel协商主节点的状态,如果主节点处于ODOWN状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。
    
    4) 当没有足够数量的sentinel同意主服务器下线时,主服务器的客观下线状态就会被移除。当主服务器重新向Sentinel的PING命令返回有效回复时,主服务器的主观下线状态就会被移除。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1.3 故障转移流程
    1) 哨兵内部领导者选举
        A) 每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者
        B) 收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝
        C) 如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者
        D) 如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举
     
    2) Master选举
        A) 选择slave-priority最高的slave节点
        B) 选择复制偏移量最大的节点
        C) 选runld最小的(启动最早)
    
    3) 状态更换
        A) 选举出新的master节点,其余的节点变更为新的master节点的slave节点
        B) 原有的master节点重新上线,成为新的master节点的slave节点
    
    4) 通知客户端
        A) 当所有节点配置结束后,sentinel会通知客户端节点变更信息
        B) 客户端连接新的Master
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1.4 哨兵模式搭建

    redis主从搭建流程

    # 需要保证原本三个主从同步容器相互配置节点的连接信息即 配置文件设置
    requirepass masterpassword # 设定密码
    masterauth 
    
    
    # 一个稳健的RedisSentinel集群,应该使用至少三个Sentinel实例,并且保证将这些实例放到不同的机器上,甚至不同的物理区域
    # 启动命令 redis-sentinel /opt/sxt/redis /conf/sentine1.conf
    #设置哨兵的接口
    port 20600
    
    # sentine1 monitor关键字
    # master 给主从服务器集群起一个名字(监控主服务器,从服务器的信息也就获取了)主服务器的IP和端口
    # 2主服务器失效的统计数,超过2票就认为失效
    sentinel monitor redis-master 172.17.0.2 20601 2
    
    # 设置主服务器密码
    sentinel auth-pass redis-master 123456
    
    # 主服务器下线超过10秒就进行切换(默认30S)
    sentinel down-after-milliseconds redis-master 1000
    
    # 故障转移超时时间
    sentinel failover-timeout redis-master 180000
    
    # 故障转移时,允许有多少个s7ave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
    sentine1 para77e1-s yncs  redis-master 1
    
    # 关闭安全校验
    protected-mode yes
                    
    
    #----------------配置文件修改完成------------------------------------------------------------------------------------------------
    # 启动三个sentinel容器,将配置文件copy进容器里边去
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker run -it --name sentinel1  -d -p 20600:20600 redis /bin/bash
    725d76dea8cb8f75574608b203788ac4a9108b38766ff8243aa9646e1e38c95f
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker run -it --name sentinel2  -d -p 20601:20600 redis /bin/bash
    f5c304024473374815af250142a2a994d42619b8212986188cf66d6c5529a1b2
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker run -it --name sentinel3  -d -p 20602:20600 redis /bin/bash
    4ee51bd3cc3e9d2b26521a783c61742345b087fd3b55d9f4f886b239fb54c611
    
    # copy sentinel.conf
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker cp sentinel.conf sentinel1:/data/
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker cp sentinel.conf sentinel2:/data/
    [root@iZ2ze58f53sxjm9z7mgn5xZ ~]# docker cp sentinel.conf sentinel3:/data/
    
    # 进入三个哨兵容器启动哨兵
    root@725d76dea8cb:/data# redis-sentinel sentinel.conf 
    53:X 16 Sep 2022 13:43:49.149 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    53:X 16 Sep 2022 13:43:49.149 # Redis version=7.0.4, bits=64, commit=00000000, modified=0, pid=53, just started
    53:X 16 Sep 2022 13:43:49.149 # Configuration loaded
    53:X 16 Sep 2022 13:43:49.150 * monotonic clock: POSIX clock_gettime
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 7.0.4 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._                                  
     (    '      ,       .-`  | `,    )     Running in sentinel mode   #可以看到是哨兵模式
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 20600
     |    `-._   `._    /     _.-'    |     PID: 53
    
    
    
    # 所有哨兵启动完成之后测试,停止掉redis-master容器会看到一下信息
    
    # 原本其中的slave结点无法写
    127.0.0.1:6379> set t1 v1
    (error) READONLY You can't write against a read only replica.
    
    # 停止掉master之后哨兵会出现以下信息
    
    19:X 16 Sep 2022 14:03:52.350 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    19:X 16 Sep 2022 14:03:52.354 * Sentinel new configuration saved on disk
    19:X 16 Sep 2022 14:03:53.353 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    
    
    # 之后会重新挑选一个slave为新的master,可以进行写操作
    127.0.0.1:6379> set t1 v1
    OK
    
    
    # 重新启动原来的master
    20:X 16 Sep 2022 14:13:38.711 # -sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    20:X 16 Sep 2022 14:17:52.892 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    20:X 16 Sep 2022 14:18:34.347 * +reboot slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    20:X 16 Sep 2022 14:18:34.410 # -sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ redis-master 172.17.0.4 6379
    
    
    # 修改现在新的master数据同步成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
  • 相关阅读:
    部门新来了个阿里25K出来的,让我见识到了什么是天花板
    手机号的正则表达式
    再见,Ubuntu,你好,Manjaro
    【企业微信扫码登录】html网页中如何实现企业微信扫码登录功能,图文描述简单三步实现
    bug记录——设置了feign的fallback,但是没有生效
    463. 岛屿的周长
    计算机内存分配
    C# using语句使用介绍
    阿里云全球实时传输网络GRTN—QOE优化实践
    kingbase之ksql命令工具
  • 原文地址:https://blog.csdn.net/qq_45061361/article/details/126899027