大并发服务器架构 && 大型网站架构演变
来自: 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的负载均衡技术LVSF5硬件负载均衡
数据库负载均衡
目前流行分布式缓存方案:memcached、membase、redis等,基本上当前的NoSQL方案都可以用来做分布式缓存方案
[Step5]多数据中心+分布式存储与计算
技术点:分布式文件系统(DFS)
Map/Reduce:
文件太大,无法加载至内存,分割得到key-value数据,这个是map过程(多个机器完成)
将其合并的过程称为reduce。Map-->combine-->reduce,这就是所谓的分布式计算。