0x1 什么是哨兵模式
Redis Sentinel(哨兵)是Redis的高可用性解决方案之一,它允许Redis集群在主从复制模式下自动故障转移,从而实现高可用性。Redis Sentinel集群通常由多个哨兵和多个Redis实例组成,哨兵的作用是监控Redis主节点和从节点的状态,并在主节点出现故障时,自动将从节点升级为新的主节点,以便维护Redis集群的可用性。
当Redis Sentinel集群中的一个哨兵检测到主节点不可用时,它会向其他哨兵发送通知,以便集群中的所有哨兵都可以达成共识,并选择一个从节点升级为新的主节点。一旦新的主节点被选出,所有哨兵将向客户端广播通知,以便客户端可以重新连接到新的主节点。
Redis Sentinel还可以监控Redis实例的健康状态,如CPU、内存和网络使用情况,以便进行故障排除和性能优化。Redis Sentinel还支持动态配置,如添加或删除Redis实例,以便动态扩展和缩小Redis集群的规模。
0x2 需要什么知识储备
- redis的使用和redis的配置
- redis-sentinel命令的使用和配置
- 熟悉变成语言连接redis的操作
0x3 架构设计
现在只用一台服务器模拟,所以采用统一服务器不同端口的方案
应用 | ip | port |
---|---|---|
redis | 127.0.0.1 | 6379 |
redis | 127.0.0.1 | 6380 |
redis | 127.0.0.1 | 6381 |
redis-sentinel | 127.0.0.1 | 26379 |
redis-sentinel | 127.0.0.1 | 26380 |
redis-sentinel | 127.0.0.1 | 26381 |
0x4 redis的配置和搭建
要有redis哨兵首先要有redis集群,在哨兵模式下我们一般采用单数个redis实例,这是因为在Redis Sentinel中,故障转移的机制是通过哨兵之间的投票来实现的。当一个哨兵检测到主节点不可用时,它会向其他哨兵发送通知,询问其他哨兵对于进行故障转移的候选从节点的意见,最后根据投票结果选举一个从节点作为新的主节点。
如果使用偶数个Redis实例,则在哨兵之间进行投票时可能会出现平局的情况,从而导致无法进行故障转移。因此,使用单数个Redis实例可以避免这种情况的发生,确保故障转移的可靠性。
同时,使用单数个Redis实例还可以避免主节点和从节点的平衡问题,因为在Redis Sentinel中,每个Redis实例只能拥有一个主节点和多个从节点,如果使用偶数个Redis实例,可能会导致主节点和从节点的数量不均衡,从而影响Redis集群的性能和可用性。
所以在这个试验中,我们使用三个实例,分别监听6379、6380、6381
sudo apt-get install -y redis-server
mv /etc/redis/redis.conf /etc/redis/redis-6379.conf
cp /etc/redis/redis-6379.conf /etc/redis/redis-6380.conf
cp /etc/redis/redis-6379.conf /etc/redis/redis-6381.conf
// 创建redis的存储位置
mkdir -p /data/redis/data
mkdir -p /data/redis/log
// 修改redis-6379.conf
port 6379
appendonly yes
dir "/data/redis/data"
appendfilename "6379-appendonly.aof"
logfile "/data/redis/log/redis-server-6379.log"
requirepass "10000"
// 修改redis-6380.conf
port 6380
appendonly yes
dir "/data/redis/data"
appendfilename "6380-appendonly.aof"
replicaof 127.0.0.1 6379
logfile "/data/redis/log/redis-server-6380.log"
requirepass "10000"
// 修改redis-6381.conf
port 6381
appendonly yes
dir "/data/redis/data"
appendfilename "6381-appendonly.aof"
r**eplicaof 127.0.0.1 6379
logfile "/data/redis/log/redis-server-6381.log"
requirepass "10000"**
修改完成了之后分别启动这个三个实例
// 启动6379
redis-server /etc/redis/redis-6379.conf
// 启动6380
redis-server /etc/redis/redis-6380.conf
// 启动6381
redis-server /etc/redis/redis-6381.conf
这是我们已经启动了三个实例了,而且现在的架构是一主二从,而且redis的密码都是10000,密码的设置必须一致。
0x5 哨兵的搭建和配置
通过上面的操作,我们已经有了三个redis的实例分别监听不同的端口,接下来,我们需要在每个实例所在的服务器上安装Redis哨兵软件。可以通过以下命令安装:
sudo apt-get update
sudo apt-get install redis-sentinel
安装完成后,我们需要创建三个Redis Sentinel配置文件,例如:
// /etc/redis/sentinel-26379.conf
port 26379
dir "/data/redis/log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
logfile "/data/redis/log/redis-sentinel-26379.log"
// /etc/redis/sentinel-26380.conf
port 26380
dir "/data/redis/log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
logfile "/data/redis/log/redis-sentinel-26380.log"
// /etc/redis/sentinel-26381.conf
port 26381
dir "/data/redis/log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
logfile "/data/redis/log/redis-sentinel-26381.log"
在这个配置文件中,我们指定了Redis Sentinel的端口号(26379、26380、26381),以及监控的Redis主节点的IP地址、端口号和需要至少有多少个哨兵达成共识才能进行故障转移等参数。
然后启动redis-sentinel哨兵
// 启动
redis-sentinel /etc/redis/sentinel-26379.conf
redis-sentinel /etc/redis/sentinel-26380.conf
redis-sentinel /etc/redis/sentinel-26381.conf
0x6 验证流程
上面我们已经搭建好哨兵,现在开始进行验证
先进入redis
redis-cli -p 6380 -a 10000
查看当前的主从情况
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
可以看到,当前6379端口的redis为主redis,这时候我们关闭这个redis,看是否有其他的redis会自动升级为主redis
// 关闭6379redis
redis-cli -p 6379 -a 10000 shutdown
// 重新在6380连接中查看
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
这时候我们发现6381经过投票之后升为主redis了,这说明我们的redis哨兵高可用已经生效。
0x7 总结
redis在互联网应用中十分常见,经常充当一些关键的角色,保证redis的高可用十分重要,这些方面还是需要多思考学习,如果在阅读过程中有什么疑惑,欢迎留言或者咨询博主。