高可用性(High Availability) 指系统通过专门设计,最大限度减少停工时间,持续提供稳定服务。诚直科技在多年实践中,总结出一套覆盖架构、编码、运维等多个层面的高可用设计要点,现梳理如下。
全面识别单点:包括机房(同城异地双机房)、应用服务器、DNS服务器、SFTP服务器、负载均衡器(LBS)、缓存服务器、数据库、消息服务器、代理服务器及专线等。
专线冗余:若系统通过专线调用外部服务,同时接入联通和电信两条专线,降低单条专线故障风险。
负载均衡策略:优先使用软负载(如Nginx、HAProxy),以硬负载(如F5)作为兜底方案。
减少DNS依赖:通过配置本地hosts文件,并用自动化工具向所有服务器推送最新域名映射,避免DNS解析故障。
减少远程服务依赖:利用本地缓存或近端服务替代RPC调用。
消息驱动:系统间通过消息服务器传递数据,降低直接耦合。
读写分离:A系统负责写数据库,B系统负责读数据库,即使A不可用,短时间内B仍可提供服务。
将系统分为A、B、C三个等级,高级别系统不依赖低级别系统,且要求更高的可用性指标。
动态权重:集群中自动识别高性能服务,降低超时服务的权重,优先调用高权重节点。
弹性扩容:根据资源使用率(如带宽)自动或手动扩容,快速增加资源。
避免无限死循环导致CPU 100%。为for循环设置最大迭代次数(如1000次)。
服务器不保存用户状态数据:集群环境下禁用static变量存储用户数据,不将用户文件长期存放在本地。有状态服务难以扩容且易产生单点问题。
提供开关控制功能启用/关闭。例如消息量过大时开启开关直接丢弃消息;新功能上线默认带开关,出现问题可快速关闭。
超时设置:内部调用连接超时1秒、读超时3秒;外部调用连接超时3秒、读超时20秒。
重试策略:外部服务异常时递增重试间隔,同时设置最大重试次数和总开关,避免对下游造成压力。
应用隔离、模块隔离、机房隔离、线程池隔离。
按变更频率隔离:抽象且不变的代码放入高可用模块;频繁变化的业务逻辑放入独立模块,故障影响范围可控。
线程池隔离:不同业务使用独立线程池,防止低优先级任务阻塞高优先级,或高优先级任务过度占用导致低优先级任务饿死。
将同步调用改为异步,避免远程调用故障或超时阻塞主流程。
优先调用本地JVM内服务 → 同机房服务 → 同城服务 → 跨城服务。
通过缓存加“保鲜度”策略,减少对下游依赖。
配置中心主动推送服务地址至本地;参数中心将配置推送到本地内存,避免远程获取。
将经常变化的业务代码封装为独立模块,利用Java ClassLoader实现运行时动态加载与卸载,实现热修复。
使用IDEA代码分析等工具定期扫描,发现空指针异常、循环依赖等潜在Bug。
对指定服务设置限流阈值:QPS、TPS、QPH(每小时总请求量)、QPD(每天总请求量),防止异常流量冲击。
对热点数据进行缓存。例如B系统提供名单服务,同时提供Client SDK实现近端缓存,定期拉取数据,减少RPC调用。
数据库不可用时,降级使用缓存数据。
分级缓存:优先读本地缓存(通过推模式更新),其次读分布式缓存。
系统响应缓慢时,关闭部分非核心功能释放资源。例如大量消息涌入导致服务不可用时,直接丢弃消息;或通过流控拒绝低级别系统请求。
流量陡增时将请求暂存(如存入数据库),然后按指定QPS泄洪,保护下游系统。对方系统响应缓慢时,自动触发蓄洪。
监控数据出现大幅跌涨时,及时中断操作。例如指标计算时,若某用户指标环比/同比增长一倍或跌零,则中止该用户计算并保存原始消息,避免错误扩散。
监控指标:CPU利用率、load、内存、带宽、系统调用量、应用错误量、PV、UV、业务量。
精准报警阈值:例如平时内存利用率50%,设置60%报警,提前感知内存泄露趋势,避免应用无响应。
定期评估容量,大促前执行压测和容量预估,按需扩容。
对程序、系统配置、数据定期自动备份(使用Linux命令和Shell脚本),支持本地或异地备份,确保故障后快速重建。
对外服务必须进行压测,明确可承受的QPS/TPS,从而制定准确的限流策略。
新功能仅对部分服务器生效,观察数天逐步切流,出现问题仅影响少量客户。支持快速回滚或直接下线灰度机器。
诚直科技的高可用设计体系,从消除单点、减少依赖、流量管控、缓存容灾、服务降级、熔断隔离、弹性扩容、灰度发布、精准监控等多个维度入手,形成了一套覆盖全链路的保障方案。实践中需要根据业务场景灵活组合上述策略,并持续通过压测和监控验证系统的韧性,才能真正实现高可用目标。
下一篇:没有了!