# linux下redis集群搭建 **Repository Path**: bingbingyihao/redis-cluster-deployment ## Basic Information - **Project Name**: linux下redis集群搭建 - **Description**: 书写一个linux下redis集群搭建的教程及脚本,方便使用 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-04 - **Last Updated**: 2026-05-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux 下 Redis 集群搭建 ## 项目介绍 本项目提供了一套完整的 Redis Cluster(3主3从)集群搭建方案,包含自动化部署脚本、管理工具及 Java 测试代码。通过简单的配置和脚本执行,即可在多台 Linux 服务器上快速搭建高可用的 Redis 集群。 ## 架构说明 本项目采用 **Redis Cluster** 模式,部署 6 个节点(3主3从): ``` ┌─────────────────────────────────────────────────────┐ │ Redis Cluster │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Master 1 │ │ Master 2 │ │ │ │ 172.17.199.34│ │ 172.17.199.35│ │ │ │ Port:7001 │ │ Port:7002 │ │ │ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Slave 1 │ │ Slave 2 │ │ │ │ 172.17.199.37│ │ 172.17.199.38│ │ │ │ Port:7004 │ │ Port:7005 │ │ │ └─────────────┘ └─────────────┘ │ │ │ │ ┌─────────────┐ │ │ │ Master 3 │ │ │ │ 172.17.199.36│ │ │ │ Port:7003 │ │ │ └──────┬──────┘ │ │ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ Slave 3 │ │ │ │ 172.17.199.39│ │ │ │ Port:7006 │ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────┘ ``` ### 关键特性 - **数据分片**:16384 个哈希槽自动分配到 3 个主节点 - **高可用**:每个主节点配置 1 个从节点,支持自动故障转移 - **密码认证**:集群开启 requirepass 和 masterauth - **持久化**:同时启用 RDB 和 AOF 持久化 - **内存管理**:配置最大内存和 allkeys-lru 淘汰策略 - **systemd 管理**:使用 systemd 进行服务管理和开机自启 ## 环境要求 ### 硬件要求 | 资源 | 最低配置 | 推荐配置 | |------|----------|----------| | CPU | 1核 | 2核及以上 | | 内存 | 1GB | 2GB及以上 | | 磁盘 | 5GB | 10GB及以上 | | 网络 | 内网互通 | 低延迟内网 | ### 软件要求 - **操作系统**:CentOS 7/8、RHEL 7/8 或其他 Linux 发行版 - **Redis 版本**:7.2.4(可通过配置调整为其他版本) - **依赖工具**: - `yum` 包管理器(或其他包管理器) - `sshpass`(用于密码认证远程部署,可选) - `dos2unix`(用于转换脚本文件格式) - `gcc`、`make`(源码安装时需要) ## 项目结构 ``` redis-cluster-deployment/ ├── README.md # 项目文档 ├── bash/ # 脚本目录 │ ├── init.sh # 初始化脚本(安装依赖、转换文件格式) │ ├── cluster.conf # 集群配置文件(修改此文件即可) │ ├── redis-cluster.conf.template # Redis 配置模板 │ ├── deploy-redis-cluster.sh # 单节点部署脚本 │ ├── apply-config.sh # 配置分发脚本(主控节点执行) │ ├── create-cluster.sh # 集群创建脚本 │ ├── verify-cluster.sh # 集群验证脚本 │ └── manage-cluster.sh # 集群管理脚本 └── redis-cluster-test/ # Java 测试代码 ├── pom.xml # Maven 依赖配置 └── src/main/java/com/boot/ └── RedisClusterExample.java # Java 集群测试示例 ``` ## 快速开始 ### 第一步:环境准备 在**所有节点**上执行初始化脚本: ```bash cd bash/ chmod +x *.sh ./init.sh ``` ### 第二步:修改配置 编辑 `cluster.conf` 配置文件: ```bash vim cluster.conf ``` 需要修改的关键配置: ```bash # Redis密码(必填) REDIS_PASSWORD=your_password # 6个节点的IP和端口(使用内网IP) NODE1_IP=172.17.199.34 NODE1_PORT=7001 NODE2_IP=172.17.199.35 NODE2_PORT=7002 # ... 其他节点配置 # SSH配置(用于远程部署) SSH_USER=root SSH_PASSWORD=your_ssh_password # 或使用SSH_KEY_PATH配置密钥 ``` ### 第三步:部署节点 **方式一:远程自动部署(推荐)** 在一台主控机器上执行: ```bash ./apply-config.sh ``` 该脚本会自动: 1. 检查所有节点 SSH 连接 2. 推送配置文件和部署脚本 3. 在远程节点执行 Redis 安装和部署 **方式二:手动逐台部署** 在每台机器上分别执行: ```bash ./deploy-redis-cluster.sh ``` ### 第四步:创建集群 所有节点部署完成后,在任意节点执行: ```bash ./create-cluster.sh ``` 该脚本会自动: 1. 检查所有节点连通性 2. 创建 Redis Cluster 并分配槽位 3. 配置主从关系 4. 验证集群状态 ### 第五步:验证集群 ```bash ./verify-cluster.sh ``` 验证脚本会检查: - 集群状态和槽位分配 - 节点主从关系 - 数据读写测试 - 内存使用和连接数统计 ## 配置文件说明 ### cluster.conf 这是核心配置文件,所有脚本都读取此配置: | 配置项 | 说明 | 示例值 | |--------|------|--------| | REDIS_PASSWORD | Redis 访问密码 | mypassword123 | | INSTALL_METHOD | 安装方式:yum 或 source | yum | | REDIS_VERSION | Redis 版本(源码安装时) | 7.2.4 | | NODE1_IP ~ NODE6_IP | 节点 IP 地址 | 172.17.199.34 | | NODE1_PORT ~ NODE6_PORT | 节点端口 | 7001 ~ 7006 | | REDIS_DATA_DIR | 数据目录 | /data/redis | | REDIS_CONF_DIR | 配置目录 | /etc/redis | | REDIS_LOG_DIR | 日志目录 | /var/log/redis | | REDIS_MAX_MEMORY | 最大内存 | 512mb | | REDIS_MAX_MEMORY_POLICY | 内存淘汰策略 | allkeys-lru | | SSH_USER | SSH 用户名 | root | | SSH_PASSWORD | SSH 密码 | your_password | | SSH_PORT | SSH 端口 | 22 | | SSH_KEY_PATH | SSH 密钥路径(可选) | /root/.ssh/id_rsa | ## 脚本使用说明 ### 1. deploy-redis-cluster.sh 单节点部署脚本,自动完成: - 安装 Redis(yum 或源码) - 创建目录结构 - 生成配置文件 - 配置 systemd 服务 - 启动 Redis 服务 - 验证节点状态 ```bash ./deploy-redis-cluster.sh ``` ### 2. apply-config.sh 配置分发脚本,从主控节点推送配置到所有节点: ```bash ./apply-config.sh ``` ### 3. create-cluster.sh 创建 Redis Cluster 集群: ```bash ./create-cluster.sh ``` ### 4. verify-cluster.sh 验证集群状态和功能: ```bash ./verify-cluster.sh ``` ### 5. manage-cluster.sh 集群管理工具,支持多种运维操作: ```bash # 启动集群 ./manage-cluster.sh start # 停止集群 ./manage-cluster.sh stop # 重启集群 ./manage-cluster.sh restart # 查看状态 ./manage-cluster.sh status # 查看日志(默认最新20行) ./manage-cluster.sh log # 查看指定节点日志 ./manage-cluster.sh log 1 # 节点1 ./manage-cluster.sh log 1 100 # 节点1最新100行 # 备份数据 ./manage-cluster.sh backup # 清理数据 ./manage-cluster.sh clean # 重置集群 ./manage-cluster.sh reset ``` ## 阿里云云服务器特殊说明 ### 网络配置注意事项 在阿里云 ECS 上部署 Redis 集群时,**必须使用内网地址**,不能使用公网地址。原因如下: 1. **内网互通**:阿里云同一 VPC 内的 ECS 实例通过内网交换机互通,内网地址延迟更低、带宽更高 2. **公网限制**:Redis Cluster 节点之间需要相互通信(包括集群总线端口),公网环境下节点间通信会失败 3. **安全组配置**:需要在安全组中配置内网入方向规则,允许集群节点之间的端口访问 ### 安全组配置 需要在阿里云控制台配置安全组规则: **入方向规则**: | 授权策略 | 协议类型 | 端口范围 | 授权类型 | 授权对象 | 优先级 | |----------|----------|----------|----------|----------|--------| | 允许 | TCP | 7001/7006 | 地址段访问 | 内网网段(如 172.17.0.0/16) | 1 | | 允许 | TCP | 17001/17006 | 地址段访问 | 内网网段(如 172.17.0.0/16) | 1 | **注意**: - Redis 端口:7001-7006(与配置的节点端口对应) - 集群总线端口:Redis Cluster 会在每个节点端口基础上 +10000,即 17001-17006 - 授权对象填写 VPC 内网网段,例如 `172.17.0.0/16` 或具体的节点 IP ### 配置示例 在 `cluster.conf` 中配置内网 IP: ```bash # 使用内网IP,不要使用公网IP NODE1_IP=172.17.199.34 # 内网IP NODE2_IP=172.17.199.35 NODE3_IP=172.17.199.36 NODE4_IP=172.17.199.37 NODE5_IP=172.17.199.38 NODE6_IP=172.17.199.39 ``` ### Java 客户端连接 从外部连接 Redis 集群时,同样需要使用内网地址。如果你的应用部署在同一 VPC 内的其他 ECS 上,直接使用内网 IP 连接: ```java Set nodes = new HashSet<>(); nodes.add(new HostAndPort("172.17.199.34", 7001)); nodes.add(new HostAndPort("172.17.199.35", 7002)); nodes.add(new HostAndPort("172.17.199.36", 7003)); JedisCluster jedisCluster = new JedisCluster(nodes, 5000, 5000, 5, "your_password", new JedisPoolConfig()); ``` 如果你的应用在 VPC 外部,需要通过 VPN 或专线连接到 VPC 内网。 ## 集群管理 ### 查看集群状态 ```bash # 使用管理脚本 ./manage-cluster.sh status # 或使用 redis-cli redis-cli -h 172.17.199.34 -p 7001 -a your_password CLUSTER INFO redis-cli -h 172.17.199.34 -p 7001 -a your_password CLUSTER NODES ``` ### 连接集群 ```bash redis-cli -c -h 172.17.199.34 -p 7001 -a your_password ``` ### 数据备份 ```bash ./manage-cluster.sh backup ``` 备份数据存储在 `/backup/redis-cluster/日期_时间/` 目录下。 ### 故障处理 如果某个节点故障,Redis Cluster 会自动进行故障转移: 1. 从节点检测主节点故障(cluster-node-timeout 时间内无响应) 2. 从节点发起选举,成为新的主节点 3. 集群继续正常工作 手动处理故障节点: ```bash # 查看节点状态 ./manage-cluster.sh status # 重启故障节点 ./manage-cluster.sh restart # 查看故障节点日志 ./manage-cluster.sh log <节点索引> 100 ``` ## Java 测试代码 项目包含 Java 测试代码,位于 `redis-cluster-test/` 目录: ```bash cd redis-cluster-test/ mvn clean compile mvn exec:java -Dexec.mainClass="com.boot.RedisClusterExample" ``` 测试代码演示了: - 连接 Redis Cluster - 数据写入和读取 - 集群节点信息获取 - 异常处理 ## 常见问题 ### Q1: 节点无法连接怎么办? 检查以下事项: 1. 确认节点 IP 使用内网地址 2. 检查安全组规则是否开放了 Redis 端口和集群总线端口 3. 检查防火墙配置:`systemctl status firewalld` 4. 测试网络连通性:`ping <节点IP>` 和 `telnet <节点IP> <端口>` ### Q2: 集群创建失败怎么办? 检查以下事项: 1. 所有节点 Redis 服务是否正常运行:`systemctl status redis-<端口>` 2. 节点间网络是否互通 3. 密码配置是否一致 4. 查看日志:`./manage-cluster.sh log` ### Q3: 如何修改集群配置? 1. 修改 `cluster.conf` 配置文件 2. 重新运行 `./apply-config.sh` 分发配置 3. 重启集群:`./manage-cluster.sh restart` ### Q4: 如何完全清理集群? ```bash ./manage-cluster.sh reset ``` 该操作会停止所有节点、删除数据和配置文件,之后可以重新部署。 ### Q5: 如何扩展集群节点? 当前脚本支持固定 6 节点(3主3从)部署。如需扩展,可参考以下思路: 1. 修改 `cluster.conf` 增加节点配置 2. 修改各脚本中的节点数组 3. 使用 `redis-cli --cluster add-node` 添加新节点 4. 使用 `redis-cli --cluster reshard` 重新分配槽位 ## 许可证 本项目采用 Apache 许可证。