什么是高可用?
一个系统大多数时间是可用的,即使是硬件故障或者系统升级时候,依旧可用。
高可用的度量方式
- MTBF(Mean Time Between Failure)是平均故障间隔的意思,代表两次故障的间隔时间,也就是系统正常运转的平均时间。这个时间越长,系统稳定性越高。
- MTTR(Mean Time To Repair)表示故障的平均恢复时间,也可以理解为平均故障时间。这个值越小,故障对于用户的影响越小。
- Availability = MTBF / (MTBF + MTTR)
- 系统可用性 9999

哪些情况会导致系统不可用?
- 访问者不怀好意:黑客攻击;
- 访问者正常访问:并发量/用户请求量激增导致整个服务宕掉或者部分服务不可用;
- 开发者代码问题:代码中的坏味道导致内存泄漏或者其他问题导致程序挂掉;
- 外力因素:硬件故障,比如服务器坏掉;自然灾害或者人为破坏。
如何提升系统可用性?
- 高可用-冗余设计(思想)
- 集群、灾备、同地/异地多活
- 高可用-存储架构 TODO
- 高可用-异地多活
- 高可用-故障处理 TODO
- 高可用-超时和重试机制
- 保护与兜底
- 系统运维
- 监控与日志报警
如何提升不同场景下高可用?
排查问题的经验贴
- # cpu使用率过高和jvm old占用过高排查过程
- # 频繁FGC的真凶原来是它
- # 老年代又占用100%了,顺便发现了vertx-redis-client 的bug
- 如何发现和排查问题?TODO
- 使用 top 命令查看 CPU 的负载情况
- Java 应用,可以结合 jstack 命令来查看 CPU 使用率比较高的线程正在执行什么操作
- 使用 pidstat、vmstat、mpstat 来查看 CPU 的运行队列、阻塞进程数、上下文切换的数量
- Perf 也是一个常见的工具,可以帮助你排查哪些系统调用或者操作消耗了更多的 CPU 时间
- Java 使用 jmap 命令 dump 出内存信息,然后使用类似 MAT 的工具来分析内存泄漏。
- 针对其他语言,使用 pmap 和 GDB 来查看堆外内存都有哪些数据