【云计算】华为公有云构建高可用Redis集群

作者:Harvy_没救了日期:2026/6/13

华为公有云构建高可用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版本):

1yum install -y tcl gcc gcc-c++ make
2wget https://download.redis.io/releases/redis-6.2.14.tar.gz
3tar zxvf redis-6.2.14.tar.gz -C /usr/local/
4cd /usr/local/redis-6.2.14/
5make && make install
6

然后编写Redis配置文件/usr/local/redis-6.2.14/redis.conf,关键修改如下:

1# 监听所有网卡
2bind 0.0.0.0 -::1
3# 开启集群模式
4cluster-enabled yes
5# 集群配置文件自动生成
6cluster-config-file nodes.conf
7# 节点超时时间
8cluster-node-timeout 5000
9# 开启AOF持久化
10appendonly yes
11# 后台运行
12daemonize yes
13

将此配置和安装包分发到其余5台ECS(可通过scp或写脚本批量完成)。

3.3 启动所有Redis节点并组建集群

在每台ECS上执行:

1redis-server /usr/local/redis-6.2.14/redis.conf
2

然后在任意一台节点(如redis-master-1)执行创建集群命令(假设内网IP按顺序为192.168.x.1~6):

1redis-cli --cluster create \
2  192.168.x.1:6379 192.168.x.2:6379 192.168.x.3:6379 \
3  192.168.x.4:6379 192.168.x.5:6379 192.168.x.6:6379 \
4  --cluster-replicas 1
5

系统将自动分配3个主节点和3个从节点,并平均分配16384个哈希槽[4]。

3.4 验证集群状态

1redis-cli -h 192.168.x.1 -p 6379 cluster info
2redis-cli -h 192.168.x.1 -p 6379 cluster nodes
3

输出应显示3个master和3个slave,所有槽被覆盖。

3.5 配置ELB负载均衡

创建内网ELB,将流量分发到3个主节点[1]。

  1. 创建ELB实例:弹性负载均衡 → 购买,选择内网上海一、关联VPC。
  2. 添加监听器:TCP/6379,后端服务器组新建。
  3. 添加后端服务器:将redis-master-1redis-master-2redis-master-3加入,权重均分。
  4. 健康检查:TCP:6379,间隔5秒,超时3秒,最大重试3次。

客户端通过ELB的VIP(内网IP)连接Redis集群,ELB自动分发请求,当key所在槽位不在当前节点时,Redis Cluster返回MOVED重定向,智能客户端可自动处理[4]。


四、制作Redis私有镜像(IMS)

为了让弹性伸缩的新实例自动拥有Redis环境,需将其中一台配置好的ECS制作成私有镜像。

选一台已部署完成的ECS(如redis-master-1),执行以下清理操作:

1# 停止Redis服务
2redis-cli -p 6379 shutdown
3# 删除集群配置文件(否则新实例启动时使用旧信息)
4rm -f /usr/local/redis-6.2.14/nodes.conf
5# 清空数据文件(可选,避免旧数据残留)
6rm -f /usr/local/redis-6.2.14/dump.rdb /usr/local/redis-6.2.14/appendonly.aof
7# 确保网卡为DHCP(华为云默认)
8

然后关机该ECS,进入镜像服务IMS创建私有镜像

  • 镜像类型:系统盘镜像
  • 选择镜像源:云服务器 → 选择已关机ECS
  • 名称image-redis-cluster

等待镜像状态变为“正常”[1][3]。


五、配置弹性伸缩(AS)实现自动扩容

5.1 创建伸缩配置

进入弹性伸缩AS → 伸缩配置 → 创建:

  • 配置名称as-config-redis
  • 镜像:选择刚创建的私有镜像image-redis-cluster
  • 规格:与基础ECS一致(2vCPUs | 4GB)
  • 系统盘:40GB高IO
  • 安全组sg-redis
  • 弹性公网IP:不分配
  • 高级配置:勾选“用户数据”,输入后续给出的脚本(用于新实例自动加入集群)

5.2 用户数据脚本(User Data)

该脚本在新ECS实例启动时自动执行,实现以下功能:

  1. 获取本机内网IP
  2. 修改redis.conf中bind或cluster-announce-ip(可选,建议指定)
  3. 清空旧的nodes.conf(镜像中可能残留)
  4. 启动Redis服务
  5. 通过 CLUSTER MEET 加入现有集群(需指定一个现有集群节点的IP)
  6. 将本节点设置为某个主节点的从节点(或者作为新主节点启动,此处设计为从节点扩容,提升读能力,减少复杂性)

脚本示例(保存为/opt/userdata.sh,并在伸缩配置中粘贴内容):

1#!/bin/bash
2
3# 获取本机内网IP
4LOCAL_IP=$(hostname -I | awk '{print $1}')
5# 定义现有集群中任意一个节点的IP(建议使用ELB的VIP或一个固定主节点IP)
6CLUSTER_ANY_NODE="192.168.x.1"  # 替换为实际的集群节点IP
7REDIS_HOME="/usr/local/redis-6.2.14"
8
9# 清理旧的集群配置文件
10rm -f ${REDIS_HOME}/nodes.conf
11
12# 修改redis.conf,绑定本机IP(可选,更明确)
13sed -i "s/^bind 0.0.0.0 -::1/bind ${LOCAL_IP} -::1/" ${REDIS_HOME}/redis.conf
14
15# 启动Redis
16${REDIS_HOME}/src/redis-server ${REDIS_HOME}/redis.conf
17
18# 等待Redis启动
19sleep 2
20
21# 加入现有集群:使用CLUSTER MEET与任一节点握手
22redis-cli -h ${LOCAL_IP} -p 6379 CLUSTER MEET ${CLUSTER_ANY_NODE} 6379
23
24# 可选:将此节点设置为从节点(如果希望它作为某个主节点的从节点,减少主节点数变化)
25# 注意:需要知道一个主节点的Node ID,可以通过其他节点获取。
26# 下面示例将本节点作为第一个主节点(redis-master-1)的从节点
27MASTER_NODE_ID=$(redis-cli -h ${CLUSTER_ANY_NODE} -p 6379 cluster nodes | grep master | head -1 | awk '{print $1}')
28redis-cli -h ${LOCAL_IP} -p 6379 CLUSTER REPLICATE ${MASTER_NODE_ID}
29
30# 输出日志
31echo "New Redis node ${LOCAL_IP} joined cluster successfully." >> /var/log/redis-auto-join.log
32

说明

  • 该脚本将新节点加入集群并设为某个主节点的从节点,不会改变哈希槽分配,因此不会导致数据迁移,但提高了集群的读能力和容错。
  • 如需扩容主节点(提升写能力),则需要进一步执行CLUSTER FORGETCLUSTER MEETredis-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将触发扩容:

  1. AS根据伸缩配置自动创建一台新的ECS(使用私有镜像)。
  2. 新ECS启动时执行用户数据脚本,自动加入Redis集群成为从节点。
  3. ELB健康检查通过后,新节点自动注册到ELB后端(注意:ELB只分发到主节点,但从节点加入后自动在Redis集群内向主节点同步数据,提升整体读能力)。
  4. 如果希望新节点成为主节点并提供写服务,需要手动执行reshard,可通过编写自动化脚本调用redis-cli --cluster rebalanceredis-cli --cluster reshard完成。

手动缩容(非AS自动)

缩容时不通过AS策略,操作步骤如下:

  1. 从要下线的节点迁移所有槽位(如果是主节点):
1redis-cli --cluster rebalance --cluster-use-empty-masters <要下线IP>:6379  
  1. 通过CLUSTER FORGET从集群中移除节点。
  2. 终止该ECS实例,并手动从AS伸缩组中移除。

七、脚本触发时机与作用汇总

脚本名称 / 用途触发时机作用
用户数据脚本 (userdata)AS弹出新ECS实例首次启动时自动清理旧数据、获取本机IP、启动Redis、加入集群、设置主从关系
redis安装脚本(手动执行)构建基础ECS时安装Redis二进制和依赖
集群创建命令(手动执行)搭建基础集群时初始化3主3从集群,分配哈希槽
手动扩缩容脚本(可选)需要调整主节点时迁移槽位、重新平衡集群

八、注意事项与局限

  1. 用户数据脚本的权限:需确保脚本有执行权限,可在伸缩配置中指定脚本解释器为/bin/bash
  2. 节点ID冲突:每次从镜像启动的新实例会生成新的节点ID,自动加入集群时CLUSTER MEET即可,不影响旧ID。
  3. 扩容后数据均衡:本方案扩容的新节点默认作为从节点,不会自动带来写能力的提升。如需横向扩展写能力,需在扩容后手动执行redis-cli --cluster rebalance迁移部分槽位到新的主节点上(可编写脚本在用户数据中调用,但需要确保新节点角色为主)。
  4. ELB只分发到主节点:如果新节点作为从节点,不会被ELB直接分发客户端请求,但其复制的主节点流量会增加。可考虑增加第二个ELB监听器专门用于从节点读分流(需要客户端支持读写分离)。
  5. 缩容必须手动:因为未配置缩容策略,避免误缩导致数据丢失。
  6. 生产建议:使用专业Redis集群管理工具(如RedisInsight、Redis Enterprise)或云原生Redis服务(华为云DCS),以简化运维。

九、第二天操作清单

  1. ✅ 登录华为云控制台
  2. ✅ 创建VPC和子网
  3. ✅ 创建安全组(内网全通)
  4. ✅ 购买6台ECS(按需,绑1台公网IP)
  5. ✅ 登录有公网IP的ECS,安装Redis,并分发配置到其他5台
  6. ✅ 启动所有Redis,执行--cluster create组建集群
  7. ✅ 验证集群状态
  8. ✅ 创建ELB内网负载均衡(TCP:6379),添加3个主节点作为后端
  9. ✅ 制作私有镜像(清理nodes.conf及数据文件后关机制作)
  10. ✅ 创建AS伸缩配置(使用私有镜像 + 用户数据脚本)
  11. ✅ 创建AS伸缩组(关联ELB后端组,配置扩容告警策略,不配置缩容策略)
  12. ✅ 将6台基础ECS手动加入伸缩组
  13. ✅ 测试:模拟高负载,观察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


【云计算】华为公有云构建高可用Redis集群》 是转载文章,点击查看原文


相关推荐


从零实现《三角洲行动》手游自动跑刀脚本:ADB 直控 + OpenCV 视觉识别 + 固定点位搜刮)三角洲自动跑刀教程
深度学习教程,2026/6/6

从零实现《三角洲行动》手游自动跑刀脚本:ADB 直控 + OpenCV 视觉识别 + 固定点位搜刮 从零实现《三角洲行动》手游自动跑刀脚本:ADB 直控 + OpenCV 视觉识别 + 固定点位搜刮一、前言二、整体架构与技术栈三、ADB 控制层:截图、点击、滑动四、核心难点一:怎么判断"真进游戏了"?五、核心难点二:识别"这把刷在哪个出生点"5.1 用圆检测把小地图"圆形抠出来"5.2 模板匹配识别出生点 六、核心难点三:自动拾取物资七、把它串起来:固定路线八、一个诚实的工程结论九、


React Native + RNOH:跨页面数据回传的最佳实践与避坑指南
皮蛋小精灵2026/5/31

从内存闭包到官方路由通信的深度对比 技术栈: React Native 0.77 + React Navigation v7 + RNOH(React Native OpenHarmony) 适用场景: 表单录入、列表选择器、跨页面数据回传通信 一句话结论: 内存闭包 Bridge 体验虽好但存在“热重载失效、系统回收丢回调、嵌套覆盖”三大致命缺陷;官方 route.params 需配合 setParams 清洗;在嵌套/鸿蒙 JS Stack 下,使用 CommonActions.setPa


aardio从惊喜到失望到被拉黑二三事
1681692026/5/9

aardio从惊喜到失望到被拉黑二三事 前情 其实我非常喜欢开发一些小工具,用于解决工作中和生活中的问题,我个人也有开发一些小程序和一些cli,但是对于桌面端一直没的找到好的开发方案,其中有试过autohotkey,但是它的语法和学习资料非常少,带你开发GUI就更少了,平时也就用用热词热键什么的,electron我也用过,但是它太重了,一直想找一个轻量点的,我也知道c#开发桌面工具非常不错,但是那要重新学一门语言,有想过学,但是一看c#教程就犯困也就没什么尝试了,直到某一天看到了aardio,真


一觉醒来,大模型就帮我排查完页面性能问题
candyTong2026/4/29

最近遇到一个性能问题,我让大模型自己去处理,然后就去午休了,醒来之后,它还真的把问题找出来并修复了 先说结果 最终定位出来的根因是: 这个业务工作台的查询表单,把 Formily 的 form 实例塞进了带 devtools 的 Zustand store。 这件事在开发环境里会非常要命,因为 form 不是一个轻量对象,它里面带着大量字段状态、reaction、effect、schema 和联动信息。 一旦进了 store,又被 devtools 观察、快照、序列化,内存就会被瞬间放大。


打造工业级全栈文件管理器:深度解析上传、回收站与三重下载流控技术
微特尔普拉斯2026/4/20

在构建企业级 Web 应用时,文件管理器是一个看似简单实则充满挑战的模块。面对大文件上传卡顿、大文件下载导致浏览器崩溃、以及误删不可恢复等痛点,我们需要一套更科学的架构方案。 本文将通过 Vue 2/3 + Spring Boot 的组合,详细拆解如何实现一套具备:排重检测、多线程后台下载、流式下载进度监控、以及回收站机制的文件管理系统。 一、 核心技术原理分析 1. 智能冲突检测上传 在上传文件前,系统会先发起一个“预检请求”(Check Exists)。 原理:前端获取文件名


一文搞懂Harness Engineering与Meta-Harness
GreenTea2026/4/12

一、什么是Harness Engineering harness engineering目前没有官方的英文翻译,但是我认为“驾驭工程”非常合适。“驾驭”一词本身有两层含义,“释放”与“约束”这两个相辅相成的维度,打个形象的比方,跟古代君臣关系一样,既要委以重任,又要设立制衡。 我们可以将这两层含义拆解如下: 1.1 释放潜力:让 AI 像工程师一样“真刀真枪”地干活 把模型放到现场,赋予了工程现场的实权,像一个工程师一样干活,能够接触代码库、执行命令,释放模型的潜力 传统的 Copilot


大模型应用开发学习第一天
程序员雷欧2026/4/4

从今天开始,雷欧将和大家一起学习大模型应用开发。我们不搞基础,不搞虚的,只搞最重要的知识来学习。         今天,我们要学习的是Transformer架构!!当然,底层机理,包括代码实现,并不需要我们知道,那么,我们需要学会什么呢?咱接着往下看……         首先,简单介绍一下什么是Transformer,Transformer是一种基于纯注意力机制的神经网络架构,由谷歌在2017年提出,最初用于机器翻译任务,现在已成为NLP和CV领域的基础架构。 1.Transformer整


腾讯云WorkBuddy实战, 全场景智能体工作搭子,这只龙虾真能帮你干活吗
不惑_2026/3/26

全网都在养虾。 朋友圈被刷屏了。同事也在搞。连高盛的分析师都惊了,说中国人接受AI的速度令人震惊。 但说实话,在我真正装上WorkBuddy之前,我是持怀疑态度的。 之前OpenClaw火的时候,很多人的真实体验是,折腾三小时,报错二十次,连命令行都没跑起来。一个面向普通人的AI工具,如果连安装都搞不定,那跟没有有什么区别? 所以当腾讯说WorkBuddy零部署、下载就能用的时候, 我第一反应是,真的假的。 ▲ WorkBuddy桌面端主界面,打开就是一个对话框,简洁到有点不像腾讯的风格 装上


JavaScript 中 Map 的完整解析
小李子呢02112026/3/18

Map 是 ES6 新增的键值对集合类型,专门用于解决普通对象({})作为键值存储的痛点(比如键只能是字符串 / 符号、无法直接获取长度等)。 1. 核心特性 特性说明键的类型可以是任意类型(数字、字符串、布尔值、对象、函数、null/undefined)遍历顺序严格按照插入顺序遍历(普通对象不保证)长度获取直接通过 map.size 获取(普通对象需手动计算 Object.keys(obj).length)键的唯一性同一个键只能存一个值(重复设值会覆盖)内存 / 性能存储大量键值对时,Ma


动态规划 线性 DP 经典四题一遍吃透
乌萨奇也要立志学C++2026/3/10

文章目录 台阶问题最大子段和传球游戏乌龟棋 线性dp 是动态规划问题中最基础、最常⻅的⼀类问题。它的特点是状态转移只依赖于前⼀个或前⼏个状态,状态之间的关系是线性的,通常可以⽤⼀维或者⼆维数组来存储状态。 我们在⼊⻔阶段解决的《下楼梯》以及《数字三⻆形》其实都是线性dp,⼀个是⼀维的,另⼀个是⼆ 维的。 台阶问题 题目描述 题目解析 本题就是上一节下楼梯的问题的加强版,总体思路不变,下面我们还是按照动规5板斧来分析一下这道题。 1、状态表示 dp[i]表示走到

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读