链接 Redis Sentinel 的一个坑
date
Jan 10, 2024
slug
connect-redis-sentinel
status
Published
tags
中间件
summary
哨兵节点不会直接响应工作命令。
type
Post
Redis Sentinel(哨兵机制)用于监控 Redis 服务器以及提供高可用性和故障转移的自动化。
如下图所示:
Sentinel有以下职责:
- 监控(Monitoring):Sentinel会不断检查您的Redis主服务器和从服务器是否正在正常工作。
- 通知(Notification):当被监视的某个Redis实例出现问题时,Sentinel可以通过API调用来通知其他系统或者人员。
- 自动故障迁移(Automatic failover):当一个主服务器无法正常工作时,Sentinel可以启动故障迁移过程,将其中一个从服务器升级为新的主服务器,并且让其他从服务器改变配置,开始复制新的主服务器。
- 配置提供者(Configuration provider):客户端可以使用Redis Sentinel集群中的任何Sentinel节点来查询关于主服务器和从服务器的信息。这样客户端就不需要硬编码哪个是主服务器、哪个是从服务器了。
由此可见,Sentinel 主要是为了提高可用性而诞生的架构。
链接 Sentinel 的坑
当我们只知道Redis Sentinel的信息时,连接和操作流程如下:
- 首先,我们需要连接到某个已知的Redis Sentinel节点。
- 一旦建立连接,我们可以从该Sentinel节点获取主节点(master)和从节点(slave)的信息。
- 获得这些信息后,我们才能真正地连接到工作节点(即主节点或从节点),并开始执行实际的数据读写操作。
在单节点Redis中,我们可以直接连接到该节点并开始工作。然而,要使用Redis Sentinel,我们必须先连接到Sentinel节点,然后再根据其提供的信息找到实际的工作节点。
需要注意的是,Sentinel节点本身不参与数据的读写操作,它们的主要职责是监控集群的健康状态,并在主节点故障时自动完成故障切换。因此,尽管使用Sentinel可能需要更多的步骤,但这种方式为保证Redis集群的高可用性提供了重要的支持。
下面的图片描述了两者的区别:
我今天在链接redis的时候,忘记我要链接是Sentinel了,日志提示我链接成功,执行
$PING
没问题,$ PING ""
却一直报错,提示:$ ERR wrong number of arguments for 'ping' command
真是百思不得其解啊,在debug非常久之后,发现自己链接到了sentinel节点上了,在这里它只响应
$ PING
,输入额外参数就会报错的。我们在链接到sentinel之后,应该通过以下命令来拿到主从节点的信息,然后再去链接它们进行工作。
- SENTINEL MASTERS Show a list of monitored masters and their state.
- SENTINEL slaves
<master name>
Show a list of slaves for this master, and their state.
- SENTINEL get-master-addr-by-name
<master name>
: 返回给定名字的主服务器的 IP 地址和端口号。
获得地址信息后,再去链接工作节点,然后才能正常响应命令。