资讯动态

Redis三主三从集群一键部署脚本:CentOS自动化搭建与避坑指南

发布时间:2026/10/15 9:17:01 来源:尧图企业网站定制
简介这是一份面向运维工程师与后端开发者的 Redis 集群自动化部署工具包针对 CentOS 7.X 环境下手工搭建集群步骤繁琐、易出错的痛点通过 shell 脚本将下载源码、编译安装、节点配置与集群创建等流程一键串联适合具备一定 Linux 基础、希望快速验证或落地 Redis 集群的读者。压缩包共 5 个文件以 3 个 sh 脚本为主辅以 1 个 gz 源码包和 1 个 txt 说明文档整体约 1.86MB脚本分别承担主流程调度、节点部署与卸载清理等职责源码包用于本地编译安装。资源围绕主从复制、16384 槽分配、故障转移等集群机制展开读者可参照说明文档修改 IP 与端口后依次执行脚本省去逐台机器重复配置的麻烦同时借助卸载脚本快速回滚环境便于反复测试与排错。目前已有 775 人学习下载适合作为集群部署的入门实践参考。1. 从手工搭三主三从到一键脚本Redis 集群部署到底省了哪几步如果你在 CentOS 上手工搭过一次 Redis 三主三从集群大概会记得那种感觉六份配置文件、六个端口、六次启动、一次redis-cli --cluster create中间任何一步写错 IP 或端口就得删掉nodes.conf重来。这份「redis集群一键自动部署脚本.rar」解决的就是这件事——把重复的配置生成、目录创建、实例启动、集群握手全部收进一个 shell 脚本里在 CentOS 环境下跑一遍就能拿到一个可用的集群。它适合两类人一是需要频繁重建测试环境的运维和开发二是刚接触 Redis 集群、想先跑通再研究细节的新手。脚本本身不神秘但它把容易翻车的参数固化了下来这才是价值所在。2. 脚本拆开看目录结构、配置生成与集群握手2.1 先看清压缩包里有什么拿到压缩包后别急着执行先解压看结构。常见的一键部署脚本包目录大致是这样组织的# 解压后进入目录查看 tar -xvf redis集群一键自动部署脚本.rar -C ./redis-cluster-deploy cd redis-cluster-deploy ls -l典型内容会包含主脚本如install.sh或deploy.sh、一个配置模板文件redis.conf.tpl、可能还有一个README或参数说明。有些版本会把 Redis 安装包也塞进去有些则假设你已经装好了 Redis。这一步的意义在于确认脚本的「假设前提」——它默认 Redis 装在哪、用的是哪个版本、配置文件模板里哪些字段是占位符。我一般会先cat一遍主脚本重点看三处变量定义区端口、节点数、密码、循环创建实例的段落、最后调用redis-cli --cluster create的那一行。看懂这三处后面改参数就不会瞎改。2.2 配置模板里的关键参数怎么改脚本的核心逻辑是「用一份模板生成六份配置」。模板里通常用占位符标记需要替换的字段比如__PORT__、__NODE_ID__、__DATA_DIR__。你需要关注的参数集中在下面几个参数作用常见取值注意点port每个实例的监听端口7000-7005必须连续且不冲突cluster-enabled是否开启集群模式yes不开这个后面全白搭cluster-config-file节点信息文件nodes-7000.conf每个实例必须不同appendonly是否开 AOFyes/no测试环境可关生产建议开bind监听地址0.0.0.0 或内网 IP写 127.0.0.1 会导致集群握手失败requirepass访问密码自定义设了密码cluster create 也要带 -a改模板时最容易忽略的是bind。很多人图省事写127.0.0.1结果redis-cli --cluster create阶段节点之间互相连不上报Could not connect to Redis at ...。集群模式下节点需要用配置里的地址互相通信所以要么写实际内网 IP要么写0.0.0.0并确保防火墙放行。2.3 一键执行时脚本到底做了哪几件事理解脚本的执行链路比盲目跑一遍更有用。一个合格的部署脚本按顺序会完成这些动作# 伪代码式流程对应脚本里的主要步骤 # 1. 检查 Redis 是否已安装 which redis-server || echo 请先安装 Redis # 2. 按节点数循环创建目录和配置 for port in 7000 7001 7002 7003 7004 7005; do mkdir -p /data/redis-cluster/$port sed s/__PORT__/$port/g redis.conf.tpl /data/redis-cluster/$port/redis.conf done # 3. 逐个启动实例 for port in 7000 7001 7002 7003 7004 7005; do redis-server /data/redis-cluster/$port/redis.conf --daemonize yes done # 4. 等待实例就绪后组建集群 redis-cli --cluster create \ 192.168.1.10:7000 192.168.1.10:7001 192.168.1.10:7002 \ 192.168.1.10:7003 192.168.1.10:7004 192.168.1.10:7005 \ --cluster-replicas 1这段流程里第 2 步的sed替换是配置生成的关键它把模板里的占位符换成真实端口。第 3 步用--daemonize yes让实例后台运行否则脚本会卡在第一个实例的前台输出上。第 4 步的--cluster-replicas 1表示每个主节点配一个从节点六个实例正好三主三从。脚本通常会在这步之前加一个sleep或轮询检测等所有实例的端口都能响应了再执行 create否则会报Node ... is not empty或连接超时。2.4 验证集群是否真的可用脚本跑完不代表集群就健康了。至少要做三件事确认# 查看集群状态 redis-cli -p 7000 cluster info # 期望看到 cluster_state:ok # 查看节点拓扑 redis-cli -p 7000 cluster nodes # 应该看到 3 个 master 和 3 个 slaveslave 后面跟着对应的 master-id # 写入一个 key 测试数据分布 redis-cli -c -p 7000 set testkey hello redis-cli -c -p 7000 get testkeycluster info里的cluster_state如果是ok说明所有槽位都分配了且节点间通信正常。如果显示fail多半是有节点没起来或者槽位没分完。cluster nodes的输出里每个 master 后面会跟一串数字表示它负责的哈希槽范围三个 master 的槽位加起来应该是 0-16383 全覆盖。用-c参数连接时客户端会自动跟随重定向如果set和get都能成功说明集群读写链路是通的。3. 避坑与排查那些脚本不会告诉你的翻车点3.1 端口通了但集群建不起来现象六个实例都能redis-cli -p 700x ping返回 PONG但执行--cluster create时报Could not connect to Redis at 192.168.x.x:700x。原因配置文件里bind写的是127.0.0.1或者protected-mode开着且没设密码导致节点之间用配置里的地址互相连接时被拒绝。解决把bind改成实际内网 IP 或0.0.0.0同时确认protected-mode no或设置了requirepass。改完要删掉旧的nodes-*.conf再重启实例否则残留的节点信息会干扰。3.2 集群状态 ok 但写入报 CLUSTERDOWN现象cluster info显示cluster_state:ok但set一个 key 时返回CLUSTERDOWN The cluster is down。原因槽位分配不完整。可能是--cluster create时节点数不是 3 的倍数或者某个 master 挂了导致它负责的槽位无人接管。解决用redis-cli --cluster check 192.168.1.10:7000查看槽位覆盖情况。如果有缺口用redis-cli --cluster fix尝试修复或者干脆清掉所有nodes.conf重新 create。3.3 重启服务器后集群起不来现象服务器重启后手动逐个启动 Redis 实例但cluster nodes显示节点状态是fail或handshake。原因集群模式下节点启动顺序和nodes.conf的完整性都很重要。如果某个实例的nodes.conf丢了或损坏它会以新节点身份启动导致集群拓扑混乱。解决确保每个实例的cluster-config-file路径独立且持久化。重启时先启动所有实例等一两分钟让它们自动握手再用cluster info检查。如果还是不行检查nodes.conf是否被误删。3.4 密码设了但 cluster create 没带 -a现象配置文件里设了requirepass实例能正常启动但--cluster create报NOAUTH Authentication required。原因redis-cli --cluster create不会自动读取配置文件里的密码需要显式传-a参数。解决在 create 命令后加上-a yourpassword。如果密码里有特殊字符用单引号包起来。另外集群模式下所有节点密码必须一致否则节点间通信也会失败。3.5 脚本在 CentOS 7 上跑得好CentOS 8 上报错现象同样的脚本CentOS 7 正常CentOS 8 上执行时报redis-server: command not found或systemctl相关错误。原因CentOS 8 默认的 Redis 版本和安装路径可能不同或者脚本里用了service命令而系统只支持systemctl。解决先确认redis-server的实际路径which redis-server如果不在 PATH 里在脚本开头加一行export PATH$PATH:/usr/local/bin或直接写绝对路径。对于服务管理命令把service替换成systemctl或直接跳过因为集群实例通常不用系统服务管理。4. 进阶把一键脚本改造成可复用、可验证的部署工具脚本能跑通只是第一步真正省心的是把它改造成「换台机器也能用」的工具。我一般会做三件事参数外置、幂等处理、部署后自检。参数外置就是把 IP、端口范围、密码、节点数抽成脚本开头的变量或者单独放一个cluster.conf文件用source引入。这样换环境时只改一个文件不用动脚本逻辑。比如# cluster.conf 示例 NODE_IP192.168.1.10 BASE_PORT7000 NODE_COUNT6 REPLICAS1 PASSWORDyourpassword DATA_DIR/data/redis-cluster幂等处理是指脚本重复执行不会把环境搞乱。常见做法是在创建目录和启动实例前先检查是否已存在如果存在就跳过或先清理。比如启动实例前先redis-cli -p $port shutdown nosave尝试关掉旧实例再删掉旧的nodes.conf这样重复跑不会出现端口占用或节点信息冲突。部署后自检可以写一个简单的检查函数在脚本最后自动执行# 自检函数检查集群状态和槽位覆盖 check_cluster() { state$(redis-cli -p $BASE_PORT ${PASSWORD:-a $PASSWORD} cluster info | grep cluster_state | cut -d: -f2 | tr -d \r) if [ $state ! ok ]; then echo 集群状态异常: $state return 1 fi # 检查槽位是否全覆盖 slots$(redis-cli -p $BASE_PORT ${PASSWORD:-a $PASSWORD} cluster nodes | grep master | wc -l) echo Master 节点数: $slots return 0 }这个函数先取cluster_state如果不是ok就报错退出再统计 master 节点数和预期对比。虽然简单但能挡住大部分「脚本跑完了但集群是坏的」情况。还有一个实用技巧把redis-cli --cluster create的输出重定向到日志文件同时用tee在终端显示。这样部署失败时可以直接翻日志找报错不用凭记忆回想屏幕输出。我习惯在脚本里加exec (tee -a deploy.log) 21把整个执行过程都记录下来。从那以后我每次拿到一个新的部署脚本都会先在一个干净的测试机上跑一遍确认它能从零到一建出集群再改参数用到实际环境。这套流程帮我省掉了不少「以为没问题、结果上线才发现」的后悔药。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑