系统高可用的 10 条军规

news/2025/3/21 10:41:46/文章来源:https://www.cnblogs.com/12lisu/p/18780370

前言

系统高可用是非常经典的问题,无论在面试,还是实际工作中,都经常会遇到。

这篇文章跟大家一起聊聊,保证系统高可用的10个小技巧,希望对你会有所帮助。

1 冗余部署

场景:某电商大促期间,数据库主节点突然宕机,导致全站交易瘫痪。

问题:单节点部署的系统,一旦关键组件(如数据库、消息队列)故障,业务直接归零。

解决方案:通过主从复制、集群化部署实现冗余。例如MySQL主从同步,Redis Sentinel哨兵机制。

MySQL主从配置如下:

-- 主库配置
CHANGE MASTER TO 
MASTER_HOST='master_host',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;-- 从库启动复制
START SLAVE;

效果:主库宕机时,从库自动切换为可读写状态,业务无感知。

2 服务熔断

场景:支付服务响应延迟,导致订单服务线程池耗尽,引发连锁故障。

问题:服务依赖链中某个环节异常,会像多米诺骨牌一样拖垮整个系统。

解决方案:引入熔断器模式,例如Hystrix或Resilience4j。

Resilience4j熔断配置如下:

CircuitBreakerConfig config = CircuitBreakerConfig.custom().failureRateThreshold(50)  // 失败率超过50%触发熔断.waitDurationInOpenState(Duration.ofMillis(1000)).build();
CircuitBreaker circuitBreaker = CircuitBreaker.of("paymentService", config);// 调用支付服务
Supplier<String> supplier = () -> paymentService.call();
Supplier<String> decoratedSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, supplier);

效果:当支付服务失败率飙升时,自动熔断并返回降级结果(如“系统繁忙,稍后重试”)。

3 流量削峰

场景:秒杀活动开始瞬间,10万QPS直接击穿数据库连接池。

问题:突发流量超过系统处理能力,导致资源耗尽。

解决方案:引入消息队列(如Kafka、RocketMQ)做异步缓冲。

用户下单的系统流程图如下:

RocketMQ生产者的示例代码:

DefaultMQProducer producer = new DefaultMQProducer("seckill_producer");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message msg = new Message("seckill_topic", "订单数据".getBytes());
producer.send(msg);

效果:将瞬时10万QPS的请求平滑处理为数据库可承受的2000 TPS。

4 动态扩容

场景:日常流量100台服务器足够,但大促时需要快速扩容到500台。

问题:固定资源无法应对业务波动,手动扩容效率低下。

解决方案:基于Kubernetes的HPA(Horizontal Pod Autoscaler)。

K8s HPA 的配置如下:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: order-service-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: order-serviceminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 60

效果:CPU利用率超过60%时自动扩容,低于30%时自动缩容。

5 灰度发布

场景:新版本代码存在内存泄漏,全量发布导致线上服务崩溃。

问题:一次性全量发布风险极高,可能引发全局故障。

解决方案:基于流量比例的灰度发布策略。

Istio流量染色配置如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: bookinfo
spec:hosts:- bookinfo.comhttp:- route:- destination:host: reviewssubset: v1weight: 90  # 90%流量走老版本- destination:host: reviewssubset: v2weight: 10  # 10%流量走新版本

效果:新版本异常时,仅影响10%的用户,快速回滚无压力。

6 降级开关

场景:推荐服务超时导致商品详情页加载时间从200ms飙升到5秒。

问题:非核心功能异常影响核心链路用户体验。

解决方案:配置中心增加降级开关,如果遇到紧急情况,能 动态降级非关键服务。

Apollo配置中心的示例代码如下:

@ApolloConfig
private Config config;public ProductDetail getDetail(String productId) {if(config.getBooleanProperty("recommend.switch", true)) {// 调用推荐服务}// 返回基础商品信息
}

效果:关闭推荐服务后,详情页响应时间恢复至200ms以内。

7 全链路压测

场景:某金融系统在真实流量下暴露出数据库死锁问题。

问题:测试环境无法模拟真实流量特征,线上隐患难以发现。

解决方案:基于流量录制的全链路压测。

实施步骤

  1. 线上流量录制(如Jmeter+TCPCopy)
  2. 影子库隔离(压测数据写入隔离存储)
  3. 压测数据脱敏
  4. 执行压测并监控系统瓶颈

效果:提前发现数据库连接池不足、缓存穿透等问题。

8 数据分片

场景:用户表达到10亿行,查询性能断崖式下降。

问题:单库单表成为性能瓶颈。

解决方案:基于ShardingSphere的分库分表。

分库分表的配置如下:

sharding:tables:user:actualDataNodes: ds_${0..1}.user_${0..15}tableStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: HashModShardingAlgorithmpreciseAlgorithmType: HASH_MODshardingCount: 16

效果:10亿数据分散到16个物理表,查询性能提升20倍。

9 混沌工程

场景:某次机房网络抖动导致服务不可用3小时。

问题:系统健壮性不足,故障恢复能力弱。

解决方案:使用ChaosBlade模拟故障。

示例命令

# 模拟网络延迟
blade create network delay --time 3000 --interface eth0# 模拟数据库节点宕机
blade create docker kill --container-id mysql-node-1

效果:提前发现缓存穿透导致DB负载过高的问题,优化缓存击穿防护策略。

10 立体化监控

场景:磁盘IOPS突增导致订单超时,但运维人员2小时后才发现。

问题:监控维度单一,无法快速定位根因。

解决方案:构建Metrics-Log-Trace三位一体监控体系。

技术栈组合

  • Metrics:Prometheus + Grafana(资源指标)
  • Log:ELK(日志分析)
  • Trace:SkyWalking(调用链追踪)

定位问题流程如下 :

CPU利用率 > 80% → 关联日志检索 → 定位到GC频繁 → 
追踪调用链 → 发现某个DAO层SQL未走索引

效果:故障定位时间从小时级缩短到分钟级。

总结

系统高可用建设就像打造一艘远洋巨轮。

冗余部署是双发动机,熔断降级是救生艇,监控体系是雷达系统。

但真正的关键在于:

  1. 故障预防比故障处理更重要(如混沌工程)
  2. 自动化是应对复杂性的唯一出路(如K8s弹性扩缩)
  3. 数据驱动的优化才是王道(全链路压测+立体监控)

没有100%可用的系统,但通过这10个实战技巧,我们可以让系统的可用性从99%提升到99.99%。

这0.99%的提升,可能意味着每年减少8小时的故障时间——而这,正是架构师价值的体现。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,我的所有文章都会在公众号上首发,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901379.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpStudy常见问题

问题一: 图中的错误提示显示,MySQL 无法切换到指定的目录,可能是文件或目录不存在 。以下是一些可能的原因和解决方法: 目录路径错误: 原因:MySQL 配置文件中设置的 datadir (数据存储目录)路径错误,或者该路径下的文件夹结构有变动,导致 MySQL 无法找到对应的目录。…

OpenHarmony 开源鸿蒙北向开发——hdc工具安装

​ hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备(或模拟器)进行连接调试通信。简单来讲,hdc 是 OpenHarmony 提供的用于开发人员调试硬件、应用的命令行工具,用…

DBeaver 常用个性化设置

SQL关键字大写 窗口 → 首选项 → 编辑器 → SQL编辑器 → SQL格式化 → 关键字大小写默认分页数量 窗口 → 首选项 → 编辑器 → 数据编辑器 → 数据集获取大小作者多数为原创文章 ( 部分转载已标出 ),目前资历尚浅文章内描述可能有误,对此造成的后果深表歉意,如有错误还望…

2023腾讯游戏安全竞赛-PC方向初赛复现

2023腾讯游戏安全竞赛-PC方向初赛复现 第一问 问题描述:在64位Windows10系统上运行contest.exe, 找到明文的信息,作为答案提交(1分) 直接运行程序,在contest.txt中拿到密文ImVkImx9JG12OGtlImV+,很像base64后的结果,但是直接解码得到的不是自然语言,整个exe程序也完全被…

如何选择合适的供应商协同平台,解决数据交互的安全性与高效性?

在当今竞争激烈的商业环境中,企业的供应链管理面临着诸多挑战。传统的供应商合作模式在信息沟通、流程效率等方面存在着明显的问题,这些问题不仅制约了企业的发展,也影响了整个供应链的竞争力,企业需要寻找供应商协同平台,实现企业与供应商之间的信息共享、业务协同和数据…

【深度好文】是时候重新评估您当前的MFT文件传输供应商了

随着文件传输需求的不断演变,更复杂的数据安全威胁的出现、⼈⼯智能等颠覆性技术、成本压⼒以及从医疗保健到⾦融再到供应链等⾏业⽇益严格的监管标准,企业可能需要重新评估其受管文件传输(MFT)供应商。本文将探讨推动企业更换MFT系统的因素,以及在评估潜在新MFT供应商时需…

Nginx错误处理与排查:运维人员的必备手册

前言:在日常的 Web 开发与运维工作中,Nginx 作为一款高性能的 Web 服务器和反向代理工具,被广泛应用于各种项目中。然而,即使是最优秀的工具也难免会遇到各种问题。Nginx 的报错信息虽然简洁,但往往让人摸不着头脑,尤其是对于新手来说,更是如此。而重定向配置,作为 Ngi…

RequestMapping

其中最关键的是path属性(等价于value),它决定了当前方法处理的请求路径,注意路径必须全局唯一,任何路径只能有一个方法进行处理,它是一个数组,也就是说此方法不仅仅可以只用于处理某一个请求路径,我们可以使用此方法处理多个请求路径: @RequestMapping({"/index&…

C#/.NET/.NET Core技术前沿周刊 | 第 30 期(2025年3.10-3.16)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

读DAMA数据管理知识体系指南24数据集成概念(下)

读DAMA数据管理知识体系指南24数据集成概念(下)1. 复制 1.1. 复制技术将分析和查询对主事务操作环境性能的影响降至最低 1.2. 复制解决方案通常监视数据集的更改日志,而不是数据集本身 1.3. 标准复制解决方案是准实时的,数据集的一个副本和另一个副本之间的更改有很小的延迟…

20244112 实验一《Python程序设计》实验报告

20244112 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级:2441 姓名:李其鲔 学号:20244112 实验教师:王志强 实验日期:2025年3月18日 必修/选修:公选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习…

Groq软件定义的横向扩展张量流多处理器-从芯片到系统架构概述

Groq软件定义的横向扩展张量流多处理器-从芯片到系统架构概述 1.大纲 1)张量流处理器(TSP)背景 2)软件定义的硬件和确定性执行 3)TSP微架构 4)系统封装、拓扑、路由和流控制 5)小结 2.软件定义方法 1)软硬件协同设计并不是什么新鲜事 2)重新检查硬件软件接口 ① 静态-…