本文目录导读:

搭建高可用架构的核心目标是消除单点故障,确保服务在部分组件失效时仍能正常运行,这是一个系统工程,没有通用的“一招鲜”方案,需要根据业务场景、预算和技术栈综合设计。
下面我为你梳理一套从设计原则到具体实践的系统性指南。
核心设计原则
- 无单点故障:任何一个组件(服务器、数据库、网络设备)宕机,都不能导致整个系统不可用。
- 故障自动转移:当主节点失效时,备用节点能自动接管服务,无需人工干预,这是实现高可用(HA,High Availability)的关键。
- 可伸缩性:系统能通过增加或减少资源来应对负载变化,同时保持高可用。
- 数据一致性保障:在数据复制和故障转移过程中,保证数据不丢失或不损坏,根据容错性需求,可以在强一致性和最终一致性中做平衡。
高可用架构分层设计
通常将一个系统的架构分为四个关键层,每层都要做高可用设计。
-
客户端层
- DNS 负载均衡:将域名解析到多个 IP 地址(对应不同的数据中心或集群),实现地理级别的用户流量分发和容灾。
- 智能客户端:如移动 App 或浏览器,内置重试、熔断、服务发现机制,在请求失败时自动切换到其他可用端点。
-
接入层(反向代理)
- 工具:Nginx、HAProxy、F5 硬件负载均衡器。
- 高可用方案:
- 主备模式:使用 Keepalived + VRRP(虚拟路由冗余协议)实现,两台服务器共享一个虚拟 IP(VIP,Virtual IP),主节点故障时,备用节点抢占 VIP,继续提供服务。
- 集群模式:通过 DNS 轮询或多套独立的 Nginx/HAProxy 集群实现,每套集群内部再用 Keepalived 保证高可用。
-
应用服务层
- 实践:业务代码本身是无状态的(不保存用户 Session 等本地状态)。
- 横向扩展:应用服务部署多个实例,如 2 个、4 个或更多,所有实例功能完全相同。
- 服务注册与发现:使用 Consul、ZooKeeper、Eureka、Nacos 等工具,应用实例启动时注册,负载均衡器(如 Nginx、Spring Cloud Gateway)从注册中心动态获取可用实例列表,实现流量分发和故障剔除。
- 负载均衡:Nginx 反向代理、Kubernetes Service、云服务商负载均衡(如阿里云 SLB、AWS ELB)或 RPC 框架(如 Dubbo、gRPC)内置的负载均衡策略(轮询、最小连接数、一致性哈希等)。
-
数据存储层
- 缓存(如 Redis):
- 主从复制 + 哨兵模式:主库写,从库同步,哨兵监控主节点,当主库宕机时自动将从库切换为主库,官方推荐。
- Redis Cluster:原生集群,数据自动分片到多个节点,部分节点故障,集群仍能工作(需满足大多数节点存活)。
- 关系型数据库(如 MySQL):
- 主从复制 + 自动故障转移:常见的是一主多从,使用工具(如 MHA、Orchestrator)或云服务(如 AWS RDS Multi-AZ、阿里云 RDS 高可用版)实现主库故障时自动将从库提升为新的主库。
- 数据库中间件:如 MyCat、ShardingSphere 实现读写分离、数据分片和故障转移。
- 消息队列:
- 集群模式:如 Kafka 的 Broker 集群、RocketMQ 的 Broker 集群,主题分区和副本(Replica)机制,即使部分 Broker 宕机,也能自动从副本中选举新 Leader 继续服务。
- 冗余副本:关键数据(如消费进度)持久化并跨节点复制。
- 缓存(如 Redis):
关键技术与实现要点
- 健康检查:负载均衡器和注册中心必须定期(如每 5 秒)对后端服务进行健康检查(HTTP、TCP 或自定义探针),检测到不健康的实例立即将其从可用列表中移除,不再分发流量,常用健康检查:
/health、/actuator/health。 - 服务熔断与降级:当某个下游服务不稳定(如响应慢、错误率高)时,熔断器(如 Hystrix、Resilience4j)会快速失败,防止级联故障(雪崩效应),降级是指暂时关闭非核心功能(如 “活动页面暂时不可用”),保障核心功能(如 “用户登录”)可用。
- 幂等性设计:因为故障和重试不可避免,接口设计必须支持幂等(多次执行产生相同结果),在支付回调、订单创建等接口中,要用唯一请求 ID 去重。
- 超时与重试策略:设置合理的超时时间(如 500ms - 5s),重试次数、间隔和退避策略(如指数退避)要精心设计,避免重试风暴(即大量重试请求在短时间内打垮服务)。
- 多活/灾备:
- 同城双活:在同一个城市(如北京)部署两个数据中心,流量可同时写入两个数据中心,延迟极低,单中心故障无影响。
- 异地多活:在不同城市(如北京、上海、杭州)部署多套独立可用系统,数据同步是最大挑战,通常需基于业务单元化设计(如按用户 ID 分区),允许最终一致性,常见于大型互联网公司(如阿里的“三地五中心”)。
- 冷备/温备:异地机房或云服务商备份全部数据和配置,但平时不处理线上流量,在主中心完全不可用时,手动或自动切换到备用中心。
衡量高可用性的关键指标
- SLA:服务等级协议,通常用几个 9 表示。
- 99% = 一年宕机 < 87.6小时
- 9% = 一年宕机 < 8.76小时
- 99% = 一年宕机 < 52.6分钟
- 999% = 一年宕机 < 5.26分钟
- RTO:恢复时间目标,从故障发生到服务完全恢复所允许的最长时间,RTO < 1分钟。
- RPO:恢复点目标,系统在故障中可接受的数据丢失量,RPO=0 表示零数据丢失。
实战步骤(以 Web 应用为例)
- 架构设计阶段:画好架构图,明确每层的 HA 方案,确定 RTO/RPO 目标。
- 基础设施层:选择云服务商(如阿里云、AWS)或自建 IDC,确保:
- 网络冗余:双交换机、多运营商出口。
- 服务器双电源、磁盘 RAID(如 RAID10)。
- 应用服务层部署:
- 将应用打成 Docker 镜像,部署到 Kubernetes(K8s)集群。
- 使用 K8s 的 Deployment 管理多副本(如
replicas: 3),设置 livenessProbe(存活探针,如curl /health)和 readinessProbe(就绪探针,如检查数据库连接)。 - 使用 K8s Service 作为内部负载均衡器,自动将流量路由到健康的 Pod。
- 使用 Ingress(如 Nginx Ingress Controller)作为外部统一入口,并配置域名。
- 数据层部署:
- MySQL:搭建一主两从,部署 Orchestrator 或 MHA 实现自动故障转移,使用 ProxySQL 作为数据库中间层,实现读写分离和负载均衡。
- Redis:部署 Redis Cluster 或 Redis Sentinel 模式,数据持久化开启 AOF+RDB。
- 消息队列:部署 Kafka 集群,配置足够的副本因子(如
replication.factor: 3)。
- 配置中心:使用配置中心(如 Nacos、Apollo)管理所有应用配置,存储在分布式 KV 存储中,配置修改实时生效,应用无需重启。
- 监控与告警:
- Prometheus 采集指标。
- Grafana 可视化展示(CPU、内存、QPS、错误率、延迟等)。
- AlertManager 配置告警规则(如 5xx 错误率 > 1%、RTO 超时),告警方式:短信、电话、钉钉/企业微信机器人。
- 自动化运维与混沌工程:
- 定期自动化演练,如:Kill 一个 Pod、停止一个 MySQL 实例、拔掉一个网线,验证故障转移是否按预期工作。
- 使用混沌工程工具(如 ChaosBlade、Litmus)主动注入故障,验证系统韧性。
- 灰度发布与回滚:使用蓝绿部署或金丝雀发布,逐步切换少量用户流量到新版本,监控新版本指标,若发现问题,立即回滚,Kubernetes 的 Ingress 或 Service Mesh(如 Istio)可轻松实现此能力。
常见误区
- 高可用 = 花钱买硬件:软件层面的架构设计(无状态、故障转移)比硬件更关键。
- 只重视应用,不重视数据库:数据库往往是高可用的最大瓶颈。
- 没有演练过:再好的方案,不经过实战模拟,线上出问题就可能是灾难。
- 忽视监控:没有监控,你不知道系统是否健康,更谈不上高可用。
搭建高可用架构是一个持续迭代的过程,没有完美的架构,建议从分层设计入手,每层应用 冗余 + 故障自动转移,先实现 单机房高可用,再逐步挑战 同城双活 或 异地多活。最关键的是:让自动化、可观测性和混沌工程成为日常操作的一部分。