是一个分布式系统,依托于主从模式,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。
哨兵检测主redis,一般来说不会检测从redis,至少有两个哨兵认为主redis节点down掉才会选举其他从redis节点为新的主节点
- 监控:哨兵会不断地检查主节点和从节点是否运作正常。
- 自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
- 通知(提醒):哨兵可以将故障转移的结果发送给客户端。
- 写操作无法负载均衡
- 存储能力受到单机的限制
- 哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。
- 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
- 数据节点:主节点和从节点都是数据节点。
注:sentinel为哨兵
在Redis哨兵模式中,投票算法(Voting Algorithm)用于决定在多个哨兵节点之间如何选择一个主服务器。这个算法通常基于以下规则:
- 多数投票原则:哨兵节点将根据多数投票原则来决定主服务器。如果有超过半数的哨兵节点支持同一个主服务器,那么该主服务器将被选为新的主服务器。
- 权重考虑:每个哨兵节点可能有不同的权重,这取决于其健康状态和性能表现。在投票过程中,哨兵节点将根据其权重进行加权投票。
- 时间窗口:为了防止虚假报警,哨兵节点会等待一定时间窗口后再进行投票。在这个窗口内,如果哨兵节点检测到主服务器的故障或故障恢复,那么它会重新进行投票。
Redis哨兵模式使用特定的协议(如TCP协议)来与其他哨兵节点进行通信,并执行上述的投票算法。在算法执行后,哨兵节点会更新其本地数据库,并通知其他节点。一旦新的主服务器被选出,所有客户端请求都将被导向新的主服务器
此实验依托于redis主从同步(主从同步见上一篇帖),为方便将使用一台linux虚拟机进行。
1.复制redis配置文件,变成一主两从,以确保redis可读取不同的配置文件,在主从同步实验中已复制了配置文件为主6379,从6380,此实验再复制一个从为6381
Cp /etc/6380.conf /etc/6381.conf
搜索dir找到dir /var/lib/redis修改为dir /var/lib/redis/6381
命令行:%s/6380/6381/g 将6380更改为6381(注意不要将slaveof字段更改成6381,可以检查一下)
Mkdir /var/lib/redis/6381 #创建6381的日志文件
Redis-server /etc/6381.conf #启动
检查一主两从是否配置完成
2.复制哨兵配置文件以对应不同的redis
cp /etc/redis-sentinel.conf 26379.conf
cp /etc/redis-sentinel.conf 26380.conf
cp /etc/redis-sentinel.conf 26381.conf
3.更改redis日志文件路径
vim /etc/6379.conf #进入主redis配置文件
搜索logfile找到logfile /var/log/redis/redis.log 更改为logfile /var/log/redis/6379/redis.log
vim /etc/6380.conf #进入主redis配置文件
搜索logfile找到logfile /var/log/redis/redis.log 更改为logfile /var/log/redis/6380/redis.log
vim /etc/6381.conf #进入主redis配置文件
搜索logfile找到logfile /var/log/redis/redis.log 更改为logfile /var/log/redis/6381/redis.log
wq保存退出
4.创建redis日志文件
cd /var/log/redis
查看是否有redis.log日志文件,rm -rf删除redis.log
Mkdir 6379 6380 6381 #创建redis对应的日志目录
5.更改哨兵配置文件
搜索logfile找到logfile /var/log/redis/sentinel.log 更改为logfile /var/log/redis/6379/sentinel.log
搜索mymaster找到sentinel monitor mymaster 127.0.0.1 6379 2(#Sentinel 开始监控名为 "mymaster" 的主服务器,该服务器运行在 IP 地址为 127.0.0.1、端口号为 6379 的机器上,并且当有至少两个 Sentinel 认为此服务器已失效时,才会进行故障转移)更改为redis主IP,sentinel monitor mymaster 192.168.112.161 6379 2
更改Redis服务器监听的IP地址,搜索bind找到bind 127.0.0.1 192.168.1.1,复制这行取消注释,更改为bind 192.168.112.161
搜索daemonize no将no改为yes,若没有这一行,可在最后添加daemonize yes
搜索port更改匹配端口号为port 26379
wq保存退出
Redis-sentinel /etc/26379.conf #启动
搜索logfile找到logfile /var/log/redis/sentinel.log 更改为logfile /var/log/redis/6380/sentinel.log
搜索mymaster找到sentinel monitor mymaster 127.0.0.1 6379 2更改为redis主IP,sentinel monitor mymaster 192.168.112.161 6379 2
更改Redis服务器监听的IP地址,搜索bind找到bind 127.0.0.1 192.168.1.1,复制这行取消注释,更改为bind 192.168.112.161
搜索daemonize no将no改为yes,若没有这一行,可在最后添加daemonize yes
搜索port更改匹配端口号为port 26380
wq保存退出
Redis-sentinel /etc/26380.conf #启动
搜索logfile找到logfile /var/log/redis/sentinel.log 更改为logfile /var/log/redis/6381/sentinel.log
搜索port更改匹配端口号为port 26381
其他同上
Redis-sentinel /etc/26381.conf #启动
注:哨兵最好一个一个启动,不要一起全部启动
6.
cd /var/lib/redis/26379 26380 26381
进入到哨兵目录中查看是否生成了哨兵日志文件
Netstat -anput | grep redis #查看哨兵进程是否启动
down掉主redis,进入6380和6380redis
redis-cli -h 192.168.112.161 -p 6380
192.168.112.161:6380>ROLE #查看主从状态
若哨兵模式已经成功启用,则主redis失效后,哨兵将会在6380和6381中选举一个新的主redis,另外一个为从redis
当旧的主redis6379重新启动后,6379则会变成从redis
选举日志路径:/var/lib/redis/6379/redis.log 若没有自行创建6379目录,则在/var/lib/redis中