
一、环境准备与目录结构
在开始部署之前,请确保您的服务器已经安装了Docker和Docker-compose。Redis Cluster集群至少需要6个节点(3主3从)以保证高可用性。我们将通过Docker-compose一次性编排这6个节点。
首先,创建项目目录并初始化数据存储目录:
mkdir -p /opt/redis-cluster cd /opt/redis-cluster for i in $(seq 1 6); do mkdir -p data/node-$i; done
二、编写Redis配置文件
由于每个节点的基础配置基本一致,我们可以编写一个通用的redis.conf,然后将端口和集群总线端口通过docker-compose的命令行参数动态覆盖,这是保持配置简洁且避免错误的关键。
# /opt/redis-cluster/redis.conf port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes daemonize no protected-mode no
注意:在Docker环境下部署Redis集群,最容易出现的错误是节点间无法通信(Cluster State: fail)。这是因为Docker内部的IP与宿主机IP不同,导致节点广播的IP客户端无法访问。因此我们需要在启动时指定 cluster-announce-ip、cluster-announce-port 和 cluster-announce-bus-port。
三、编写docker-compose.yml
下面是完整的docker-compose编排文件。请将 YOUR_HOST_IP 替换为您宿主机的真实IP,或者如果您有域名解析,可以替换为 www.ipipp.com。Redis集群节点间通信不仅需要业务端口(6379映射后的7001-7006),还需要集群总线端口(业务端口+10000,即16379映射后的17001-17006)。
version: '3.8' services: redis-1: image: redis:7.0-alpine container_name: redis-1 ports: - "7001:6379" - "17001:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-1:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7001 --cluster-announce-bus-port 17001 redis-2: image: redis:7.0-alpine container_name: redis-2 ports: - "7002:6379" - "17002:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-2:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7002 --cluster-announce-bus-port 17002 redis-3: image: redis:7.0-alpine container_name: redis-3 ports: - "7003:6379" - "17003:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-3:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7003 --cluster-announce-bus-port 17003 redis-4: image: redis:7.0-alpine container_name: redis-4 ports: - "7004:6379" - "17004:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-4:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7004 --cluster-announce-bus-port 17004 redis-5: image: redis:7.0-alpine container_name: redis-5 ports: - "7005:6379" - "17005:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-5:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7005 --cluster-announce-bus-port 17005 redis-6: image: redis:7.0-alpine container_name: redis-6 ports: - "7006:6379" - "17006:16379" volumes: - ./redis.conf:/etc/redis/redis.conf - ./data/node-6:/data command: redis-server /etc/redis/redis.conf --cluster-announce-ip YOUR_HOST_IP --cluster-announce-port 7006 --cluster-announce-bus-port 17006
四、启动容器与初始化集群
配置文件编写完成后,执行以下命令启动所有Redis节点容器:
docker-compose up -d
确认6个容器均正常运行后,我们需要执行集群的握手与槽位分配。使用以下命令初始化集群(同样请将IP替换为您的宿主机IP或 www.ipipp.com):
redis-cli --cluster create YOUR_HOST_IP:7001 YOUR_HOST_IP:7002 YOUR_HOST_IP:7003 YOUR_HOST_IP:7004 YOUR_HOST_IP:7005 YOUR_HOST_IP:7006 --cluster-replicas 1
如果您宿主机上没有安装redis-cli,也可以直接在其中一个容器内执行:
docker exec -it redis-1 redis-cli --cluster create YOUR_HOST_IP:7001 YOUR_HOST_IP:7002 YOUR_HOST_IP:7003 YOUR_HOST_IP:7004 YOUR_HOST_IP:7005 YOUR_HOST_IP:7006 --cluster-replicas 1
执行过程中,系统会提示您确认集群的分配方案,输入 yes 即可。看到 All 16384 slots covered. 表示集群初始化成功。
五、验证集群状态
集群创建完成后,可以通过客户端连接到任意节点验证集群的工作状态:
docker exec -it redis-1 redis-cli -c -p 6379
进入客户端后,执行以下命令查看集群信息:
127.0.0.1:6379> cluster info 127.0.0.1:6379> cluster nodes
若 cluster_state:ok 且各个节点的角色分配为主从,则说明Redis Cluster集群已完整且正确地部署完毕。您可以尝试写入数据,观察数据的重定向与自动分布情况。
Docker ComposeRedis Cluster集群部署cluster-announce-ipcluster-replicas