网站的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。
实现上述高可用架构的主要手段是数据和服务的冗余备份及失效转移。
典型的分层模型是三层,即应用层、服务层、数据层;各层之间具有相对独立性,应用层主要负责具体页面逻辑处理;服务层负责提供可复用的服务;数据层负责数据的存储于访问。中小型网站在具体部署时,通常将应用层和服务层部署在一起,而数据层则另外部署。
在复杂的大型网站架构中,划分的粒度会更小、更详细,结构更加复杂,服务器规模更加庞大,但通常还是能够把这些服务划分到这三层中。
高可用的应用
应用层主要处理网站应用的业务逻辑,因此有时也称作为业务逻辑层,应用的一个显著特点是应用的无状态性。
- 通过负载均衡进行无状态服务的失效转移
负载均衡,顾名思义,主要使用在业务量和数据量较高的情况下,当单台服务器不足以承担所有的负载压力时,通过负载均衡手段,将流量和数据分摊到一个集群组成的多台服务器上,以提高整体的负载处理能力。
目前,不管是开源免费的负载均衡软件还是昂贵的负载均衡硬件,都提供失效转移功能。
- 应用服务器集群的Session管理
应用服务器的高可用架构设计主要基于服务无状态这一特性,但是事实上,业务总是有状态的。
web应用中将这些多次请求修改使用的上下文对象称作会话(Session),单机情况下,Session可由部署在服务器上的Web容器管理。在使用负载均衡的集群环境中,由于负载均衡服务器可能会将请求分发到集群任何一台应用服务器上,所以保证每次请求依然能够获得正确的Session比单机时要复杂很多。
集群环境下,Session管理主要有以下几种手段。
- Session复制:方案简单,从本机读取session信息也很快速,但只能使用在集群规模比较小的情况下。当集群规模较大时,集群服务器间需要大量的通信进行Session复制,占用服务器和网络的大量资源,系统不堪重负。
- Session绑定:可以利用负载均衡的源地址Hash算法实现,负载均衡服务器总是将来源于同一ip的请求分发到同一台服务器上(也可以更具Cookie信息将同一个用户的请求总是分发到同一台服务器上,当然这是负载均衡服务器必须工作在http层上)。但是session绑定的方案显然不符合我们队系统高可用的需求,因为一旦某台服务器宕机,那么该机器的session就不复存在了,用户请求切换到其他机器后因为没有session而无法完成业务处理。
- 利用Cookie记录session:可以利用浏览器支持的Cookie记录session,但是有一些缺点,比如受Cookie大小限制,能记录的信息有限,每次请求响应都需要传输cookie;如果关闭cookie,访问就会不正常。
- Session服务器:利用独立部署的Session服务器(集群)统一管理Session,应用服务器每次读写Session时,都访问Session服务器。这种解决方案实际上是将应用服务器的状态分离,分为无状态的应用服务器和有状态的Session服务器,然后针对这两种服务器的不同恶性分别设计其架构。
高可用的服务
可复用的服务模块为业务产品提供公共服务,大型网站中这些服务通常都独立分布式部署,被具体应用远程调用。可复用的服务和应用一样,也是无状态的服务,因此可以使用类似负载均衡的失效转移策略实现高可用的服务。
除此之外,具体实践中,还有以下几点高可用的服务策略。
- 分级管理
运维上将服务器进行分机管理,核心应用和服务有限使用更好的硬件,在运维响应速度上爷格外迅速。显然,用户及时付款购物比能不能评价商品更重要,所以订单、支付服务比评价服务有更高优先级。同事在服务部署上也进行必要的隔离,避免故障的连锁反应。
- 超时设置
在应用程序中设置服务调用的超时时间,一旦超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择继续重试或者将请求转移到提供相同服务的其他服务器上
- 异步调用
应用对服务的调用通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败的情况。
当然不是多有服务调用都可以异步调用,对于获取用户信息这类调用,采用异步方式会延长响应时间,得不偿失。对于那些必须确认服务调用成功才能继续下一步操作的应用也不合适使用异步调用。
- 服务降级
降级有两种手段:拒绝服务及关闭服务
- 幂等性设计
有些服务天然具有幂等性,比如讲用户性别设置为男性,不管设置多少次,结果都一样。但是对转账交易等操作,问题就会比较复杂,需要通过交易编号等信息进行服务调用有效性校验,只有有效的操作才能继续执行。
(注:幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的. 声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试.)
高可用的数据
保证数据存储高可用的手段主要是数据备份和失效转移机智。
网站运行监控
“不允许没有监控的系统上线“,这是许多网站架构师在做项目上线评审时常说的一句话。网站运行监控对于网站运维和架构设计优化至关重要,运维没有监控的网站,犹如驾驶没有仪表的飞机。盲人骑瞎马,夜班临深渊而不知,生死尚且未卜,提高可用性、减少故障率就更无从做起了。
- 监控数据采集:用户行为日志收集;服务器性能监控;运行数据报告;
- 监控管理:系统报警;失效转移;自动优雅降级;
作者:u013256816 发表于2016/2/20 16:00:38
原文链接