初识架构之高可用

架构和架构师,可以说是大部分技术人的目标或追求吧。
但架构类比于内功或修为,它不是一门武功,不能学一招走天下。
同一个架构方案在不同公司甚至不同团队都不一定能适用,所以更多是经验和思考。
因此,一直觉得应该写下来,不定期的更新和总结,亦或分理论学习篇和实战篇来写都好。
刚好最近在读基本架构书籍,所以就从读书笔记开始,点滴记录好了。
此篇笔记主要来自于,《大型网站技术架构》。

1、高可用的定义

什么是高可用?百科的解释是:通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。一般会用可用时间占比来度量,如99.9%、99.99%,甚至99.999%等。讲完了什么是高可用后,作者从典型的“应用、服务、数据”三层架构,分别展开来讲不通层次的架构。

2、高可用应用

作者把应用层的特点归为高可用、业务层等。分有状态和无状态两种。
无状态的服务:这种相对来讲比较之间,基本都可以横向扩容,通过Nginx、Haproxy等负载均衡代理层来进行流量转发和失效转移即可。以集群部署的方式提供服务,确保高可用。
有状态的服务:书里举例是Session的状态以及如何管理Session的状态,但除了应用层的session,实战中还有很多服务也可能被设计为有状态的。例如:某个服务每个实例负责处理不通的号码段,A服务处理id:1-10000号的用户,B服务处理id:10001-20000...。

回到书里,关于Session管理的手段:
seesion复制:仅适用于小型网站。缺点是集群规模一旦稍微大点,大量的session通信会占用不少资源。
session绑定:利用负载均衡的hash算法,使同一用户请求落到同一台机器上。缺点很明显一旦出现某台机器宕机,该机器上用户的session信息都会丢失。
利用cookies来记录session:来回传;简单但大小受限。不过,还是许多网站采用了这种方案。
session服务:利用如分布式缓存等技术服务开发搭建session服务。集中化管理,特别是实现SSO单点登录的场景。

3、高可用服务

作者将通过提供Rpc调用的基础服务归为此类,实际上我觉得跟应用层差别不大。
无状态服务,一样可以通过负载均衡加心跳检测等手段去部署集群,确保故障转移来做到高可用。
这一节主要的几点笔记:
分级管理:有点水,讲的是核心服务分配更好的硬件以及隔离部署。其实实战中,核心服务或大型活动都应该隔离部署,这样可以避免故障引起连锁反应。比如同一台机器混布,cpu等资源被其他服务占满。同理,机房带宽等资源也有类似的可能。
超时设置:继续水。讲应用层调用服务层应该设置超时,避免服务层挂了请求还在那长时间占用资源。其实实战中不管怎么分层,也不管是同层还是跨层调用,只要发起一个Rpc调用都应该有超时机制。
异步调用:主要讲运用消息队列将非强依赖的逻辑异步化,如注册过程的发邮件或欢迎短信等操作,可以优先保证核心流程,至于发送邮件等可以丢个消息队列异步执行即可。其实,异步化在实战中很常用,但我个人觉得跟高可用没啥直接相关,更多是业务解耦。
服务降级:分拒绝服务和关闭服务。拒绝服务又分按优先级拒绝或随机拒绝,实战中随机较容易,只要设置好服务的阈值,达到阈值的时候丢弃请求即可。而关闭服务,则比较果断,比如秒杀的时候关闭评论、追评或者确认收货;又比如大型直播结束后,关闭一些原本日常会进行的相关兴趣推荐等。
幂等性设计:请求可多次提交或叫做可重放,服务能保证最终结果正确性。有些修改是天然的幂等性:资料设置。反之,加减金额、奖励发放等就不是天然幂等的,这类服务就小心对待这个问题。实战中常见手段是,利用一些流水号等方式,目的其实都是校验唯一性。

4、高可用数据

作者对数据层的介绍就是CAP、数据备份和失效转移。
CAP:初步CAP原理的Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)。以及说大型网站一般保证AP,然后在某种程度上放弃C(一致性);然后再将数据一致性分为:数据强一致、数据用户一致和数据最终一致。并提到数据不一致通常出现在系统高并发写操作或集群状态不稳(故障恢复或集群扩容)的情况。
我个人觉得实战中,大多数时候采用的方案就是保证最终一致。除了上面提到的集群状态不稳定外,奖励、订单等涉及多个分布式服务时都可能出现不一致,因此纠错、对账、补偿都是很常用的手段。

数据备份:定时冷备、异步热备、同步热备。
失效转移:失效确认、访问转移、最后再数据恢复后当好备胎。

5、高可用开发流程

服务发布:通过切流量的方式一台台灰度发布。
自动化测试:推荐Web的自动化测试工具ThoughtWorks。
预发布环境:搭建一套与现网一致,甚至与现网打通,但只能配置host内部访问的环境。用于预发布验证。
代码控制:主干发布、分支开发的模式。还是推荐Git。
自动化发布:这个感觉有点难。。
灰度发布:按Set灰度、按机器灰度、按号码段灰度,还可以做A/B Test。

6、网站运行监控

开源性能监控工具:Ganglia
监控数据采集:1、用户行为采集 2、服务&服务器性能操作采集 3、定期数据报告
监控管理:1、系统告警 2、失效转移 3、自动降级

相关推荐