华为公有云构建高可用Redis集群(3主3从 + AS弹性扩容)详细方案
一、方案概述
本方案基于华为云服务(ECS、VPC、AS、IMS、ELB),手动搭建一个 Redis Cluster(3主3从) ,并通过 弹性伸缩AS 实现自动扩容(增加节点),但不配置自动缩容。扩容时新节点自动加入集群,并通过脚本完成集群拓扑更新。整体架构满足 高可用、负载均衡、水平扩展 的需求。
核心技术栈
| 服务 | 作用 |
|---|---|
| VPC + 安全组 | 隔离网络,保证内网互通 |
| ECS | 运行Redis服务的云服务器(6台基础节点) |
| IMS | 制作Redis私有镜像,便于AS快速部署 |
| ELB | 内网TCP负载均衡,分发流量到3个主节点 |
| AS | 基于告警策略自动扩容(增加ECS实例) |
| Redis Cluster | 数据分片、主从复制、自动故障转移 |
二、前期准备(网络与环境)
2.1 创建虚拟私有云(VPC)
进入华为云控制台 → 服务列表 → 虚拟私有云 VPC → 创建VPC:
- 区域:华东-上海一
- 名称 :
vpc-redis - 子网 :默认自动创建,子网名称
subnet-redis - 其他参数:默认
参考:材料中创建VPC步骤1
2.2 创建安全组
在网络控制台 → 访问控制 → 安全组 → 创建安全组:
- 名称 :
sg-redis - 入方向规则:放通所有内网(实际生产建议最小化)
- 出方向规则:默认放通
三、手动创建6台ECS并搭建Redis Cluster
3.1 购买6台ECS实例
在ECS控制台 → 购买弹性云服务器,参数如下(每台按需计费,共6台):
| 参数 | 值 |
|---|---|
| 计费模式 | 按需计费 |
| 区域 | 上海一 |
| 可用区 | 随机(建议分布在两个可用区) |
| CPU架构 | x86 |
| 规格 | 通用计算型 |
| 镜像 | 公共镜像 CentOS 7.6 64bit |
| 系统盘 | 高IO 40GB |
| 网络 | 选择已创建的VPC和子网 |
| 安全组 | 选择sg-redis |
| 弹性公网IP | 仅第1台绑定(用于远程配置),其余暂不绑定 |
| 名称 | 依次设置为 redis-master-1、redis-master-2、redis-master-3、redis-slave-1、redis-slave-2、redis-slave-3 |
| 登录方式 | 密码 |
参考:材料中购买ECS详细步骤1
3.2 在所有ECS上安装Redis
登录第1台有公网IP的ECS(如redis-master-1),执行以下命令安装Redis 6.2.14(或最新LTS版本):
bash
yum install -y tcl gcc gcc-c++ make
wget https://download.redis.io/releases/redis-6.2.14.tar.gz
tar zxvf redis-6.2.14.tar.gz -C /usr/local/
cd /usr/local/redis-6.2.14/
make && make install
然后编写Redis配置文件/usr/local/redis-6.2.14/redis.conf,关键修改如下:
conf
# 监听所有网卡
bind 0.0.0.0 -::1
# 开启集群模式
cluster-enabled yes
# 集群配置文件自动生成
cluster-config-file nodes.conf
# 节点超时时间
cluster-node-timeout 5000
# 开启AOF持久化
appendonly yes
# 后台运行
daemonize yes
将此配置和安装包分发到其余5台ECS(可通过scp或写脚本批量完成)。
3.3 启动所有Redis节点并组建集群
在每台ECS上执行:
bash
redis-server /usr/local/redis-6.2.14/redis.conf
然后在任意一台节点(如redis-master-1)执行创建集群命令(假设内网IP按顺序为192.168.x.1~6):
bash
redis-cli --cluster create \
192.168.x.1:6379 192.168.x.2:6379 192.168.x.3:6379 \
192.168.x.4:6379 192.168.x.5:6379 192.168.x.6:6379 \
--cluster-replicas 1
系统将自动分配3个主节点和3个从节点,并平均分配16384个哈希槽4。
3.4 验证集群状态
bash
redis-cli -h 192.168.x.1 -p 6379 cluster info
redis-cli -h 192.168.x.1 -p 6379 cluster nodes
输出应显示3个master和3个slave,所有槽被覆盖。
3.5 配置ELB负载均衡
创建内网ELB,将流量分发到3个主节点1。
- 创建ELB实例 :弹性负载均衡 → 购买,选择内网 、上海一、关联VPC。
- 添加监听器:TCP/6379,后端服务器组新建。
- 添加后端服务器 :将
redis-master-1、redis-master-2、redis-master-3加入,权重均分。 - 健康检查:TCP:6379,间隔5秒,超时3秒,最大重试3次。
客户端通过ELB的VIP(内网IP)连接Redis集群,ELB自动分发请求,当key所在槽位不在当前节点时,Redis Cluster返回MOVED重定向,智能客户端可自动处理4。
四、制作Redis私有镜像(IMS)
为了让弹性伸缩的新实例自动拥有Redis环境,需将其中一台配置好的ECS制作成私有镜像。
选一台已部署完成的ECS(如redis-master-1),执行以下清理操作:
bash
# 停止Redis服务
redis-cli -p 6379 shutdown
# 删除集群配置文件(否则新实例启动时使用旧信息)
rm -f /usr/local/redis-6.2.14/nodes.conf
# 清空数据文件(可选,避免旧数据残留)
rm -f /usr/local/redis-6.2.14/dump.rdb /usr/local/redis-6.2.14/appendonly.aof
# 确保网卡为DHCP(华为云默认)
然后关机该ECS,进入镜像服务IMS → 创建私有镜像:
- 镜像类型:系统盘镜像
- 选择镜像源:云服务器 → 选择已关机ECS
- 名称 :
image-redis-cluster
等待镜像状态变为"正常"13。
五、配置弹性伸缩(AS)实现自动扩容
5.1 创建伸缩配置
进入弹性伸缩AS → 伸缩配置 → 创建:
- 配置名称 :
as-config-redis - 镜像 :选择刚创建的私有镜像
image-redis-cluster - 规格:与基础ECS一致(2vCPUs | 4GB)
- 系统盘:40GB高IO
- 安全组 :
sg-redis - 弹性公网IP:不分配
- 高级配置:勾选"用户数据",输入后续给出的脚本(用于新实例自动加入集群)
5.2 用户数据脚本(User Data)
该脚本在新ECS实例启动时自动执行,实现以下功能:
- 获取本机内网IP
- 修改redis.conf中bind或cluster-announce-ip(可选,建议指定)
- 清空旧的nodes.conf(镜像中可能残留)
- 启动Redis服务
- 通过
CLUSTER MEET加入现有集群(需指定一个现有集群节点的IP) - 将本节点设置为某个主节点的从节点(或者作为新主节点启动,此处设计为从节点扩容,提升读能力,减少复杂性)
脚本示例 (保存为/opt/userdata.sh,并在伸缩配置中粘贴内容):
bash
#!/bin/bash
# 获取本机内网IP
LOCAL_IP=$(hostname -I | awk '{print $1}')
# 定义现有集群中任意一个节点的IP(建议使用ELB的VIP或一个固定主节点IP)
CLUSTER_ANY_NODE="192.168.x.1" # 替换为实际的集群节点IP
REDIS_HOME="/usr/local/redis-6.2.14"
# 清理旧的集群配置文件
rm -f ${REDIS_HOME}/nodes.conf
# 修改redis.conf,绑定本机IP(可选,更明确)
sed -i "s/^bind 0.0.0.0 -::1/bind ${LOCAL_IP} -::1/" ${REDIS_HOME}/redis.conf
# 启动Redis
${REDIS_HOME}/src/redis-server ${REDIS_HOME}/redis.conf
# 等待Redis启动
sleep 2
# 加入现有集群:使用CLUSTER MEET与任一节点握手
redis-cli -h ${LOCAL_IP} -p 6379 CLUSTER MEET ${CLUSTER_ANY_NODE} 6379
# 可选:将此节点设置为从节点(如果希望它作为某个主节点的从节点,减少主节点数变化)
# 注意:需要知道一个主节点的Node ID,可以通过其他节点获取。
# 下面示例将本节点作为第一个主节点(redis-master-1)的从节点
MASTER_NODE_ID=$(redis-cli -h ${CLUSTER_ANY_NODE} -p 6379 cluster nodes | grep master | head -1 | awk '{print $1}')
redis-cli -h ${LOCAL_IP} -p 6379 CLUSTER REPLICATE ${MASTER_NODE_ID}
# 输出日志
echo "New Redis node ${LOCAL_IP} joined cluster successfully." >> /var/log/redis-auto-join.log
说明:
- 该脚本将新节点加入集群并设为某个主节点的从节点,不会改变哈希槽分配,因此不会导致数据迁移,但提高了集群的读能力和容错。
- 如需扩容主节点(提升写能力),则需要进一步执行
CLUSTER FORGET、CLUSTER MEET及redis-cli --cluster reshard,涉及槽位迁移,建议在脚本后手动触发,或者使用更复杂的编排工具。
5.3 创建伸缩组
进入AS → 伸缩组 → 创建:
- 伸缩组名称 :
as-group-redis - 最大实例数 :
12(可根据实际需求调整) - 期望实例数 :
6(对应已有6台基础实例) - 最小实例数 :
6(保证基础集群不缩) - VPC/子网:与基础实例相同
- 负载均衡:选择已创建的ELB后端服务器组
- 健康检查方式:ELB健康检查 + 云服务器健康检查
- 伸缩策略 :添加一条告警策略(自动扩容)
5.4 配置扩容告警策略
在伸缩组详情 → 伸缩策略 → 创建:
- 策略类型:告警策略
- 触发条件 :
- 监控维度:CPU使用率
- 条件:平均值 > 80%(持续2个周期,周期5分钟)
- 执行动作:增加1台ECS(注意:为了保持主从结构建议步长为2,但这里作为演示,每次新增一个从节点;生产环境可根据需求调整)
- 冷却时间:300秒
由于不配置缩容策略,AS将不会自动减少实例,缩容需手动操作。
5.5 关联已有基础ECS实例到伸缩组(可选)
将手动创建的6台ECS加入伸缩组管理,以便AS监控其健康状态。在伸缩组页面点击"添加实例",输入6台ECS的ID。注意:这些实例不会因AS策略被删除(因为最小实例数设为6)。
六、扩容效果验证
当业务压力增大,集群整体CPU超过80%时,AS将触发扩容:
- AS根据伸缩配置自动创建一台新的ECS(使用私有镜像)。
- 新ECS启动时执行用户数据脚本,自动加入Redis集群成为从节点。
- ELB健康检查通过后,新节点自动注册到ELB后端(注意:ELB只分发到主节点,但从节点加入后自动在Redis集群内向主节点同步数据,提升整体读能力)。
- 如果希望新节点成为主节点并提供写服务,需要手动执行reshard,可通过编写自动化脚本调用
redis-cli --cluster rebalance或redis-cli --cluster reshard完成。
手动缩容(非AS自动)
缩容时不通过AS策略,操作步骤如下:
-
从要下线的节点迁移所有槽位(如果是主节点):
bashredis-cli --cluster rebalance --cluster-use-empty-masters <要下线IP>:6379 -
通过
CLUSTER FORGET从集群中移除节点。 -
终止该ECS实例,并手动从AS伸缩组中移除。
七、脚本触发时机与作用汇总
| 脚本名称 / 用途 | 触发时机 | 作用 |
|---|---|---|
| 用户数据脚本 (userdata) | AS弹出新ECS实例首次启动时 | 自动清理旧数据、获取本机IP、启动Redis、加入集群、设置主从关系 |
| redis安装脚本(手动执行) | 构建基础ECS时 | 安装Redis二进制和依赖 |
| 集群创建命令(手动执行) | 搭建基础集群时 | 初始化3主3从集群,分配哈希槽 |
| 手动扩缩容脚本(可选) | 需要调整主节点时 | 迁移槽位、重新平衡集群 |
八、注意事项与局限
- 用户数据脚本的权限 :需确保脚本有执行权限,可在伸缩配置中指定脚本解释器为
/bin/bash。 - 节点ID冲突 :每次从镜像启动的新实例会生成新的节点ID,自动加入集群时
CLUSTER MEET即可,不影响旧ID。 - 扩容后数据均衡 :本方案扩容的新节点默认作为从节点,不会自动带来写能力的提升。如需横向扩展写能力,需在扩容后手动执行
redis-cli --cluster rebalance迁移部分槽位到新的主节点上(可编写脚本在用户数据中调用,但需要确保新节点角色为主)。 - ELB只分发到主节点:如果新节点作为从节点,不会被ELB直接分发客户端请求,但其复制的主节点流量会增加。可考虑增加第二个ELB监听器专门用于从节点读分流(需要客户端支持读写分离)。
- 缩容必须手动:因为未配置缩容策略,避免误缩导致数据丢失。
- 生产建议:使用专业Redis集群管理工具(如RedisInsight、Redis Enterprise)或云原生Redis服务(华为云DCS),以简化运维。
九、第二天操作清单
- ✅ 登录华为云控制台
- ✅ 创建VPC和子网
- ✅ 创建安全组(内网全通)
- ✅ 购买6台ECS(按需,绑1台公网IP)
- ✅ 登录有公网IP的ECS,安装Redis,并分发配置到其他5台
- ✅ 启动所有Redis,执行
--cluster create组建集群 - ✅ 验证集群状态
- ✅ 创建ELB内网负载均衡(TCP:6379),添加3个主节点作为后端
- ✅ 制作私有镜像(清理nodes.conf及数据文件后关机制作)
- ✅ 创建AS伸缩配置(使用私有镜像 + 用户数据脚本)
- ✅ 创建AS伸缩组(关联ELB后端组,配置扩容告警策略,不配置缩容策略)
- ✅ 将6台基础ECS手动加入伸缩组
- ✅ 测试:模拟高负载,观察AS是否自动创建新ECS并加入集群
此方案基于华为云现有服务,结合了材料中的网络、ECS、AS、IMS、ELB配置步骤以及Redis Cluster原理,确保实操可行。如有疑问,随时调整参数。
1 F:\Cherry_Studio\workspace\Data\Files\48099cdb-18af-4e89-90c9-f276aff4e85f.pdf
2 F:\Cherry_Studio\workspace\Data\Files\48099cdb-18af-4e89-90c9-f276aff4e85f.pdf
3 F:\Cherry_Studio\workspace\Data\Files\f20d8a5e-ab3e-4d68-8b95-9e20df6d19b2.pdf
4 F:\Cherry_Studio\workspace\Data\Files\72591e9a-f4e7-427a-a69f-455431c59de5.pdf
5 F:\Cherry_Studio\workspace\Data\Files\9fbd25c0-a404-4a4c-9a03-73fd30fc0e5f.pdf
6 F:\Cherry_Studio\workspace\Data\Files\72591e9a-f4e7-427a-a69f-455431c59de5.pdf