实现高可用架构的主要手段是数据和服务的冗余备份和失效转移,一旦某些服务器宕机,就将服务切换到其余可用的服务器上,若是磁盘损坏,则从备份的磁盘读取数据 html
首先,不得不说:要保证一个网站永远彻底可用几乎是一件不可能完成的任务(Mission Impossible,是否是有点碟中谍的感受)。算法
(1)如何度量网站可用性?数据库
一个神奇的数字—9!你有几个9,就表明了你的可用性。例如QQ可用性达到了4个9:99.99% 浏览器
①2个9=基本可用 ②3个9=较高可用 ③4个9=具备自动恢复能力的高可用 ④5个9=极高可用->理想状态缓存
那么,可用性的9又是怎么计算出来的呢:服务器
①网站不可用时间=故障修复时间点-故障发现时间点网络
②网站年度可用性指标=(1-网站不可用时间/年度总时间)*100% 架构
(2)如何考核网站可用性?并发
普遍采用故障分的,它是对网站故障进行分类加权计算故障责任的方法。通常会给每一个分类的故障设置一个权重(例如事故级故障权重为100,A类为20等),其计算公式为:故障分=故障时间(分钟)*故障权重。公司对技术团队的考核通常会参考故障分,例如某团队今年发生了几个事故级故障,那么其绩效考核估计受到很大影响,年终奖什么的就悲剧了。负载均衡
目前,一般企业级应用系统(特别是政府部门和大企业的应用系统)通常会采用安规的软硬件设备,如IOE(IBM的小型机、Oracle数据、EMC存储设备)系列。而通常互联网公司更多地采用PC级服务器(x86),开源的数据库(MySQL)和操做系统(Linux)组建廉价且高容错(硬件故障是常态)的应用集群。
(1)设计的目的?
保证服务器硬件故障服务依然可用,数据依然保存并可以被访问。
(2)主要的手段?
数据和服务的①冗余备份以及②失效转移:
对于服务而言,一旦某个服务器宕机,就将服务切换到其余可用的服务器上;
对于数据而言,若是某个磁盘损坏,就从备份的磁盘(事先就作好了数据的同步复制)读取数据。
应用层处理网站应用的业务逻辑,应用的一个最显著的特色是:应用的无状态性。
PS:提到无状态特性,不得不说下Http协议。咱们经常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用自己可能已经存储在全局对象中的全部信息外,该环境不保存与会话有关的任何信息。之因此咱们在使用ASP.NET WebForm开发中会感受不到Http的无状态特性,彻底是由于Microsoft帮咱们实现了ViewState,它是ASP.NET WebForm中保存页面信息的基本单位,本质是一个HTML中的隐藏域,回调时会将这个隐藏域中的数据提交到服务器端。
(1)经过负载均衡进行无状态服务的失效转移
(2)应用服务器集群的Session管理
首先,不得不说的是:Web应用中将上下文对象称为会话(Session),单机状况下由部署在服务器上得Web容器(如IIS、Tomcat、JBoss等)管理。在使用了负载均衡的集群环境中,因为请求的分发是随机的,因此保证每次请求依然可以得到正确的Session比单机时要复杂得多。
其次,咱们来看看在集群环境中,Session管理的几种常见手段。
①Session复制:该方案简单易行,集群中的几台服务器之间同步Session对象,任何一台服务器宕机都不会致使Session对象的丢失,服务器也只须要从本机获取便可。可是,该方案只适合集群规模较小的状况下。当规模较大时,大量的Session复制操做会占用服务器和网络的大量资源,系统不堪重负。
②Session绑定:利用负载均衡的源地址Hash算法,老是将源于同一IP地址的请求分发到同一台服务器上。这样的话,在整个会话期间,用户全部的请求都在同一台服务器上进行处理,即Session绑定在某台特定服务器上,保证Session总能在这台服务器上获取。(这种方案又叫作会话粘滞)。
可是,这种方案不符合高可用的需求。由于一旦某台服务器宕机,那么该机器上得Session也就不复存在了,用户请求切换到其余机器后由于没有Session而没法完成业务处理。所以,不多有网站采用此方案进行Session管理。
③Cookie记录Session:利用浏览器支持的Cookie记录Session简单易行,可用性高,而且支持服务器的线性伸缩,所以,许多网站都或多或少地使用了Cookie来记录Session。可是Cookie记录Session有缺点:好比受Cookie大小限制、每次请求响应都要传输Cookie影响性能、用户关闭了Cookie会形成访问不正常等。
④Session服务器:利用独立部署的Session服务器(集群)统一管理Session,应用服务器每次读写Session时,都访问Session服务器。这种方案其实是将应用服务器的状态分离,分为无状态的应用服务器和有状态的Session服务器。
对于,有状态的Session服务器,一种较简单的方法是利用分布式缓存(如Memcached、Redis等,有关Redis的简单介绍能够阅读个人博文:NoSQL初探之人人都爱Redis)、数据库等,在这些产品的基础上进行封装,使其符合Session的存储和访问要求。
高可用的服务模块为业务产品提供基础公共服务,在大型站点中这些服务一般都独立分布式部署,被具体应用远程调用。
在具体实践中,有如下几点高可用的服务策略能够参考:
①分级管理:核心应用和服务具备更高的优先级,好比用户及时付款比可否评价商品更重要;
②超时设置:设置服务调用的超时时间,一旦超时后,通讯框架抛出异常,应用程序则根据服务调度策略选择重试or请求转移到其余服务器上;
③异步调用:经过消息队列等异步方式完成,避免一个服务失败致使整个应用请求失败的状况。
PS:不是全部服务均可以异步调用,对于获取用户信息这类调用,采用异步方式会延长响应时间,得不偿失。对于那些必须确认服务调用成功后才能继续进行下一步的操做的应用也不适合异步调用。有关具体使用消息队列实现异步调用的案例,请阅读个人博文:《使用Redis做为消息队列服务场景的应用案例》。
④服务降级:网站访问高峰期间,为了保证核心应用的正常运行,须要对服务降级。
降级有两种手段:一是拒绝服务,拒绝较低优先级的应用的调用,减小服务调用并发数,确保核心应用的正常运行;二是关闭功能,关闭部分不重要的服务,或者服务内部关闭部分不重要的功能,以节约系统开销,为核心应用服务让出资源;
⑤幂等性设计:保证服务重复调用和调用一次产生的结果相同;
对于大多数网站而言,数据是其最宝贵的物质资产。
保证数据高可用的主要手段有两种:一是数据备份,二是失效转移机制;
①数据备份:又分为冷备份和热备份,冷备份是按期复制,不能保证数据可用性。热备份又分为异步热备和同步热备,异步热备是指多份数据副本的写入操做异步完成,而同步方式则是指多份数据副本的写入操做同时完成。
关系数据库的热备机制就是一般所说的主从同步机制,实践中一般使用读写分离的方法来访问Master和Slave数据库,也就是说写操做只访问Master库,读操做均访问Slave库。
PS:在MS SQL Server中,能够经过发布订阅功能实现主从分离。关于发布订阅,能够参考MSDN的这篇文章:http://technet.microsoft.com/zh-cn/ff806143.aspx
②失效转移:若数据服务器集群中任何一台服务器宕机,那么应用程序针对这台服务器的全部读写操做都要从新路由到其余服务器,保证数据访问不会失败。
CAP解释
一个提升服务的存储系统没法同时知足如下三个条件 一致性(Consistency) ,数据可用性(Avalibility) 分区耐受性(Patition Tolerance,系统具备跨网络分区的伸缩性)。WEB架构设计中,一般为了保证高可用性,会牺牲一致性;数据一致性分为:强一致、用户一致、最终一致;
用户一致性
即数据在物理存储中的各个副本的数据可能不是一致的,可是终端用户访问时,经过纠错和校验机制,能够肯定一个一致的且正确的数据返回给用户。通常采用用户一致性,保证最终用户看到的结果一致。
失效转移过程
①网站发布:在柔性的发布过程当中,每次关闭的服务都是集群中的一小部分,并在发布完成后当即能够访问;
②自动化测试:使用自动测试工具或脚本完成测试;
③预发布验证:引入预发布服务器,与正式服务器几乎一致,只是没有配置在负载均衡服务器上,外部用户没法访问;
④代码控制:目前大多数网站采用SVN,分支开发,主干发布模式;另外,目前开源社区普遍采用Git做为版本控制工具,正逐步取代SVN的地位;
主干开发,分支发布。
代码在主干上开发,须要发布是在主干上拉各分支,该分支即成为一个发布版本,若是该版本有Bug,继续在该分支上修改发布,并将修改合并(merge)回主干,直到下次主干发布。
分支开发,主干发布
修改不得在主干上进行,须要开发一个新功能或者是修改一个bug时,从主干拉一个分支进行开发,开发完成且测试经过合并到主干。
目前大型网站主要使用分支开发,主干发布
在网站应用中强调的一个处理错误的理念是快速失败(Fase failed)。
"不容许没有监控的系统上线"
(1)监控数据采集
①用户行为日志收集:服务器端的日志收集和客户端的日志收集;目前许多网站逐步开发基于实时计算框架Storm的日志统计与分析工具;
②服务器性能监控:收集服务器性能指标,如系统Load、内存占用、磁盘IO等,及时判断,防患于未然;目前网站使用比较普遍的性能监控工具Ganglia,支持大规模服务器集群,并支持以图形的方式在浏览器展现性能曲线
③运行数据报告:采集并报告,汇总后统一显示,应用程序须要在代码中处理运行数据采集的逻辑;
(2)监控管理
①系统报警:配置报警阀值和值守人员联系方式,系统发生报警时,即便工程师在千里以外,也能够被及时通知;
②失效转移:监控系统在发现故障时,主动通知应用进行失效转移;
③自动优雅降级:为了应付网站访问高峰,主动关闭部分功能,释放部分系统资源,保证核心应用服务的正常运行;—>网站柔性架构的理想状态
(1)李智慧,《大型网站技术架构-核心原理与案例分析》,http://item.jd.com/11322972.html