一、高可用:
举例子说,系统的可用性要达到4个9(99.99%)那么根据上图可以看到是不能一年内超过53分钟。这样看的话确实很难达到。但是公式上说了是计划之外的。相当于是意外停机,而不是上线部署,系统切换这种正常停机。
计划外停机和正常运行着两个状态在不同场景下定义不同,系统的一部分非关键功能降级,对整个系统来说算计划外还是正常?降级持续或累计多久才算非正常停机?我们可以再系统的SLA(service level agreement)服务等级协议中定义描述。
那么备战中如何在SLA定义好的情况下(吞吐量和响应时间)去考虑系统的可用性则需要涉及到多个因素,比如可扩展性、网络状况、容灾备份以及系统的实现方式等。
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
方法论上,高可用是通过冗余+自动故障转移来实现的。
整个互联网分层系统架构的高可用,又是通过每一层的冗余+自动故障转移来综合实现的,具体的:
(1)客户端层到反向代理层的高可用,是通过反向代理层的冗余实现的,常见实践是keepalived + virtual IP自动故障转移。
(2)反向代理层到站点层的高可用,是通过站点层的冗余实现的,常见实践是nginx与web-server之间的存活性探测与自动故障转移。
(3)站点层到服务层的高可用,是通过服务层的冗余实现的,常见实践是通过service-connection-pool来保证自动故障转移。
(4)服务层到缓存层的高可用,是通过缓存数据的冗余实现的,常见实践是缓存客户端双读双写,或者利用缓存集群的主从数据同步与sentinel保活与自动故障转移;更多的业务场景,对缓存没有高可用要求,可以使用缓存服务化来对调用方屏蔽底层复杂性。
(5)服务层到数据库“读”的高可用,是通过读库的冗余实现的,常见实践是通过db-connection-pool来保证自动故障转移。
(6)服务层到数据库“写”的高可用,是通过写库的冗余实现的,常见实践是keepalived + virtual IP自动故障转移。
二、可扩展性
扩展性分为两种:1-水平扩展、2-垂直扩展
1-水平扩展:一般大家会说堆机器,增加资源的节点数,使负载均衡到每个节点,以应对高流量下的请求。
2-垂直扩展:资源有限的情况下,以及高配置的服务器都需要考虑垂直扩展方案。可以对比应用12因素来参照
三、灾备
新的机器资源除了用于扩容,还有个最大的用途就是增加灾备能力。现在都是异地多活,多机房部署,要能保证一个机房有故障的情况下,系统依然高可用。在备战期间,会进行全链路压测,将流量入口全部切换到一个机房,对数据库进行主备切换等,来验证和查找整个系统的瓶颈以提升整个系统的灾备的能力。
记住一点,添加机器也不是万能的,优化代码逻辑,优化架构设计会从根本减少很多问题。
四、性能、柔性和鲁棒性
对于大促的应对,首先会对应用架构进行升级,对于主要流量点进行着重关注,可以考虑缓存和异步化的方式来提高性能。
如何理解柔性和鲁棒性?
鲁棒性强调的是系统结实,不容易出问题,柔性强调出现故障后快速隔离影响和快速修复的能力。
鲁棒性可以通过限制上线的数量以及加强对紧急上线的审批力度来控制。
柔性可以在系统流量的高峰期,对所依赖的重要性不高的服务进行降级,对所依赖响应能力差的服务进行熔断,对多个已来访进行隔离实现舱壁的效果,也可以不断优化自动化程度来提高柔性。
五、安全
对于黑客不明攻击,以及非法请求需要进行合法校验。大的流量促销入口,可以限制IP,限制账号,限制时间,限制数量,限制接口的同一用户调用次数来控制非法恶意攻击请求。比如短信验证码,现在增加图片识别滑动、拖动、识图等功能来增加黑客攻击难度。保证系统安全。
京东利用了SDL+安全开发控制,基于京东大促数据墙建立了保障指挥系统,对全站HTTPS进行推广和优化,并通过DDoS攻防平台进行攻击流量的集中监控来有效保证安全。
六、网络
网络隔离指的是对测试环境,性能压测环境,UAT环境,生产环境进行隔离,即相应环境下的服务器是不能互通的,这样可以保证一个干净的网络环境,这样优先去掉了外界的干扰因素后面出现问题也便于排查。
做系统预案的时候主要包括两个部分,一个是技术预案,一个是业务预案。技术预案一般是自动容错,故障自动转移,主备自动切换,备用的网络专线,备用域名,备用服务器,数据堆积处理,上下游限流处理, 数据库阻塞、死锁、连接数满等等等等,这个后面专门弄个文章来讨论下。而业务预案往往被忽视,甚至没做,比如你的电商平台下有10家物流供应商,一旦其中的一个或者多个出现异常导致无法作业,这时候应该可以自动切换选择不同的供应商,或者调整权重分配。
七、捣乱猴子(故障)演练
故障演练也包括两部分,一个是正常的故障演练,比如数据库主备库宕机自动切换演练,nginx主备切换演练,redis节点宕机切换演练,应用宕机演练等等。另外一个就是破坏性的演练,项目在不发通知的情况下秘密成立一个破还演习小组,在任何时间以任何手段对系统环境进行破坏,其中包括网络,中间件,应用,数据库等等,比如让网络突然掉线或者应用集群破坏50%,这个可以考验整个项目团队的应急能力和整个系统恢复所需要的时间以及看出更多的漏洞,最后项目团队做总结。
八、集中办公
集中办公一般在大促前的两个礼拜就开始了,项目的核心人员包括核心开发人员,架构师,DBA,网络工程师等到一个相对独立封闭的环境进行办公,这样做的主要目的就是保证这些人可以在一个相对安静的环境下更专注的去寻找系统中的一些漏洞和系统优化,以及对于系统问题及时响应。
九、预防大于一切-值班安排
系统的每个模块都要保证至少有2~3个人是精通的,这样一旦出现问题可以迅速的进行排查修复,而且安排7X24个小时白夜班轮岗。