大并发服务器架构 && 大型网站架构演变

yqhao 8年前

来自: http://blog.csdn.net/nk_test/article/details/50611000


服务器的三条要求:

高性能:对于大量请求,及时快速的响应

高可用:7*24 不间断,出现故障自动转移,这叫fail over(故障转移)

伸缩性:使用跨机器的通信(TCP

另外任何网络系统结构都可以抽象成C/S架构,我们常说的B/S模式本质上也是C/S架构(浏览器看作客户端)。

一个典型的服务器架构:


注: epoll是linux下最高效的网络I/O

由于服务器需要高效处理大并发连接,因此多个位置均可能出现性能瓶颈,下面我们分析不同位置产生瓶颈的原因及其处理方法:

(一)数据库瓶颈

【1】超过数据库的连接数的解决方法:加上一层DAL,使用队列等待(队列等待--数据访问层),也可以再使用连接池DAL队列服务+连接池)这样不需要重新连接,直接从池中找资源。

【2】超出时限的解决方法:

1)将业务逻辑放置应用服务器(操作系统业务处理),数据库逻辑不要太复杂,只是进行一定的辅助业务处理。

(2)缓存数据,但是面临缓存的更新和同步的问题,如下:

1. 缓存的时效性,if timeout then 重新去数据库查询,(将热点数据放至缓存)这种方法实时性较差。

2. 一旦数据库更新,立即通知前端缓存更新。Update之后修改更新缓存,实时性较好。可能实现起来较难。

如果内存不够用,那么就放到外部磁盘,使用缓存换页机制(类似OS中的内存换页)。

上面提到的这些都可以使用开源产品实现:Nosql ---> (反sql 

主要存放非关系的数据,key/value

还有Redis memached 缓存等分布式开源软件。这些软件是可以跨服务器的,但是如果部署在应用服务器上,则是局部的,其他同级服务器访问很麻烦。

但是如果单独布置机器,使用分布式缓存,这些就是全局的,所有的应用服务器都可以访问,方便快捷。

【3】数据库读写分离

 数据库的查询操作一般比写操作频繁,我们可以对数据库进行负载均衡,使用主服务器进行写操作,从服务器进行读操作,DAL进行读写分离,通过replication机制进行主从服务器间的同步。

【4】数据分区(分库、分表)

 分库:数据库可以按照一定的逻辑把表分散到不同的数据库--->垂直分区(用户表,业务表)

 更加常用的分表--水平分区:将表中的记录分至不同的数据库,10条记录分至10个数据库,类似这样,这种方式很容易扩展水平结构。

(二)应用服务器瓶颈

添加任务服务器对应用服务器的任务分配进行负载均衡,其中又分为主动和被动两种方案:

(1)应用服务器被动接受方案:

使用任务服务器实现负载均衡,暴露一个接口,任务服务器可以当作一个客户端,应用服务器看作http服务器

任务服务器可以监视应用服务器的负载,CPU/IO/并发/内存换页高,查询到信息后,选取负载最低(算法确定)的服务器来分配任务.

2应用服务器主动到任务服务器接受任务进行处理

应用服务器处理完自己的任务后主动向任务服务器申请求任务。

(1)的方式可能会造成不公平,(2)的缺点是如果应用服务器处理不同的业务,那么可能任务服务器的编程逻辑会很复杂。

 其中任务服务器可以设置多台,彼此之间通过心跳联系------>满足 高可用性(fail over机制)。

如此一来(数据库,缓存,应用服务器,任务服务器)任何位置出现瓶颈就只需要增加服务器好了。

为了高效的进行服务端的编程,我们也需要知道服务器性能四大杀手:

(1)数据拷贝 ----> 缓存来解决

(2)环境切换 -----> 理性创建线程:是否需要多线程,哪个好?单核服务器(采用状态机的编程效率最佳,类似OS中的进程切换)

多线程能够充分发挥多核服务器的性能,也要注意线程间切换的开销

(3)内存分配 ------> 内存池,减少向操作系统申请内存

(4)锁竞争 -------> 通过逻辑尽量减少锁的使用

以上的信息可以归纳为下面的这张图:


我们接下来介绍实际中的大型网站架构的演变过程,和我们上面的问题处理流程基本一致:

[Step1]web server与数据库分离



Apache/Nginx处理静态(前端服务器)  JBoss/Tomat处理动态 (后端服务器)

[Step2]缓存处理


1.浏览器缓存减少对网站的访问

2.前端服务器静态页面缓存减少对web服务器的请求

3.动态中相对静态的部分使用ESI

4.本地缓存减少对数据库的查询

[Step3]web server集群+读写分离


负载均衡:
前端负载均衡
DNS负载均衡
在DNS服务器中,可以为多个不同的地址配置同一个名字,对于不同的客户机访问同一个名字,得到不同的地址。
反向代理
使用代理服务器将请求发给内部服务器,让代理服务器将请求均匀转发给多台内部web服务器之一,从而达到负载均衡的目的。标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。
基于NAT的负载均衡技术
LVS
F5硬件负载均衡
应用服务器负载均衡
数据库负载均衡
[Step4]CDN、分布式缓存、分库分表


目前流行分布式缓存方案:memcached、membase、redis等,基本上当前的NoSQL方案都可以用来做分布式缓存方案

[Step5]多数据中心+分布式存储与计算


技术点:分布式文件系统(DFS


Map/Reduce: 

文件太大,无法加载至内存,分割得到key-value数据,这个是map过程(多个机器完成)

将其合并的过程称为reduce。Map-->combine-->reduce,这就是所谓的分布式计算。