Docker 环境下解决 redis-sentinel 服务启动的 “找不到 master” 错误

· 约 8 分钟读完

背景

在使用 Docker 部署 redis 集群时,我们通常会使用 redis-sentinel 来实现高可用性。然而,在某些情况下,我们可能会遇到 redis-sentinel 启动时提示 “找不到 master” 的错误,导致服务无法正常启动。本文将介绍这个问题的原因和解决方案。

问题分析

在 Docker 环境下,我们通常会使用 Docker Compose 来管理多个容器。假设我们的 redis 集群由 3 个节点组成,其中一个节点作为 master,其余两个节点作为 slave。我们在启动 sentinel 容器时,需要指定 master 的 IP 和端口号。通常情况下,我们会使用 Docker Compose 中的服务名来指定 master 的 IP,例如:

这里的 REDIS_MASTER_HOST 参数指定了 master 节点的 IP,使用了 Docker Compose 中的服务名 redis-master。然而,当 sentinel 容器启动时,可能会提示 “找不到 master” 的错误,如下所示:

这个错误的原因是,Docker Compose 中的服务名只在容器之间起作用,而在 sentinel 容器内部,这个服务名是无法解析的。因此,当 sentinel 容器启动时,无法连接到 master 节点,从而导致启动失败。

解决方案

为了解决这个问题,我们需要在 sentinel 容器内部映射 master 节点的 IP 地址。具体来说,我们可以在启动 sentinel 容器时,通过环境变量传递 master 节点的 IP 地址,然后在容器内部使用这个 IP 地址来连接 master 节点。例如:

这里的 REDIS_MASTER_HOST 参数指定了 master 节点的 IP,而不是使用 Docker Compose 中的服务名。在 sentinel 容器内部,我们可以通过环境变量来获取这个 IP 地址,然后使用它来连接 master 节点。例如,在 sentinel.conf 文件中,我们可以这样配置 master 节点的地址:

这里的 ${REDIS_MASTER_HOST} 和 ${REDIS_MASTER_PORT} 分别表示环境变量 REDIS_MASTER_HOST 和 REDIS_MASTER_PORT 的值。这样,在启动 sentinel 容器时,就可以正确连接 master 节点,从而避免 “找不到 master” 的错误。

示例代码

完整的 Docker Compose 文件和 sentinel.conf 文件示例代码如下:

在使用这个 Docker Compose 文件启动 redis 集群时,我们可以通过以下命令启动 sentinel 容器:

这样,sentinel 容器就可以正确连接 master 节点,从而实现高可用性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d104ada941bf7134233118