REDIS哨兵模式

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis哨兵模式是一种用于实现Redis高可用性的机制。在哨兵模式下,有一个或多个哨兵进程监控Redis主节点和从节点的状态,并在主节点出现故障时自动将一个从节点升级为新的主节点,以确保系统的持续可用性。

前言

Redis哨兵模式是一种用于实现Redis高可用性的机制。在哨兵模式下,有一个或多个哨兵进程监控Redis主节点和从节点的状态,并在主节点出现故障时自动将一个从节点升级为新的主节点,以确保系统的持续可用性。

哨兵进程通过发送心跳检测来监控Redis节点的状态。如果主节点出现故障,哨兵会选举一个新的主节点,并将其他从节点重新配置为新的主节点的从节点。这个过程是自动进行的,无需人工干预。

哨兵模式还可以处理多个从节点的故障。当多个从节点同时失效时,哨兵会重新配置剩余的从节点,并将它们连接到新的主节点上。这样即使有多个节点发生故障,系统依然可以保持正常运行。

除了监控和自动故障恢复外,哨兵模式还提供了一些其他功能,如配置管理、节点间通信等。它可以通过发布订阅机制实时通知客户端节点的状态变化,方便客户端进行相应的调整。

总的来说,Redis哨兵模式是一种实现Redis高可用性的解决方案,它通过监控和自动故障恢复来确保系统的持续可用性,同时提供了一些其他功能来方便客户端的管理和调整。


 

一、哨兵模式概念


依托于主从模式

是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。

二、作用


监控:哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

通知(提醒):哨兵可以将故障转移的结果发送给客户端。

三、缺点


写操作无法负载均衡

存储能力受到单机的限制

哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

四、结构


哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

数据节点:主节点和从节点都是数据节点。

五、搭建


1、yum 安装的 哨兵模式配置文件位置位于 /etc/redis-sentinel.conf 一般一个REDIS都会伴随一个哨兵,但是他默认是关闭的,可以根据下图内容操作开启哨兵模式

关闭保护模式

protected-mode no

Redis哨兵默认的监听端口

port 26379

2.我们先进行主从配置:1主3从,复制并修改他们的配置文件

[root@localhost etc]# cp redis.conf /opt/redis_6380.conf
[root@localhost etc]# cp redis.conf /opt/redis_6381.conf
[root@localhost etc]# cp redis.conf /opt/redis_6382.conf
[root@localhost etc]# vim /opt/redis_6380.conf 
[root@localhost etc]# vim /opt/redis_6381.conf 
[root@localhost etc]# vim /opt/redis_6382.conf 
[root@localhost etc]# redis-server /opt/redis_6380.conf 
[root@localhost etc]# redis-server /opt/redis_6381.conf 
[root@localhost etc]# redis-server /opt/redis_6382.conf 
[root@localhost etc]# netstat -anput |grep redis
tcp        0      0 192.168.73.10:6379      0.0.0.0:*               LISTEN      12833/redis-server  
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      13699/redis-server  
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      13711/redis-server  
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      13723/redis-server  
tcp        0      0 192.168.73.10:37065     192.168.73.10:6379      ESTABLISHED 13723/redis-server  
tcp        0      0 192.168.73.10:34195     192.168.73.10:6379      ESTABLISHED 13699/redis-server  
tcp        0      0 192.168.73.10:6379      192.168.73.10:37065     ESTABLISHED 12833/redis-server  
tcp        0      0 192.168.73.10:6379      192.168.73.10:34195     ESTABLISHED 12833/redis-server  
tcp        0      0 192.168.73.10:46341     192.168.73.10:6379      ESTABLISHED 13711/redis-server  
tcp        0      0 192.168.73.10:6379      192.168.73.10:46341     ESTABLISHED 12833/redis-server  

验证

[root@localhost etc]# redis-cli -h 192.168.73.10 -p 6379
192.168.73.10:6379> role
1) "master"
2) (integer) 435
3) 1) 1) "192.168.73.10"
      2) "6380"
      3) "435"
   2) 1) "192.168.73.10"
      2) "6381"
      3) "435"
   3) 1) "192.168.73.10"
      2) "6382"
      3) "435"

3.同理配置哨兵模式文件并拷贝

关闭保护模式

protected-mode no

Redis哨兵默认的监听端口

port 26379
vim /etc/redis-sentinel.conf

以此为模版,以端口区分命名cp,并修改这些文件对应的端口

[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6380.conf
[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6381.conf
[root@localhost opt]# cp /etc/redis-sentinel.conf /opt/redis-sentinel_6383.conf

修改完成后启动并查看

[root@localhost opt]# systemctl start redis-sentinel.service 
[root@localhost opt]# redis-sentinel redis-sentinel_6380.conf 
[root@localhost opt]# redis-sentinel redis-sentinel_6381.conf  
[root@localhost opt]# netstat -anput |grep redis
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      14843/redis-sentine 
tcp        0      0 192.168.73.10:6379      0.0.0.0:*               LISTEN      12833/redis-server  
tcp        0      0 0.0.0.0:26380           0.0.0.0:*               LISTEN      14867/redis-sentine 
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      13699/redis-server  
tcp        0      0 0.0.0.0:26381           0.0.0.0:*               LISTEN      14878/redis-sentine 
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      13711/redis-server  

验证:我们将master结束进程

[root@localhost opt]# kill -9 12833
[root@localhost opt]# netstat -anput |grep redis
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      14843/redis-sentine 
tcp        0      0 0.0.0.0:26380           0.0.0.0:*               LISTEN      14867/redis-sentine 
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      13699/redis-server  
tcp        0      0 0.0.0.0:26381           0.0.0.0:*               LISTEN      14878/redis-sentine 
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      13711/redis-server  

查看哨兵是否选取出新的master:

查看日志文件获取信息,得知6381的REDIS成为了master

vim /var/log/redis/sentinel.log

 

14878:X 08 Aug 2023 22:07:36.999 # +elected-leader master mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:36.999 # +failover-state-select-slave master mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.099 # +selected-slave slave 192.168.73.10:6381 192.168.73.10 6381 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.100 * +failover-state-send-slaveof-noone slave 192.168.73.10:6381 192.168.73.10 6381 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.183 * +failover-state-wait-promotion slave 192.168.73.10:6381 192.168.73.10 6381 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.185 # +promoted-slave slave 192.168.73.10:6381 192.168.73.10 6381 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.185 # +failover-state-reconf-slaves master mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:37.254 * +slave-reconf-sent slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6379
14867:X 08 Aug 2023 22:07:37.257 # +config-update-from sentinel bced7d4d454ab39f3095a2959bada012c3e335d3 192.168.73.10 26381 @ mymaster 192.168.73.10 6379
14867:X 08 Aug 2023 22:07:37.257 # +switch-master mymaster 192.168.73.10 6379 192.168.73.10 6381
14867:X 08 Aug 2023 22:07:37.257 * +slave slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6381
14867:X 08 Aug 2023 22:07:37.257 * +slave slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6381
14867:X 08 Aug 2023 22:07:37.257 * +slave slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381
14843:X 08 Aug 22:07:37.257 # +new-epoch 1
14843:X 08 Aug 22:07:37.257 # +config-update-from sentinel bced7d4d454ab39f3095a2959bada012c3e335d3 192.168.73.10 26381 @ mymaster 192.168.73.10 6379
14843:X 08 Aug 22:07:37.257 # +switch-master mymaster 192.168.73.10 6379 192.168.73.10 6381
14843:X 08 Aug 22:07:37.257 * +slave slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6381
14843:X 08 Aug 22:07:37.257 * +slave slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6381
14843:X 08 Aug 22:07:37.257 * +slave slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381
14878:X 08 Aug 2023 22:07:38.017 # -odown master mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:38.256 * +slave-reconf-inprog slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:38.256 * +slave-reconf-done slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:38.314 * +slave-reconf-sent slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:39.333 * +slave-reconf-inprog slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:39.333 * +slave-reconf-done slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:39.394 # +failover-end master mymaster 192.168.73.10 6379
14878:X 08 Aug 2023 22:07:39.395 # +switch-master mymaster 192.168.73.10 6379 192.168.73.10 6381
14878:X 08 Aug 2023 22:07:39.395 * +slave slave 192.168.73.10:6380 192.168.73.10 6380 @ mymaster 192.168.73.10 6381
14878:X 08 Aug 2023 22:07:39.395 * +slave slave 192.168.73.10:6382 192.168.73.10 6382 @ mymaster 192.168.73.10 6381
14878:X 08 Aug 2023 22:07:39.395 * +slave slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381
14867:X 08 Aug 2023 22:08:07.290 # +sdown slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381
14843:X 08 Aug 22:08:07.313 # +sdown slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381
14878:X 08 Aug 2023 22:08:09.473 # +sdown slave 192.168.73.10:6379 192.168.73.10 6379 @ mymaster 192.168.73.10 6381

登录6381端口验证

如果此时将原来的master6379上线,6381还会是master吗?

答案是不会


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
监控 负载均衡 NoSQL
Redis之哨兵模式
Redis之哨兵模式
|
4月前
|
消息中间件 NoSQL Redis
Redis高可用之哨兵模式(第二部分)
Redis高可用之哨兵模式(第二部分)
|
4月前
|
监控 NoSQL 算法
Redis之哨兵模式
【1月更文挑战第8天】哨兵模式说白点就是:自动选举老大的模式。
196 6
|
6天前
|
监控 NoSQL Redis
Redis的哨兵模式详解
Redis的哨兵模式详解
25 0
|
6月前
|
存储 监控 NoSQL
redis主从模式,redis哨兵模式,redis集群模式
redis主从模式,redis哨兵模式,redis集群模式
redis主从模式,redis哨兵模式,redis集群模式
|
4月前
|
缓存 监控 NoSQL
Redis的哨兵模式是什么?它的作用是什么?
Redis的哨兵模式是什么?它的作用是什么?
167 0
|
4月前
|
NoSQL 算法 Redis
Redis哨兵模式原理
Redis哨兵模式原理
49 0
|
5月前
|
存储 运维 监控
百度搜索:蓝易云【【NOSQL】redis哨兵模式、集群搭建详解。】
总结来说,Redis哨兵模式和集群都是为了提高Redis的高可用性和可伸缩性。哨兵模式适用于少数几个Redis节点的环境,当主节点不可用时能够自动进行故障切换。而集群则适用于大规模数据存储和处理的场景,通过数据分片和故障检测实现分布式的高性能Redis环境。根据具体需求,选择适合的方案来搭建Redis环境。
38 0
|
5月前
|
监控 NoSQL 算法
Redis哨兵模式部署,哨兵模式原理分析以及图解
Redis哨兵模式部署,哨兵模式原理分析以及图解
151 0
|
5月前
|
NoSQL Redis Docker
使用bitnamiredis-sentinel部署Redis 哨兵模式
使用bitnamiredis-sentinel部署Redis 哨兵模式
186 0