Docker 部署 Redis 集群学习记录
日期:2025/03/28
环境准备
- 服务器:腾讯云 CentOS 7
- 工具:Docker 已安装
- 网络模式:
host
模式(直接使用宿主机网络)
操作步骤与问题记录
1️⃣ 创建 Redis 容器
# 创建三个节点(注意第三个节点名称应为 redis-node03)
docker create --name redis-node01 --net host -v redis-node01:/data redis:latest \
--cluster-enabled yes --cluster-config-file nodes-node-01.conf --port 6379
docker create --name redis-node02 --net host -v redis-node02:/data redis:latest \
--cluster-enabled yes --cluster-config-file nodes-node-02.conf --port 6380
docker create --name redis-node03 --net host -v redis-node03:/data redis:latest \
--cluster-enabled yes --cluster-config-file nodes-node-03.conf --port 6381
参数 | 说明 |
---|---|
docker create |
创建容器但不立即启动 |
--name redis-node01 |
指定容器名为 redis-node01 |
--net host |
网络模式:直接使用宿主机网络栈 |
-v redis-node01:/data |
卷挂载: - redis-node01 :Docker 卷名 - /data :容器内Redis数据目录 |
redis:latest |
使用官方Redis最新镜像 |
--cluster-enabled yes |
关键参数:启用集群模式 |
--cluster-config-file nodes-node-01.conf |
指定集群配置文件路径(自动生成) |
--port 6379 |
指定Redis服务监听端口 |
✅ 注意:
--net host
模式简化网络配置,但需确保宿主机端口开放。如何开放宿主机端口请看下文
2️⃣ 启动容器并检查
docker start redis-node01 redis-node02 redis-node03
# 检查容器状态
docker ps -a | grep redis-node
3️⃣进入容器内部并执行容器创建
docker exec -it redis-node01 /bin/bash
# 执行集群创建命令
redis-cli --cluster create 宿主机地址:6379 宿主机地址:6380 宿主机地址:6381 --cluster-replicas 0
参数 | 说明 |
---|---|
redis-cli --cluster create |
Redis集群创建命令 |
宿主机地址:6379 |
节点地址格式: - IP/Domain:Port |
--cluster-replicas 0 |
副本数量设置: - 0 表示无副本(纯主节点) - 1 表示每个主节点带1个副本 |
4️⃣ 查询集群信息
root@VM-4-12-centos:/data# redis-cli
127.0.0.1:6379> cluster nodes
ad1c9a3df44045e0e4805eb3f85d43c1c6999a5b 宿主机地址:6380@16380 master - 0 1743129026074 2 connected 5461-10922
0284f37118b72aec004dae663b903bc20dfd48f4 宿主机地址:6381@16381 master - 0 1743129027076 3 connected 10923-16383
ad608bb6a4eac602d99e68fbd67bf98af0ef4af7 10.0.4.12:6379@16379 myself,master - 0 1743129025000 1 connected 0-5460‘
# 直接连接报错
127.0.0.1:6379> set abc 123
(error) MOVED 7638 宿主机地址:6380
127.0.0.1:6379>
# 使用集群模式连接
root@VM-4-12-centos:/data# redis-cli -c
127.0.0.1:6379> set abc 123
-> Redirected to slot [7638] located at 宿主机地址:6380
OK
宿主机地址:6380> get abc
"123"
宿主机地址:6380> del abc
(integer) 1
字段 | 说明 |
---|---|
myself,master |
当前连接的节点(6379)是主节点 |
connected 0-5460 |
负责哈希槽0-5460 |
16379/16380/16381 |
集群总线端口(Redis端口+10000) |
遇到的集群特性问题
1、 直接连接报错
redis-cli --cluster check 10.0.4.12:6379
原因:key"abc"的哈希槽7638属于6380节点,非集群模式连接不会自动重定向
2、集群模式解决方案
redis-cli -c # 使用集群模式连接
127.0.0.1:6379> set abc 123
-> Redirected to slot [7638] located at 宿主机地址:6380
OK
关键点:
-c
参数启用集群自动重定向- 客户端会自动跳转到正确节点执行命令
5️⃣ 配置集群时遇到的问题
错误现象:
- Cannot reconnect to [192.168.0.163:6381]: Connection refused: /192.168.0.163:6381
- redis 创建集群时,Waiting for the cluster to join… 一直…
解决方案:
在腾讯云、宝塔开启对应的6379、6380、6381端口,并在服务器中验证这些端口是否打开
检查端口监听
sudo ss -tulnp | grep 6379 # 无输出,端口未监听
验证防火墙
sudo systemctl status firewalld # 防火墙活跃 sudo firewall-cmd --list-ports # 无目标端口
开放端口并重载
sudo firewall-cmd --add-port={6379,6380,6381}/tcp --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-ports | grep 638 # 验证成功
在尝试使用redis-cli命令创建Redis集群时,如果遇到
Waiting for the cluster to join
长时间无响应的情况,可能是因为云服务器未正确开启集群所需的端口。除了客户端连接端口,还需要开通每个节点的总线端口,即客户端端口加10000。例如,如果客户端端口是6379,总线端口应为16379。确保所有6个节点的端口和对应总线端口都已开放,包括7001到7006节点及其对应的17001到17006总线端口。在云服务器和宝塔面板上都必须配置这些端口的开放权限,以保证集群的正常通信。- 在腾讯云、宝塔中开放对应的端口集群的总线端口,
例如:redis客户端连接的端口为6379,总线端口即为16379 - 参考解放方案1完成开放端口
- 在腾讯云、宝塔中开放对应的端口集群的总线端口,