恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Redis集群一键自动部署脚本:CentOS三主三从搭建与避坑指南
首页
资讯中心
/
Redis集群一键自动部署脚本:CentOS三主三从搭建与避坑指南
Redis集群一键自动部署脚本:CentOS三主三从搭建与避坑指南
发布时间:2026/10/16 7:47:43
简介这份资源面向需要在 CentOS 7.X 上快速搭建 Redis 集群的运维与后端开发人员提供一套基于 shell 脚本的一键自动部署方案解决手动编译安装、逐台配置节点与分配槽位繁琐易错的问题。压缩包共 5 个文件以 3 个 sh 脚本为主辅以 1 个 gz 源码包和 1 个 txt 说明文档整体约 1.86MB脚本分别承担主流程调度、节点安装与集群卸载清理源码包用于编译安装说明文档则交代部署步骤与注意事项。内容覆盖主从复制、16384 槽分配、分布式哈希与故障转移等集群机制并涉及 yum 依赖安装、防火墙端口放行及 SELinux 策略调整等 CentOS 环境配置。使用者只需按说明修改脚本中的 IP 与端口依次执行即可完成从源码编译到集群组建的全过程适合希望快速验证集群方案或搭建测试环境的中高级读者参考。目前已有 775 人学习下载。1. 从一台裸机到三主三从Redis 集群部署脚本到底省掉了哪些事如果你在 CentOS 上手工搭过一次 Redis Cluster大概率经历过这样的流程改六份 redis.conf、算 16384 个槽怎么分、cluster meet 挨个握手、replicate 指定主从、最后还得验证槽有没有全分配。整个过程顺利的话四十分钟不顺利的话卡在Waiting for the cluster to join能卡到你怀疑人生。这份「redis集群一键自动部署脚本.rar」解决的就是这个场景——把上述步骤收敛成一条命令在 CentOS 环境下自动完成多节点配置生成、服务拉起、集群握手和槽位分配。它适合两类人一是需要频繁重建测试集群的开发和运维二是刚接触 Redis Cluster、想先跑通再回头理解细节的新手。脚本本身不神秘但它把容易出错的参数和顺序固化下来了这才是价值所在。2. 脚本拆开看目录结构、配置模板与执行链路2.1 解压后先别急着跑把文件清单过一遍拿到压缩包后我习惯先unzip -l看一眼结构而不是直接解压执行。常见的一键部署脚本包内部大致是这么组织的# 查看压缩包内容不解压 unzip -l redis集群一键自动部署脚本.rar # 典型输出结构不同版本可能略有差异 # redis-cluster/ # install.sh # 主入口脚本 # redis.conf.tpl # 配置模板含占位变量 # cluster.sh # 集群创建与槽分配 # nodes.conf # 节点清单定义 IP 和端口 # README.md # 使用说明这里有个血泪经验.rar格式在 CentOS 上默认不一定能解很多精简版系统只带了 tar 和 gzip。如果unrar命令不存在先装解压工具再操作否则你会以为包坏了。# CentOS 7/8 安装 rar 解压支持 yum install -y unrar # 或者用 bsdtar 兼容解压 bsdtar -xvf redis集群一键自动部署脚本.rar解压后重点看三个文件nodes.conf决定集群拓扑redis.conf.tpl决定每个节点的运行参数install.sh决定执行顺序。先读再跑能避开八成的翻车。2.2 配置模板里的占位变量决定了集群能不能起来一键脚本的核心思路是「模板 变量替换」。redis.conf.tpl里通常长这样# redis.conf.tpl 关键片段 port ${PORT} bind ${BIND_ADDR} cluster-enabled yes cluster-config-file nodes-${PORT}.conf cluster-node-timeout 15000 appendonly yes daemonize yes pidfile /var/run/redis-${PORT}.pid logfile /var/log/redis/redis-${PORT}.log protected-mode no脚本执行时会用sed或envsubst把${PORT}、${BIND_ADDR}替换成实际值为每个节点生成独立配置文件。这里有几个参数值得说清楚参数作用常见取值踩坑点cluster-enabled开启集群模式yes写成 no 则单机模式cluster meet 直接失败cluster-node-timeout节点超时判定15000设太小会频繁主从切换设太大故障感知慢protected-mode保护模式no集群内网通信必须关否则跨机握手被拒appendonlyAOF 持久化yes测试环境可关生产建议开bind监听地址0.0.0.0 或内网 IP绑 127.0.0.1 会导致其他节点连不上cluster-node-timeout这个值我一般设 15000 毫秒。设成 5000 的话网络稍微抖一下主节点就被判死触发不必要的故障转移设成 60000 又太迟钝真挂了半分钟才反应。15000 是多数场景的平衡点。2.3 执行链路从拉起进程到槽位分配install.sh的主流程一般分四步理解了这个顺序出问题就知道卡在哪一环# 第一步批量生成配置文件 for port in 7000 7001 7002 7003 7004 7005; do envsubst redis.conf.tpl /etc/redis/${port}.conf done # 第二步逐个启动 redis-server 实例 for port in 7000 7001 7002 7003 7004 7005; do redis-server /etc/redis/${port}.conf sleep 0.5 # 给进程一点启动时间避免端口抢占 done # 第三步用 redis-cli --cluster create 组建集群 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 --cluster-yes # 第四步验证集群状态 redis-cli -p 7000 cluster info redis-cli -p 7000 cluster nodes第三步的--cluster-replicas 1是关键参数意思是每个主节点配一个从节点六个节点自动分成三主三从。--cluster-yes跳过交互确认适合脚本自动化。如果省略--cluster-replicas六个节点会全变成主节点槽位平分没有冗余。cluster info里重点看cluster_state:ok和cluster_slots_assigned:16384。前者是 ok 说明集群健康后者是 16384 说明槽全分配了。少一个都算没搭好。3. 在 CentOS 上跑通从环境准备到验证的完整操作3.1 前置环境这些不准备好脚本跑一半必挂一键脚本再智能也替代不了基础环境。CentOS 上跑 Redis Cluster下面几项必须先确认# 1. 检查系统版本和内核 cat /etc/centos-release uname -r # 2. 关闭防火墙或放行端口测试环境直接关生产用 firewall-cmd 放行 systemctl stop firewalld systemctl disable firewalld # 3. 关闭 SELinux否则可能拦截端口绑定 setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 4. 调整系统参数Redis 需要更大的连接队列和内存映射 echo net.core.somaxconn 1024 /etc/sysctl.conf echo vm.overcommit_memory 1 /etc/sysctl.conf sysctl -p # 5. 关闭透明大页避免 Redis 延迟抖动 echo never /sys/kernel/mm/transparent_hugepage/enabledvm.overcommit_memory 1这行经常被忽略。Redis 做 fork 持久化时需要申请大块内存如果这个值是 0内核可能拒绝分配日志里会出现Cant save in background: fork: Cannot allocate memory。测试环境内存小的时候尤其容易撞上。transparent_hugepage关闭也是同理开着的话 Redis 的延迟会出现周期性尖刺监控上看就是规律的毛刺排查起来很玄学。3.2 安装 Redis 与执行脚本环境就绪后装 Redis 并执行部署脚本# 安装编译依赖 yum install -y gcc make jemalloc-devel # 下载并编译 Redis版本以脚本 README 说明为准 cd /usr/local/src tar -zxvf redis-6.2.7.tar.gz cd redis-6.2.7 make MALLOClibjemalloc make install PREFIX/usr/local/redis # 把可执行文件加入 PATH echo export PATH$PATH:/usr/local/redis/bin /etc/profile source /etc/profile # 进入脚本目录赋予执行权限 cd /root/redis-cluster chmod x install.sh cluster.sh # 执行一键部署 ./install.shmake MALLOClibjemalloc指定内存分配器jemalloc 在碎片控制上比默认的 libc malloc 好长时间运行更稳。如果编译时报 jemalloc 相关错误说明jemalloc-devel没装上回头补装即可。脚本执行过程中终端会滚动输出每个节点的启动日志和集群创建进度。看到All 16384 slots covered就说明槽分配完成。3.3 验证集群别只看脚本说成功脚本跑完不代表集群真能用。我一般按下面三步验证# 验证一集群整体状态 redis-cli -p 7000 cluster info | grep -E cluster_state|cluster_slots_assigned|cluster_known_nodes # 验证二节点角色分布确认三主三从 redis-cli -p 7000 cluster nodes | awk {print $2, $3} | sort # 验证三实际读写跨槽写入测试 redis-cli -c -p 7000 set foo bar redis-cli -c -p 7000 set hello world redis-cli -c -p 7000 get foo注意第三条命令的-c参数它让 redis-cli 在收到 MOVED 重定向时自动跳转到正确节点。不加-c的话写入不在当前节点槽位的 key 会直接报 MOVED 错误新手容易误以为集群坏了。cluster nodes输出里主节点后面跟的是哈希槽范围从节点会标注slave和它跟随的主节点 ID。如果看到某个主节点没有对应的从节点说明--cluster-replicas参数没生效或节点数不够。4. 避坑排查一键脚本最容易翻车的五个地方4.1 卡在 Waiting for the cluster to join现象执行cluster create后终端一直停在Waiting for the cluster to join几分钟不结束。原因节点之间握手失败通常是端口没放行或 bind 地址不对。Redis Cluster 除了服务端口7000-7005还需要集群总线端口规则是服务端口 10000即 17000-17005。只放行了 7000 段总线端口被挡握手就卡住。解决确认防火墙放行了服务端口和总线端口或者测试环境直接关防火墙。同时检查bind是否绑到了 127.0.0.1跨机通信必须绑内网 IP 或 0.0.0.0。4.2 槽位没分配完cluster_state 是 fail现象cluster info显示cluster_state:failcluster_slots_assigned小于 16384。原因cluster create中途失败部分槽没分配但节点进程已经起来了。重新执行 create 会因为节点已有数据而报错。解决先清干净再重来。停掉所有 Redis 进程删除每个节点的nodes-*.conf和持久化文件再重新执行脚本。# 清理残留 pkill -f redis-server rm -f /etc/redis/nodes-*.conf rm -rf /var/lib/redis/dump-*.rdb /var/lib/redis/appendonly-*.aof4.3 主从关系错乱从节点跟错了主现象cluster nodes里从节点跟随的主节点不是预期的那个或者某个主节点挂了两个从节点另一个没有。原因cluster create分配主从是自动的节点顺序和 IP 列表顺序不完全对应。如果对拓扑有严格要求自动分配可能不满足。解决创建后用cluster replicate手动调整或者用redis-cli --cluster reshard重新平衡。脚本如果支持自定义拓扑在nodes.conf里明确指定主从对应关系。4.4 内存告警节点被 OOM Killer 干掉现象集群跑一段时间后某个节点消失日志里没有明显错误系统日志显示Out of memory: Kill process。原因Redis 默认没有内存上限或者maxmemory设得太大加上 AOF 重写时的 fork 内存翻倍触发系统 OOM。解决在配置模板里设maxmemory为物理内存的 60% 左右并设置maxmemory-policy。同时确保vm.overcommit_memory 1。# redis.conf.tpl 补充 maxmemory 2gb maxmemory-policy allkeys-lru4.5 脚本在 CentOS 8 上报 command not found现象脚本执行到某一步报service: command not found或chkconfig: command not found。原因CentOS 8 用systemctl替代了service和chkconfig老脚本如果还在用旧命令就会失败。解决手动把脚本里的service redis start替换为systemctl start redis或者直接用redis-server启动。也可以装initscripts包兼容旧命令但不推荐。5. 进阶技巧把一键脚本改造成可复用、可验证的部署工具跑通一次不算本事能反复用、换台机器还能用才算把这脚本吃透了。我一般会做三件事。第一件把节点清单抽成独立配置文件而不是硬编码在脚本里。这样换 IP 段或改端口数量时只动一个文件# nodes.conf 自定义格式 # 格式IP:PORT:ROLE 192.168.1.10:7000:master 192.168.1.10:7001:master 192.168.1.10:7002:master 192.168.1.10:7003:slave 192.168.1.10:7004:slave 192.168.1.10:7005:slave然后在install.sh里读取这个文件生成 create 命令。这样拓扑可控不会出现从节点跟错主的情况。第二件加一个部署后自检函数把验证步骤自动化#!/bin/bash # verify_cluster.sh 部署后自检 check_cluster() { local state$(redis-cli -p 7000 cluster info | grep cluster_state | cut -d: -f2 | tr -d \r) local slots$(redis-cli -p 7000 cluster info | grep cluster_slots_assigned | cut -d: -f2 | tr -d \r) if [ $state ok ] [ $slots 16384 ]; then echo 集群健康状态 $state槽位 $slots return 0 else echo 集群异常状态 $state槽位 $slots return 1 fi } check_cluster || exit 1这个函数返回 0 才算部署成功可以接在install.sh末尾也可以单独跑。参数说明cluster_state期望值是 okcluster_slots_assigned期望值是 16384两个条件同时满足才通过。第三件记录每次部署的节点 ID 和槽位分布存成快照。集群出问题需要重建时有快照就能对比出哪个节点变了、槽位怎么偏移的。我一般把cluster nodes的输出存到/var/log/redis/cluster-snapshot-$(date %Y%m%d).log出故障时翻历史记录比现场猜快得多。从那以后我每次拿到这类一键脚本都强制先读一遍install.sh的执行顺序再在测试机上跑一遍验证最后才敢往需要长期运行的环境上放。脚本省的是重复劳动不是省掉理解。希望帮到你。本文还有配套的精品资源点击获取