如何合理的设计高可用的系统
从一次线上故障说起
先讲个真实发生的事儿。
某天晚上8点,某视频网站的运营同学搞了个"限时免费看大片"活动,本来预估有个几万人参与就不错了。结果活动一开始,流量直接飙了10倍,用户拼命刷页面,评论服务先扛不住了,响应变慢。
问题来了,视频详情页要调用评论服务获取热门评论,评论服务慢了,详情页的请求线程就一直阻塞等着。等着等着,详情服务的线程池也满了,然后推荐服务调详情服务也开始超时...
不到5分钟,整个首页都打不开了。值班同学手忙脚乱,最后只能紧急扩容+重启服务,折腾了半个多小时才恢复。事后复盘,这就是典型的"雪崩效应"。
这种场景在分布式系统里太常见了,今天咱们就来好好聊聊怎么设计一个高可用系统,以及怎么防止雪崩。
高可用到底是个啥?
简单理解
高可用说白了就是:系统在绝大部分时间都能正常提供服务,即使出了问题也能快速恢复。
咱们平时说的"几个9"就是用来衡量可用性的: