高可用架构学习笔记--1

首先要明确一点:

要保证一个服务或应用永远完全可用几乎是不可能的。


如何度量一个网站的可用性?

看有几个9,比如QQ是四个9(99.99%),

2个9=基本可用

3个9=较高可用

4个9=具有自动恢复能力的高可用

5个9=极高可用(理想状态)

计算方法:(1-网站不可用时间/年度总时间)*100%


对于大多数情况,硬件故障是常态,所以,我们需要有软件的方法来保证服务的可用性,通常有如下手段:

数据和服务的(1)冗余备份 (2)失效转移

对于服务而言,一旦某个服务器宕机,就将服务切换到其他可用服务器上,

对于数据而言,如果某个磁盘损坏,就从备份的磁盘(事先就做好了数据的同步复制)读取数据。

可以通过负载均衡进行无状态服务的失效转移


应用服务器的session管理,单机情况下由Web服务器管理,集群的时候由于请求的分发是随机的,所以保证每次都能正确获得session比单机的时候要复杂很多。

集群环境中session管理的几种常见手段:

1、session复制:集群中的几台服务器之间同步session对象

优点:比较简单

缺点:该方案只适用于规模较小的情况,规模大的时候,大量的session复制操作会占用大量的服务器和网络资源

2、session绑定:利用负载均衡的源地址Hash算法,总是将源自于同一IP地址的请求分发到同一台服务器上,这样在整个会话期间,所有用户请求都会在同一台服务器上进行,即session绑定在某台特定的服务器上,保证session总能在这台服务器上获取。

优点:避免了大量的session复制备份

缺点:不符合高可用的需求,因为一旦某台服务器宕机,那么该机器上的session就不存在了,用户请求切换到其他服务器因为没有session而无法完成作业,因此很少有网站采用此方案进行session管理

3、cookie记录session:利用浏览器支持的cookie记录session简单易行,可用性高,因此许多网站或多或少都利用了cookie来记录session

优点:避开了前两种方法的缺点

缺点:受cookie大小限制,每次请求都要传cookie影响性能,用户关闭了浏览器cookie功能会造成访问的不正常

4、session服务器:利用独立部署的session服务器统一管理session,应用每次访问session时,都访问session服务器,这种方案实际是将应用服务器的状态分离,分为无状态的应用服务器和有状态的session服务器

对于有状态的session服务器,一种简单的方式是利用分布式缓存(如Memcached、Redis等)、数据库等,在这些产品的基础上进行封装,使其符合session的存储和访问要求。


高可用的服务模块为业务产品提供基础公共服务,在大型站点中这些服务通常都独立分布式部署,被具体应用远程调用,在具体实践中,有以下几点高可用的服务策略可以参考:

(1)分级管理:核心应用和服务具有更高的优先级,比如用户及时付款比能否评价商品更加重要;

(2)超时设置:设置服务的超时时间,一旦超时之后,通信框架抛出异常,应用程序则根据服务调度策略选择重试或将请求转移到其他服务器上;

(3)异步调用:通过消息队列等异步方式完成,避免了一个服务失败导致整个应用请求失败的情况;

PS:不是所有服务都可以异步调用,对于获取用户信息这类接口,采用异步方式会延长响应时间,得不偿失,对于那些必须确认服务调用成功后才能继续进行下一步的操作也不适合于异步调用。

(4)服务降级:网站访问的高峰期,为了保证核心服务的正常运行,需要对服务进行降级。

降级有两种手段:一种是拒绝服务,拒绝较低优先级的应用调用,减少服务调用的并发数,确保核心服务的正常运行。二是关闭功能,关闭部分不重要的服务,或者服务内部关闭部分不重要的功能,以节约系统开销,为核心应用让出服务资源。

(5)幂等性设计:保证服务重复调用和调用一次产生的结果相同。


保证数据高可用的主要手段有两种:一是数据备份,二是失效转移机制;

(1)数据备份:分为冷备份和热备份,冷备份是定期复制,不能保证数据的可用性。热备份又分为异步热备和同步热备,异步热备是指多分数据副本的写入操作是异步完成的,而同步备份是指备份数据的写入是同步进行的。

关系数据库的热备机制就是通常所说的主从同步机制,实践中通常采用读写分离的方法来访问Master和slave数据库,也就是写操作只访问Master库,而读操作均访问Slave库。

(2)失效转移:若数据库集群中任何一台服务器宕机,那么应用程序针对这台服务器的所有读写操作都要重新路由到其他服务器,保证数据访问不会失败。


高可用的几点QA:

(1)应用发布:在柔性发布过程中,每次关闭的服务都是集群中的一小部分,并在发布完成后立即可以访问;

(2)自动化测试:使用自动测试工具和脚本完成测试;

(3)预发布验证:引入预发布服务器,与正式服务器几乎一致,只是没有配置在负载均衡服务器上,外部用户无法访问;

(4)代码控制:git,svn等,目前Git是主流。


监控很重要:不要允许没有监控的系统上线!

1、监控数据采集

(1)用户行为日志搜集:服务器端的日志搜集和客户端的日志搜集;目前许多网站逐步开发基于实时计算框架Storm的日志统计与分析工具;

(2)服务器性能监控:收集服务器性能指标,如系统load、内存占用、磁盘IO,及时判断,防患于未然。

(3)运行数据报告:采集并报告,汇总后统一显示,应用程序需要在代码中处理运行数据采集的逻辑。

2、监控管理

(1)系统报警:配置报警阈值和值班人员联系方式,系统发生报警时,即使工程师在千里之外,也可以被及时通知。

(2)失效转移:监控到系统发生故障的时候,主动通知应用进行失效转移;

(3)自动优雅降级:为了应付网站的访问高峰,主动关闭部分功能,释放部分系统资源,保证核心服务的正常运行-->网站柔性框架的理想状态。


高可用架构学习笔记--1