当前位置: 首页 > 知识库问答 >
问题:

redis哨兵+主从模式下,怎么实现的读写分离?

蒙胤
2023-07-15

是Jedis这种客户端连接了哨兵后,得到了主从节点缓存到本地,发起命令之前解析命令是读or写,然后请求具体的节点?
还是sentinel统一解析了命令,再做转发?这个过程有负载均衡吗?

网上大多资料介绍读写分离,大多都只是在说主从复制的事,并没有讲解读写分离的过程。
我怎么就知道这个命令是发到从节点执行了呢?

共有1个答案

戚云
2023-07-15

在Redis哨兵+主从模式下实现读写分离的过程如下:

  1. 配置主从复制:首先,需要配置Redis的主从复制。将一个Redis节点作为主节点,其他节点作为从节点。主节点负责处理写操作,并将数据同步到从节点上。
  2. 配置哨兵:在Redis哨兵模式中,哨兵是一个独立的进程,用于监控主节点和从节点的状态。哨兵会定期向主节点和从节点发送PING命令来检测它们是否正常运行。如果发现主节点不可用,哨兵会自动将一个从节点升级为新的主节点,并通知其他从节点切换到新的主节点。
  3. 客户端连接哨兵:客户端使用Jedis等Redis客户端连接到哨兵,而不是直接连接到具体的Redis节点。客户端通过向哨兵发送SENTINEL get-master-addr-by-name命令获取当前的主节点地址。
  4. 获取主节点地址:哨兵会返回当前的主节点地址给客户端。客户端将这个地址缓存到本地。
  5. 解析命令类型:在发起命令之前,客户端会解析命令类型,判断是读操作还是写操作。
  6. 选择具体的节点:根据命令类型,客户端决定将命令发送到具体的Redis节点。如果是读操作,客户端可以选择将命令发送到任意一个从节点。如果是写操作,客户端将命令发送到主节点。
  7. 执行命令:客户端将命令发送到选定的Redis节点执行。
  8. 返回结果:Redis节点执行完命令后,将结果返回给客户端。

这个过程中,哨兵起到了监控和管理的作用,负责检测节点状态、切换主从角色,并提供主节点地址给客户端。客户端根据命令类型选择具体的节点进行读写操作。

在这个过程中,负载均衡是通过客户端来实现的。客户端可以根据自身的策略选择合适的从节点进行读操作,从而实现读写分离和负载均衡。

该答案是从以下官方文档总结出来的(可参考):

  1. Redis官方文档: https://redis.io/documentation
  2. Redis Sentinel文档: https://redis.io/topics/sentinel
  3. Jedis GitHub页面: https://github.com/redis/jedis
 类似资料:
  • 主要内容:哨兵模式原理,哨兵模式应用,sentinel.conf配置项在 Redis 主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性较低,不适用于线上生产环境。 Redis 官方推荐一种高可用方案,也就是 Redis Sentinel 哨兵模式,它弥补了主

  • 我试图在哨兵模式下将Nifi与Redis集成,如本教程所述: https://bryanbende.com/development/2017/10/09/apache-nifi-redis-integration 我的Redis集群有2个节点,运行在端口6391上,还有2个sentinel,运行在端口6392上。它似乎工作正常: PutDistributedMapCache[ID=08E39B65

  • Redis 哨兵(Sentinel)是 Redis 的高可用性(Hight Availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 Sentinel

  • 每一个哨兵都可以连接到我的主人,并可以看到奴隶。它们能够独立地检测主从是否倒下。问题是哨兵们无法探测到对方。 我已经验证了每个哨兵都像预期的那样向通道发布消息,但似乎没有一个哨兵真正从其他哨兵通道接收消息。 我怎么让哨兵们见面?

  • Redis4.x是否兼容使用Sentinels运行TLS?我发现一些线程提到对TLS的支持将被添加到3.2中,但没有任何证实。

  • redis大师可以通过sentinel发现,使用: 现在要将数据写入主节点: