基于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实例的运行情况.

哨兵原理示意图
基于docker搭建redis哨兵模式_第1张图片

1.1 哨兵的功能与作用

监控(monitoring)

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

提醒(Notifation)

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

自动故障转移(Automatic failover)

1) 当一个Master不能正常工作时,Sintinel会开始一次自动故障转移操作,它会将失效的Master的其中一个Slave升级为新的Master,并让失效的其他Slave改为复制新的Master
2) 当客户端尝试连接失效的Master时,集群会向客户端返回新的Master地址,保证集群可以使用新的Master替代失效的Master.
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.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.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数据同步成功

你可能感兴趣的:(集群搭建,redis,docker,数据库)