摘要: 本文记录了在 Docker 环境下搭建 Redis 6.2.6 集群时,遇到的配置文件解析失败报错及其解决方案,并详细记录了通过命令行参数绕过陷阱,成功组建 3 主 3 从集群的完整过程。

1. 前言

最近在本地(CentOS 7 环境)尝试搭建 Redis Cluster 进行学习,使用的是 Redis 6.2.6 镜像。本以为按照官方文档配置 redis.conf 挂载即可,却在启动阶段遭遇了令人抓狂的配置文件报错,最终通过调整启动策略成功解决。特此记录,希望能帮助遇到同样问题的开发者。

2. 遇到的问题:配置文件解析失败

在使用 docker-compose up 启动容器时,日志一直报错退出,核心错误信息如下:

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 2
>>> 'cluster-enabled yes'
Bad directive or wrong number of arguments

排查过程:

  1. 检查配置文件: 我确认 redis.conf 内容完全符合规范,没有多余的 Tab 或语法错误。
  2. 版本兼容性: 怀疑是 Redis 6.x 对配置文件格式有特殊要求(如引号问题),尝试了 cluster-enabled "yes"cluster-enabled 1 等多种写法,均报同样的错。
  3. 文件格式: 检查了文件的换行符(CRLF/LF),排除了 Windows 换行符导致的问题。

结论: 在某些特定环境下(可能与 Docker 镜像的启动脚本有关),直接挂载外部配置文件会导致解析器出现“玄学”错误。既然“文件”读不了,我们就换一种方式——直接把参数写在命令行里

3. 解决方案:命令行参数覆盖配置文件

既然配置文件挂载会报错,我们利用 Redis 支持命令行参数的特性,完全抛弃挂载的 redis.conf,将配置直接注入到容器启动命令中。

步骤一:修改 docker-compose.yaml
删除 volumes 挂载部分,在 command 中直接写入所有配置参数:

version: '3.8' # 忽略版本过时的警告即可
services:
  r1:
    image: redis:6.2.6
    container_name: r1
    # 注意:这里不再挂载 volumes
    command: >
      redis-server 
      --port 7001 
      --cluster-enabled yes 
      --cluster-config-file nodes.conf 
      --cluster-node-timeout 5000 
      --appendonly yes 
      --protected-mode no 
      --daemonize no
    # ... 其他网络和端口配置

步骤二:彻底清理环境
在重新启动前,必须删除旧的残留文件,否则新容器会读取旧的节点信息导致集群混乱:

# 删除旧的配置文件和数据
rm -f redis.conf nodes.conf dump.rdb

# 停止并移除旧容器
docker compose down

# 重新启动
docker compose up -d

结果: 此时查看日志 docker logs r1,Redis 成功启动并显示 Ready to accept connections,且日志中提示 No cluster configuration found,说明这是一个干净的新节点。

4. 集群创建与验证

当 6 个节点容器都正常运行后,我们需要手动执行集群创建命令。

执行创建命令:

docker run -it --rm --network host redis:6.2.6 redis-cli --cluster create \
127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
--cluster-replicas 1

注:--network host 是为了确保容器能通过 127.0.0.1 正确互通。

验证集群状态:
执行命令:

docker run -it --rm --network host redis:6.2.6 redis-cli -p 7001 cluster nodes

最终输出(成功标志):

结果分析:

  • 3 个 Master 节点:分别负责 0-5460, 5461-10922, 10923-16383 的槽位。
  • 3 个 Slave 节点:分别复制对应的 Master。
  • 状态:所有节点均为 connected,且日志显示 [OK] All 16384 slots covered,集群搭建完美成功!
5. 总结与建议
  1. 关于报错: 如果你在 Docker 中遇到 Redis 配置文件报错但文件本身无误的情况,强烈建议尝试将配置写入 command 而非挂载文件,这能避开很多镜像内部的解析坑。
  2. 关于清理: 搭建集群前,务必执行 rm -f nodes.conf dump.rdb。Redis 的集群信息会持久化在这些文件中,旧文件会导致新集群无法握手。
  3. 关于警告: 日志中出现的 overcommit_memory 警告在生产环境中建议修复(执行 sysctl vm.overcommit_memory=1),但在测试环境中可以忽略。

希望这篇笔记能帮到你!如果有其他问题,欢迎在评论区交流。

更多推荐