在企业中为了保障可用性,对于硬件的机器选择要求都会比较高,并且对与软件来说硬件的故障是常态,并且也不是好解决的,所以想要打造一个高可用的架构就要从软件层下功夫。保障网站的可靠性就是需要保障在硬件故障的时候网站还是可用的。
所以实现网站可用性的手段是数据和服务的冗余和失效转移,一旦某些服务宕机,可以快速的将请求转移到其他的服务上,如果磁盘损坏,则从备份的磁盘上读取数据。
网站的架构模式按照以下模型分层,对于不同的分层模型的用处是不一样的,那么对于高可用的要求和手段也是不一样的
应用层主要是负责业务的处理,服务层负责提供可复用的服务,数据层负责数据的储存和访问。
位于应用层的服务一般为了高并发,会通过负载均衡设备将一组服务器组成一个集群共同对外提供服务。当负载均衡设备通过心跳检测监控到某一服务不可用后,会将剔除集群,并将请求分发到其他服务器上保证高可用。
服务层与应用层大致相同,只是服务层是负载均衡后的应用层调用的,并通过服务注册中心对提供服务的服务器进行心跳检测,发现有服务不可用,立即通知客户端程序修改服务访问列表。剔除不可用服务。
位于数据层的服务比较特殊,数据服务上存储着数据,为了保证服务数据不丢失,数据访问不中断,需要在数据写入的时候进行数据同步复制,将数据写入多台服务器,实现数据冗余备份。当数据服务宕机时,应用程序将访问切换到有备份数据的服务器上。
应用层主要负责处理网站应用的逻辑处理,应用的一个明显的特征就是无状态行。无状态指的是应用服务不保存业务的上下文。多个服务器是完全对等的,请求放在那个服务器上请求结果都是对等的。
既然服务是无状态的,那么当任意一个主机宕机是,请求转移到集群中的任意一个可用的服务处理,这样结果是正确的。整个集群还是可用的。
负载均衡顾名思义,主要是在业务量和数据量较高的情况下,一台机器无法处理的时候,通过将服务器部署成一个集群来分摊请求和数据量。来提高整体的处理能力。目前的负载均衡服务都提供失效转移功能。
当Web服务器集群中的服务器都可用的时候,负载均衡服务器会通过策略将服务分到到服务器上,当服务器10.0.0.1宕机是,负载均衡服务器通过心跳检测机制发现服务不可用时就会把它剔除调,让其他的服务器去处理请求返回结果
由于负载均衡在应用层可以实现高可用,所有建议网站的应用服务器至少两个,实现负载均衡。
web请求中将多次请求修改使用的上下文称为会话,就是用来记录用户的信息,在单机情况下可以服务在服务器上的web容器来记录,但是在集群环境下就需要一个Session服务器来管理。
这种解决方案是将应用服务器的状态剥离,分为有状态的session服务器和无状态的session服务器。
对于有状态的session服务器,一种简单的方法是分布式缓存或者数据库等。
可复用的服务模块为业务模块提供基础公共服务,大型网站中这些服务通常都独立分布式部署,被具体服务远程调用,和应用层一样也是无状态的,除了也需要负载均衡提供高可用外,还需要提供一些其他的规则。
运维上将服务分级管理,对于重要的,请求量多的服务优先使用更好的硬件,同时在服务部署上也做到隔离,避免连锁的故障响应。
由于服务宕机或者死锁等原因,可能导致应用程序对服务端的调用失去响应,进而导致用户长时间的得不到响应,同时还占用资源,不利于即时将访问转移到正常的服务器上。
应用调用服务异步调用,避免一个服务失败导致整个应用请求失败的情况,如注册用户分为3步,将用户信息写入数据库,发送邮件,开通权限。这个就可以采用异步的方式去调用发送邮件服务,这样发送邮件失败并不会影响到用户注册的结果。
当然,也不是所有的流程的适合用异步的方式,对于获取用户信息的场景异步服务会延长处理时间,得不偿失。对于那些必须判断成功才能下一步的流程也不适合使用异步。
在网站高峰期,服务可能由于大量的并发调用导致性能下降,最后引起服务不可用,为了保证网络和核心流程可用,需要服务降级,服务降级有两个手段:拒绝服务和关闭服务。
拒绝服务:拒绝低优先级的服务,减少服务并发数或者随机拒绝部分请求。
服务关闭:关闭不重要服务或者服务内部关闭部分不重要功能。
应用调用服务失败后,会将请求重新转发到其他服务上,这个时候要进行幂等性的判断,有可能服务调用失败是网络问题导致的,实际上业务处理成功了。
对于网站而言,数据是最宝贵的资产。不同于应用的高可用,由于数据存储服务器上的数据不同,当某台服务宕机的时候,数据访问请求不能任意切换到集群其他机器上。
保证数据存储高可用手段主要是冗余备份和失效转移机制。数据备份是保证数据有多副本,任意副本的失效都不会导致数据的永久丢失。从而实现数据完全的持久化。而失效转移机制是保证当一个数据副本不可访问时,可以快速切换访问数据的其他副本。保证数据可用。
数据备份可以分为冷备份和热备份。冷备份就是传统的数据拷贝,优点是简单和低廉,缺点是数据的时效性不行,容易丢失数据,也不能保证数据的可用性,冷备份回复时间也比较长。
因此冷备份在企业中也会用,但是只是一个保底手段,还有与热备份同时使用。
热备份又可分为两种:异步热备份和同步热备份
异步热备份是指多份数据副本的写入操作异步完成,应用程序在收到数据服务写成功的时候只收到一份,存储系统会异步的写其他副本
异步备份写入中,存储服务器分为主存储服务器和从存储服务器,应用程序正常的时候只连接主服务器,数据写入的时候有主存储的写操作代理模块将数据写入后立即返回,然后再异步的写入其他服务器
同步热备份就是多份数据副本的写入操作同步完成,应用程序在收到数据服务写成功的时候多分副本都响应成功了,但当应用程序响应失败的时候,可以有部分副本写入成功部分写入失败。
同步热备份具体实现时会开多个线程同步写,在都写完之后在返回结果。
这种情况下没有主从之分,完全对等,更便于维护和理解。
如数据服务器集群上任意服务宕机,那么应用服务器针对这台服务器所有的读写操作都需要重新路由到其他服务器,保证数据访问不会失败。
失效转移分为三个步骤:失效确认,访问转移,数据恢复
判断服务宕机是系统确认服务宕机的第一步,主要手段有心跳检测和应用程序访问失效报告
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2J6uQzG-1662298123102)(evernotecid://DED20B32-7319-43F6-995F-0BB020671E91/appyinxiangcom/22603206/ENResource/p916)]
确认某台服务宕机后,就需要将数据读写访问重新路由到其他服务上,对于对等存储的服务器器,当其中一台宕机后,应用程序根据配置直接切换到对等服务器上,如果存储不对等,那么久需要重新计算路由。选择存储服务器。
由于某台服务器宕机,所以副本数就会减少,必须将副本数恢复到设定的值。