高可用原则
1 降级
降级开关的设计思路如下:
1. 集中管理开关:把开关推送到各个应用。
2. 可降级的多级读服务:比如服务调用降级为只读本地缓存、只读分布式缓存、只读默认降级数据(如库存状态默认有货)。
3. 前置开关:例如,架构是Nginx->Tomcat,可以将开关前置到Nginx接入层,在Nginx层做开关,请求流量回源后端应用或者只是一小部分流量回源。
4. 业务降级:当高并发流量来袭,设计电商系统大促时保证用户能下单和能支付是核心要求,并保证数据最终一致性即可。可以把一些同步调用改成异步调用,优先处理高优先级数据或特殊特征的数据,合理分配进入系统的流量,以保证系统可用。
2 限流
限流的目的是防止恶意请求流量、恶意攻击以及流量超出系统峰值。实现思路如下:
1. 恶意请求流量只访问到cache。
2. 对于穿透到后端应用的流量,可以考虑使用Nginx的limit模块处理。
3. 对于恶意IP,可以使用nginx deny进行屏蔽。
原则上限制流量穿透到后端薄弱的应用层。
3 切流量
如果某台服务器挂了,需要切流量,切换方式如下:
1. DNS:切换机房入口。
2. HttpDNS:主要在APP场景下,客户端分配好流量入口后绕过运营商LocalDNS并实现更精准流量调度。
3. LVS/HaProxy:切换故障的Nginx接入层。
4. Nginx:切换故障的应用层。
4 可回滚
版本化的目的是实现可审计可追溯,并且可回滚。当程序或数据出错时,如果有版本化机制,那么可以通过回滚恢复到最近一个正确的版本,比如事务回滚和代码库回滚。
通过负载均衡和反向代理实现分流,通过限流保护服务免受雪崩之灾,通过降级实现部分可用和有损服务,通过隔离实现故障隔离,通过设置合理的超时与重试机制来避免请求堆积造成雪崩,通过回滚机制快速修复错误版本。上述原则可以实现系统高可用。
参考资料
《亿级流量网站架构核心技术》 P10-12