高可用简介

初始阶段的网站架构

小型网站应用程序、数据库、文件等资源都在一台服务器上。随着业务发展,越来越多的数据导致存储空间不足,越来越多用户访问导致性能越来越差,这时就需要进行分离。应用和数据分离后整个网站使用三台服务器,应用服务器,文件服务器和数据库服务器。这三台服务器都硬件要求不同,应用服务器需要处理大量的业务逻辑,因此需要更快更强大的CPU。数据库服务器需要快速磁盘检索和数据缓存,因此需要更大的硬盘和更大的内存。文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘。

使用缓存

网络访问特点遵循28定律,80%的访问集中在20%的数据上,百度搜索的前排数据,淘宝评价良好的商品等。那么可以对将小部分数据缓存在内存中。
缓存可以分为两种,缓存在应用服务器上的缓存和专门分布式缓存服务器上的远程缓存。本地缓存访问速度快,但是数量有限,会出现和应用程序争用内存的情况。使用缓存后,数据访问得到有效缓解。但是单一应用服务器能够处理的请求连接有限,在高峰时,应用服务器称为网站瓶颈。

使用应用服务器集群

当一台服务器的处理能力、存储空间不足时,不要去换更强的服务器,更恰当的方法是加一台服务器。
通过负载均衡调度服务器,可以将来自用户的访问请求分发到应用服务器集群中的任何一台服务器上。

数据库读写分离

当使用缓存之后,大部分读操作可以不通过数据库完成,但是当缓存不命中,缓存过期的时候和全部写的操作需要访问数据库。
目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库的主从关系,可以将一台服务器的数据更新同步到另一台服务器上。这样就可以实现读写分离,在写数据的时候,访问主数据库,主数据库将数据复制到从数据库。在读数据的时候,访问从数据库。

分布式数据库

分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。更常用的手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。

分布式

分布式意味着服务调用必须经过网络,一台服务器宕机可能引起下游服务不可访问。数据在分布式服务器中保持一致性也是一个难题。
网站的静态资源,如js/css/图片等资源采用独立的域名(如g.xxcdn)独立部署,减轻应用服务器压力。

异步

软件的一个重要目标是降低耦合,解耦合的一个重要方法是异步。业务之间的消息不通过同步调用,而是将一个业务操作分成多个阶段,每个阶段通过共享数据的方式进行协作。
单一服务器上可通过多线程共享内存队列的方式实现异步,处在业务操作前面的线程将输出写入到队列,后面的线程从队列中读取数据进行处理。在分布式系统中,多个服务器通过分布式消息队列实现异步。
异步结构是典型的生产者和消费者模式,两者不存在直接调用,只要对接的数据结构不变,彼此的功能可以随意变化。
拿微博来说,如果发微博采用同步推的模式,用户发微博之后会立即插入数据库粉丝的订阅,会超出数据库负载,也会导致响应变慢。如果采用异步推拉的方式,用户发微博之后,将微博写入消息队列之后立即返回,响应迅速。消息队列消费者任务将这条微博推送给所有粉丝的订阅列表中,非在线用户登录后再根据关注列表拉取微博订阅列表。
消息队列通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。在电商中,也可以使用消息队列来抵御订单对系统的冲击。

入口层

高可用的定义是7 *24小时可用。
我们通常会将服务定位在一个IP,如果这个IP对应的服务器当机了,那么用户的访问肯定会中断。例如,机器A 的IP是 1.2.3.4,机器 B 的 IP 是 1.2.3.5, 那么再申请一个 IP 1.2.3.6(称为⼼跳IP), 平时绑定在机器A上,如果A当机,IP会自动绑定在机器B上;如果B当机,IP会自动绑定在机器A上。对于这种形式,我们将DNS绑定到心跳IP上,即可实现入口层的高可用。
但这个方案有一点小问题。第一,它的切换可能会有一到两秒的中断,也就是说,如果不是要求到非常严格的毫秒级就不会有问题。第二,对入口的机器会有些浪费,因为买了两台机器的入口,可能就只有一台机器用上。

业务层

如何实现业务层的高可用呢?最核心的就是,业务层不要有状态,将状态分散到缓存层和数据库。目前大家通常喜欢将以下几种数据放入业务层

  • 第一个是session,即用户登录相关的数据,但好的做法是将session放在数据库里,或者一个比较稳定的缓存系统中。
  • 第二个是缓存,在访问数据库时,如果一个查询很慢,就希望将这些结果暂时放到进程里,下次再做查询时就不用再访问数据库了。这种做法带来的问题是,当业务层服务器不只一台时,数据很难做到一致,从缓存拿到的数据就可能是错误的。

一个简单的原则就是业务层不要有状态。

缓存层

缓存层做高可用一个简单的方法就是,将缓存层分得细一点儿。比如说,缓存层就一台机器的话,那么这台机器当了以后,所有应用层的压力就会往数据库里压,数据库扛不住的话,整个网站(或应用)就会随之当掉。而如果缓存层分在四台机器上的话,每台只有四分之一,这台机器当掉了以后,也只有总访问量的四分之一会压在数据库上面,数据库能扛住的话,网站就能很稳定地等到缓存层重新起来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值