容器化redis-cluster使用(一)集群自身ip变化更新问题

6 篇文章 0 订阅
2 篇文章 0 订阅

      最近把redis-cluster集群迁移到了k8s上后发生了一个问题,当一个pod重启后,java程序报错,连不上redis服务器。我们查看集群状态后发现,当pod重启后,pod的ip发生了改变(我们并没有固定redis-cluster的pod的ip),去非重启pod使用cluster nodes查看集群信息,一切正常,但在重启pod节点查看集群信息,发现集群信息中使用的还是重启前的pod的ip。也就是说,当pod重启后,该pod中的redis实例通知了集群中其他成员更新了Cluster topology,但自身却没有更新,截图如下:

这是redis集群信息,大家注意redis-0的ip地址,我们重启redis-0后,redis-0的ip地址如下:

pod启动了47s,其他都是25m,证明重启了,重启后ip地址为172.255.211.7,我们进去redis-0查看集群信息:

发现还是使用重启前的pod的ip,并没更新,再去其他redis节点查看集群信息:

发现集群信息正常,那怎么让他通知自己也更新Cluster topology呢?

参考:https://github.com/antirez/redis/issues/4289这个issue,在启动参数中加入选项

--cluster-announce-ip

最后yaml文件中启动参数如下:


          - "/etc/redis.conf"
          - "--protected-mode"
          - "no"
          - "--cluster-announce-ip"
          - "$(POD_IP)"

再重启pod节点,问题解决。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个使用 `docker-compose` 启动 Redis 集群的示例 `docker-compose.yml` 文件: ```yaml version: '3.7' services: redis-0: image: redis:5.0.7 container_name: redis-0 command: redis-server /usr/local/etc/redis/redis.conf environment: - REDIS_REPLICATION_MODE=cluster - REDIS_CLUSTER_ANNOUNCE_IP=redis-0 - REDIS_CLUSTER_ANNOUNCE_PORT=6379 - REDIS_CLUSTER_CONFIG_FILE=/data/nodes.conf ports: - 6379:6379 volumes: - ./redis-0:/data networks: redis-cluster: ipv4_address: 172.50.0.2 redis-1: image: redis:5.0.7 container_name: redis-1 command: redis-server /usr/local/etc/redis/redis.conf environment: - REDIS_REPLICATION_MODE=cluster - REDIS_CLUSTER_ANNOUNCE_IP=redis-1 - REDIS_CLUSTER_ANNOUNCE_PORT=6379 - REDIS_CLUSTER_CONFIG_FILE=/data/nodes.conf ports: - 6380:6379 volumes: - ./redis-1:/data networks: redis-cluster: ipv4_address: 172.50.0.3 redis-2: image: redis:5.0.7 container_name: redis-2 command: redis-server /usr/local/etc/redis/redis.conf environment: - REDIS_REPLICATION_MODE=cluster - REDIS_CLUSTER_ANNOUNCE_IP=redis-2 - REDIS_CLUSTER_ANNOUNCE_PORT=6379 - REDIS_CLUSTER_CONFIG_FILE=/data/nodes.conf ports: - 6381:6379 volumes: - ./redis-2:/data networks: redis-cluster: ipv4_address: 172.50.0.4 networks: redis-cluster: driver: bridge ipam: driver: default config: - subnet: 172.50.0.0/16 ``` 此 `docker-compose.yml` 文件定义了三个 Redis 节点 (`redis-0`, `redis-1`, `redis-2`),每个节点都使用了相同的 Redis 镜像 (`redis:5.0.7`)。每个节点都映射了它们的容器端口 `6379` 到主机上的端口 `6379`、`6380`、`6381`。每个节点都指定了一个不同的 `ipv4_address`,以便它们可以在同一网络下进行通信。 每个节点都指定了一些环境变量来启用 Redis 集群模式和配置节点的信息。在这个例子中,我们使用了节点的容器名作为节点的 `REDIS_CLUSTER_ANNOUNCE_IP`,并且使用默认的 `6379` 端口。 此外,每个节点都映射了一个本地目录到容器内的 `/data` 目录,以便持久节点数据。在这个例子中,我们将每个节点的数据存储在本地的 `./redis-0`、`./redis-1`、`./redis-2` 目录中。 最后,我们定义了一个名为 `redis-cluster` 的网络,并分配了一个 IP 地址段。每个节点都加入了这个网络,并指定了一个不同的 IP 地址。 要启动 Redis 集群,只需在包含 `docker-compose.yml` 文件的目录中运行 `docker-compose up` 命令即可。注意,在第一次启动集群时,你需要手动执行以下命令来创建集群: ```sh docker exec -it redis-0 redis-cli --cluster create 172.50.0.2:6379 172.50.0.3:6379 172.50.0.4:6379 --cluster-replicas 0 ``` 这创建一个包含三个节点的 Redis 集群,每个节点都没有从节点。你可以根据需要调整节点的数量和从节点的数量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值