当前位置:首页 > 问答 > 正文

哨兵模式里怎么查Redis数据,哨兵和普通查询到底啥区别呢

要理解哨兵模式里怎么查数据,最关键的一点是要明白你连接的是谁,这和普通模式有根本的不同。

来源参考:Redis官方文档关于哨兵(Sentinel)和主从复制的章节,以及常见的Redis客户端库(如Jedis、Lettuce)的用法说明。

在普通的、单一节点的Redis或者明确知道主从节点地址的简单主从复制模式下,你的应用程序会直接连接到那个提供读写服务的Redis服务器(通常是主节点),你知道它的IP地址和端口,168.1.100:6379,你的所有命令,无论是读还是写,都直接发往这个地址,查询数据就是简单的发送GET keyHGET key field这样的命令,这种方式非常直接,但有个致命弱点:如果这个主节点宕机了,你的应用就完全无法访问Redis了,直到你手动修复并切换到一个新的主节点。

而哨兵模式就是为了解决这个高可用问题而生的,它不是一个新的数据库,而是一个监控和管理集群的分布式系统,你可以把它想象成Redis集群的“管家”或“调度中心”。

在哨兵模式下,应用程序到底怎么查数据呢?

哨兵模式里怎么查Redis数据,哨兵和普通查询到底啥区别呢

过程其实分两步,而且通常由你的Redis客户端库在背后自动完成:

  1. 先从哨兵那里问路:你的应用程序启动时,配置的连接信息不再是某个具体的Redis服务器地址,而是一个或多个哨兵(Sentinel)节点的地址列表,你可能配置了三个哨兵地址:sentinel1:26379, sentinel2:26379, sentinel3:26379,应用会随机选一个哨兵连接上去,然后问它:“嘿,当前负责写操作的主节点(master)地址是什么?” 哨兵会告诉应用:“当前的主节点是 168.1.101:6379。”

  2. 再连接真正的主节点进行查询:拿到主节点的真实地址后,你的应用程序就会建立一条到真正主Redis服务器的连接,之后,所有的读写操作,包括查询数据,就都和普通模式一样了,直接通过这条连接发送命令,你查询数据用的命令,比如GET, SCAN, HGETALL等,没有任何变化。

这里就引出了最核心的区别:查询动作本身没区别,但查询前的“寻址”过程和故障时的处理方式有天壤之别。

哨兵模式里怎么查Redis数据,哨兵和普通查询到底啥区别呢

哨兵查询和普通查询到底啥区别呢? 我们可以从以下几个层面来详细对比:

连接对象不同(最本质的区别)

  • 普通查询:应用直连Redis数据节点,应用“知道”所有事情,它自己就是路由。
  • 哨兵模式查询:应用先连哨兵,通过哨兵间接连接Redis数据节点,应用是“傻瓜式”的,它把找路的任务交给了哨兵系统。

高可用性(容灾能力)不同

  • 普通查询:主节点宕机,应用就卡住或报错,服务中断,需要人工干预,查询完全无法进行。
  • 哨兵模式查询:当哨兵监控到主节点宕机后,它会自动在剩余的从节点中选举出一个新的主节点,并通知其他从节点切换到这个新主节点,这时,如果你的应用与旧主节点的连接断开了,它会重新向哨兵询问新的主节点地址,然后连接到新主节点继续提供服务,这个过程中,可能会有几秒钟的短暂中断,但无需人工干预,服务能自动恢复,这是哨兵最大的价值。

读写分离的复杂性不同

哨兵模式里怎么查Redis数据,哨兵和普通查询到底啥区别呢

  • 普通查询:在简单主从复制中,如果想实现读写分离(写主读从),应用需要手动管理两条连接:一条连主节点用于写,一条连从节点用于读,这增加了代码的复杂性。
  • 哨兵模式查询:一些高级的客户端库(如Lettuce)可以集成哨兵功能,不仅能自动发现主节点,还能自动发现所有的从节点,应用可以配置为将写命令发往主节点,而将读命令自动地、负载均衡地发往不同的从节点,从而实现透明的读写分离,大大减轻了应用层的负担。

关注的焦点不同

  • 普通查询:你只关心一个或几个固定的Redis地址。
  • 哨兵模式查询:你关心的是哨兵集群的健康状况,只要多数哨兵节点还活着,它们就能共同决策出正确的主节点,保证服务的可用性,你的应用配置里写的是哨兵的地址,而不是Redis数据节点的地址。

你可以把普通查询比喻成直接去一家固定的商店买东西,你知道地址,直接去就行,但万一这家店关门装修,你就白跑一趟。

而哨兵模式下的查询,就像是先用手机APP查一下某个连锁品牌“最近且正在营业”的店铺地址,然后再导航过去,APP(哨兵)会实时更新店铺的营业状态,如果这家店突然关门,APP会立刻给你推荐另一家最近的分店,你不需要记住所有店铺的地址,只需要信任这个APP的导航能力就行。

回到你的问题“哨兵模式里怎么查Redis数据”?答案是:你的应用程序通过查询哨兵来获得当前主节点的地址,然后像普通查询一样向这个地址发送命令。 这个“问路”的过程,以及背后强大的自动故障切换能力,就是它与普通查询最大的区别,查询数据这个动作本身,无论在哪种模式下,都是由Redis服务器执行的,命令和语法没有任何不同。