两台服务器搭建Redis Cluster时一直卡在等待集群加入状态求助
Redis Cluster创建卡在等待节点加入状态的排查与解决
问题场景
- 架构规划:2台服务器搭建3主3从Redis Cluster
- 服务器1(IP:10.27.62.95):部署端口7000、7002、7003的Redis实例
- 服务器2(IP:10.27.62.124):部署端口7001、7004、7005的Redis实例
- 执行的集群创建命令:
./redis-cli --cluster create 10.27.62.95:7000 10.27.62.124:7001 10.27.62.95:7002 10.27.62.95:7003 10.27.62.124:7004 10.27.62.124:7005 --cluster-replicas 1
- 异常现象:输入
yes确认集群分配方案后,进程一直卡在等待节点加入的状态 - 实例配置示例(以7001端口为例):
protected-mode no port 7001 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no loglevel notice logfile /home/redis2/redis-log.log databases 16 always-show-logo no set-proc-title yes proc-title-template "{title} {listen-addr} {server-mode}" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb rdb-del-sync-files no dir ./ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lazyfree-lazy-user-del no lazyfree-lazy-user-flush no oom-score-adj no oom-score-adj-values 0 200 800 disable-thp yes appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 cluster-enabled yes cluster-node-timeout 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes
排查与解决方法
1. 修复实例绑定地址问题
当前配置未设置bind参数,Redis默认绑定127.0.0.1,导致跨服务器实例无法互相通信(即使protected-mode设为no也无效)。
- 解决:在每个实例的
redis.conf中添加bind 0.0.0.0(允许所有IP访问),或绑定服务器实际IP(如10.27.62.95/10.27.62.124),然后重启所有Redis实例。
2. 确认集群总线端口连通性
Redis Cluster除业务端口(7000-7005)外,还会使用业务端口+10000的端口(如7000对应17000,7001对应17001)进行节点间总线通信。需确保所有服务器的这些端口能互相访问:
- 测试命令示例(在服务器1上测试服务器2的7001端口对应的总线端口):
nc -zv 10.27.62.124 17001
所有实例对应的总线端口都需连通。
3. 调整工作目录权限
配置中dir ./表示使用当前启动目录作为数据目录,若启动Redis的用户无该目录读写权限,会导致RDB/AOF文件无法生成,集群初始化失败。
- 解决:修改
dir为有读写权限的绝对路径(如dir /home/redis2/data),确保启动用户对该目录拥有读写权限,重启实例。
4. 检查实例启动日志
查看实例日志(如配置中的/home/redis2/redis-log.log),排查启动是否存在异常:
- 查看错误日志命令:
cat /home/redis2/redis-log.log | grep ERROR
常见问题包括端口被占用、文件权限不足、配置项语法错误等,根据日志修复后重启实例。
5. 调整集群创建命令的节点顺序
--cluster-replicas 1会按命令中节点顺序分配主从,原命令的节点顺序可能导致从节点集中在同一服务器,虽不会直接导致卡住,但调整顺序可优化主从分布:
- 调整后的命令示例:
./redis-cli --cluster create 10.27.62.95:7000 10.27.62.95:7002 10.27.62.95:7003 10.27.62.124:7001 10.27.62.124:7004 10.27.62.124:7005 --cluster-replicas 1
先列出所有主节点,再列出从节点,Redis会自动尽量将从节点分配到不同服务器。
建议操作流程
- 停止所有Redis实例
- 统一修改所有实例的
bind和dir配置项 - 启动所有实例,检查日志确认无启动错误
- 测试所有业务端口和总线端口的连通性
- 重新执行集群创建命令
内容的提问来源于stack exchange,提问作者Robin Revialus
相关产品推荐
相关产品推荐

