接上篇文章,解决主从复制后,主机宕机,主备不自动切换--哨兵模式
docker 搭建简单的Redis 主从复制(slaveof)并且连接Laravel
搭建哨兵有两种方式
- 哨兵服务和主从机在同一机器上
- 哨兵服务单独开一个redis服务器
一、主机和哨兵在同一台机器上
首先创建哨兵所需配置文件sentinel.conf
,在m1、s1、s2文件下分别创建。
启动redis容器,并且配置主从
注意这里如果直接挂载目录,会有一个错误,产生这个错误的原因就是目录挂载问题
因为Sentinel会在启动后向自己的配置文件中追加内容,它采用的是先创建一个临时配置文件,然后使用它替换掉原来的配置文件的方式。
WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
运行容器、并且配置主从
docker run --name m1 -p 6379:6379 -v E:/Docker/redis/monitor/m1/:/data -d redis
docker run --name s1 -p 6380:6380 -v E:/Docker/redis/monitor/s1/:/data -d redis
docker run --name s2 -p 6381:6381 -v E:/Docker/redis/monitor/s2/:/data -d redis
配置主从,语法:slaveof <host> <port>
,host
为主机 m1
地址,可以通过 docker inspect m1
查看
// s1
docker exec -it s1 redis-cli
slaveof 172.17.0.6 6379
// s2
docker exec -it s2 redis-cli
slaveof 172.17.0.6 6379
编写sentinel.conf
配置文件,配置文件详解
<port>
=> 哨兵默认监听端口
<dir>
=> 指定哨兵工作目录
<daemonize>
=> 是否以守护进程方式启动,默认为否,你可以进行删除或者设置成no
<sentinel monitor mymaster <host> <port> <num>>
声明了要监控的主节点信息。你需要将<host>
和<port>
替换为实际的主节点的IP 地址
或主机名
和端口号
,并设置<num>
为希望达到的哨兵数量
sentinel down-after-milliseconds mymaster 5000
设置哨兵判断主节点不可用的时间阈值为 5000 毫秒(即 5 秒)。如果哨兵在指定的时间内无法与主节点通信,将判断主节点不可用。
sentinel failover-timeout mymaster 10000
设置故障转移的超时时间为 10000 毫秒(即 10 秒)。如果主节点在超过指定时间后仍然不可用,哨兵将启动故障转移操作。
<示例>
=> sentinel monitor mymaster 172.17.0.6 6379 2
port 26379
dir /data
daemonize yes
sentinel monitor mymaster <host> <port> <num>
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
分别进入容器,启动哨兵服务
// m1
docker exec -it m1 bash
redis-sentinel sentinel-conf
// s1
docker exec -it s1 bash
redis-sentinel sentinel-conf
// s2
docker exec -it s2 bash
redis-sentinel sentinel-conf
主从配置完成后
启动哨兵服务完成后
查看哨兵状态
停止主机m1
后
查看 主从信息 info replication
选择完成再次查看 info replication
重新启动 m1 后,成为 s2 的从机
二、哨兵和主从分别在不同的服务器上,需要提前创建目录
docker run -d --name sentinel0 -p 26379:26379 -v E:/Docker/redis/sentinel/m1/:/data redis
docker run -d --name sentinel1 -p 26380:26380 -v E:/Docker/redis/sentinel/s1/:/data redis
docker run -d --name sentinel2 -p 26381:26381 -v E:/Docker/redis/sentinel/s2/:/data redis
E:/Docker/redis/sentinel/m1 、s1、s2 下分别创建 sentinel.conf
文件,并写入配置
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
分别进入sentinel0 、sentinel1、sentinel2 容器启动哨兵服务
docker exec -it sentinel0 bash
reids-sentinel sentinel.conf
停止掉主机 m1 后,会自动选择一个从机升级为主机,实现故障自动转移
sentinel.conf
也可以如下配置
// 版本一
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel known-slave mymaster 172.17.0.7 6380
sentinel known-slave mymaster 172.17.0.8 6381
// 版本二
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel known-slave mymaster 172.17.0.7 6380
sentinel known-slave mymaster 172.17.0.8 6381
sentinel known-sentinel mymaster 172.17.0.9 26379
// 版本三
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
上述配置文件主要的区别是:
- 第一个配置文件:除了配置了主节点的监控信息外,还列出了两个从节点的信息。
- 第二个配置文件:除了配置了主节点的监控信息外,还列出了两个从节点和一个已知的哨兵节点的信息。
- 第三个配置文件:仅配置了主节点的监控信息,没有列出任何从节点或其他哨兵节点的信息。
- 因此,第三个配置文件只关注主节点的监控和故障转移,而忽略了从节点和其他哨兵节点的配置。这意味着在故障转移时,没有指定的从节点或其他哨兵节点来协助决策和执行故障转移操作。
- 如果你只关注主节点的故障转移,并且不需要从节点或其他哨兵节点的协助,那么这个简化的配置文件足够了。但是,如果你希望实现完整的哨兵机制,包括从节点和多个哨兵节点的协作,那么你需要在配置文件中添加相应的信息
Raft 算法简单的剖析
Raft主要有三个角色:领导者、追随者、候选者
- 初始状态下,所有哨兵节点都是追随者,当一个节点成为领导者时,它负责处理客户端请求和复制日志给其他节点。如果当前的领导者失去联系或发生故障,其他节点会发起选举来选择新的领导者。
- 如果一个哨兵节点在一段时间内无法与其他节点通信,它会尝试成为领导者,当多个哨兵节点都尝试成为领导者时,它们会进行选举,即从跟随者转变成为候选者,然后它会向其他节点发送选举请求,求请求他们投票,节点可以投给自己或其他节点,当一个节点收到了大多数节点的投票时(一般是超过半数),它将成为新的领导者
- 成为领导者的哨兵节点会向其他节点发送心跳信号来维持其领导地位
- 如果一个追随者在一段时间内没有收到领导者的心跳信号,它会尝试成为领导者
- 领导者负责监控主节点的健康状态,并在需要时执行故障转移操作
- 当主节点出现故障时,领导者会通知其他节点进行故障转移,选出新的主节点