实现高可用原则主要有:降级、限流、切流量、可回滚,接下来仔细讲述一下。
1.降级
对于一个高可用服务,很重要的一个设计就是降级开关,在设计降级开关时,要根据以下步骤:
- 开关集中化管理:通过推送机制把开关推送到各个应用。
- 可降级的多级服务:比如服务调用降级为只读本地缓存、只读分布式缓存、只读默认降级数据(例如库存状态默认有货)。
- 开关前置化,如架构是Nginx-->Tomcat,可以将开关前置到Nginx接入层,在Nginx层做开关,请求流量不回源后端Tomcat应用或者只是一小部分流量回源。
- 业务降级:当高并发流量来袭,在电商系统大促设计时保障用户能下单、能支付是核心要求,并保障数据最终一致性即可。这样就可以把一些同步调用改为异步调用,优先处理优先级高或者特殊特征的数据,合理分配进入系统的流量,以保障系统可用。
2.限流
限流的目的是放置恶意请求流量、恶意攻击,或者防止流量超出系统峰值。
原则是限制流量穿透到后端薄弱的应用层。
可以设计如下:
- 恶意请求流量只访问到cache
- 对于穿透到后端应用的流量可以考虑使用Nginx的limit模块处理
- 对于恶意IP可以使用nginx deny进行屏蔽
3.切流量
对于一个大型应用,切流量是非常重要的,比如多机房环境下某个机房挂了,或者某个机架挂了,或者某台服务器挂了,都需要切流量,可以用如下方法进行切换:
- DNS:切换机房入口
- HttpDNS:主要在APP场景下,在客户端分配好流量入口,绕过运行商LocalDNS并实现更精准流量调度
- LVS/HaProxy:切换故障的Nginx接入层
- Nginx:切换故障的应用层
4.可回滚
版本化的目的是实现可审计可追溯可回滚。当程序或数据出错时,如果有版本化机制,那么就可以通过回滚恢复到最近一个正确的版本,比如事务回滚、代码库回滚、部署版本回复你、数据版本回滚、静态资源版本回滚。通过回滚机制可以保证系统某些场景下的高可用。