大并发服务器所遇问题和简单应对框架思路

Posted 清水寺扫地僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大并发服务器所遇问题和简单应对框架思路相关的知识,希望对你有一定的参考价值。



服务器设计目标

  • 高性能(High Performance, HP);
  • 高可用(High Availability, HA);
  • 伸缩性(Scalability);

分布式设计问题

  • 负载均衡;
  • 分布式存储;
  • 分布式计算;

服务器性能瓶颈问题

场景应对
数据拷贝造成高IO使用率,使用缓存来缓解
环境切换进程/线程的上下文切换会占用较多机器周期,所以创建线程并不是一味的好,即理性创建线程:
①单核服务器:采用有限状态机效率最佳;
②多核服务器:多线程能够充分发挥效能和性能;
内存分配使用内存池,作为统一的内存资源管理
锁竞争如何减少因为锁造成的等待和空耗,如何避免死锁和锁的竞争


大并发服务器设计和迭代更新思路


大并发服务器设计


大型网站架构演变过程、迭代更新思路

  • Step1Web(e.g. HTTP) Server 和 Application(e.g. DataBase) Server 分离
    若是只有一个服务器,前后端部署在一个服务器上,一损俱损,分离开以保证高可用性(HA);
  • Step2
    ① Web动静资源分离:
    静态资源(html,js,css,img等磁盘文件),静态请求由前端服务器进行响应(HTTP Server, e.g. Apache/nginx/…);
    动态资源(jsp,php等可执行文件或业务操作),动态请求由后端服务器进行响应(Application Server,e.g. JBoss/Tomcat/…);
    ② 缓存处理(可缓存位置):
    (1) 客户端(Browser)缓存,减少对网站的访问;
    (2) 前端页面缓存(Front Page Cache),减少对Web应用服务器的请求;
    (3) 页面片段缓存(Edge Side Includes,ESI),对于动态页面中的非动态内容也可做缓存,降低请求的工作量;
    (4) 本地数据缓存,对数据库数据进行,减少Web Server对数据库的查询;
  • Step3Web Server集群 + 读写分离:
    (1) 前端增加Web服务器,添加Load Balance机制(e.g. Task Server);
    (2) 前端承压趋缓,后端承压,则将后端服务器(e.g. DB)进行读写分离(replication机制,主从数据库,同时主数据库复制更新同步从数据库),同时对于后端服务器的访问需要添加DAL层;
  • Step4CDN(Content Distribution Net)、分布式缓存、分库分表:
    (1) 内容分发使得不同地区的访问请求都可以就近进行接受,提高用户体验,同时支持运营商不同模式地记录;
    (2) 分布式缓存使得所有缓存服务器上的数据均可以共享,提高缓存查询效率,目前流行的分布式缓存方案有:memcached、membase、redis等,基本上当前的NoSQL方案都可以用来做分布式缓存方案;
    (3) 随着业务的发展,对于数据库表会变得很大,这时对DB Server进行分库分表,一般采用水平分区的方式,提高数据库查询速度;
  • Step5多数据中心 + 分布式存储与计算:
    NoSQL并发性较高且成本较SQL低廉许多,对于对一致性要求不高的数据均可使用NoSQL进行存储;而SQL对数据一致性保持较好,专注于事务性的操作,但是同样也会遇到锁、大表join等问题影响DB的性能;
    分布式存储,要有专用的文件系统,以保证文件的快速索引和对存储的充分有效利用(专用小文件系统,大文件索引系统等),商用数据库内部也会有专用文件系统的存在,同时也有相应兼容分布式文件系统的分布式计算框架,如下:

通过以上步骤,有以下大型网站架构示意图:

对于上图中客服服务器可能不是扁平的,而是层次化的,各种专用业务,有一集群提供相应服务;在数据中心中会有NoSQL数据库,进行 部分查询业务的响应,减轻SQL DB的压力。



负载均衡(Load Balance)方式一览

负载均衡位置方法
前端负载均衡DNS负载均衡
在DNS服务器中,可以为多个不同的地址配置同一个名字,对于不同的客户机访问同一个名字,得到不同的地址;

反向代理:使用代理服务器将请求发给内部服务器,让代理服务器将请求均匀转发给多台内部Web服务器之一,从而达到负载均衡的目的。(标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用代理访问内部Web服务器,因此被称为反向代理模式);

基于NAT的负载均衡 NAT(Network Address Translation)协议,可以使内部LAN IP访问外部数据(应用层协议);

LVS:一种负载均衡开源软件;

F5硬件负载均衡:价格高昂;
应用服务器负载均衡加设任务服务器(task server),记录各客户服务器负载情况
(1) 应用服务器被动领取任务:任务服务器依据各应用服务器的负载来给负载较低的应用服务器分发任务;
(2) 应用服务器主动领取任务:应用服务器觉得自己可承载更多的负载,则主动向任务服务器申请。但对于专用客户服务器而言不是很友好;
(3) 一般会有backup for failover的冗余备份任务服务器,通过心跳进行通信,保证HA;
数据库负载均衡Replication机制:主从扩展(伸缩性),读写分离;

分库分表
垂直分区(分库):按照业务表类进行分库分页;
水平分区(分表):将整个表进行水平切割,每个库表对各种业务均有,是显示中的常用机制
垂直分区(分库)
水平分区(分表)
分库分表的存在需要搭配DAL进行查找和索引,常见使用hash索引,对库表的访问设计提出了新的要求。

以上是关于大并发服务器所遇问题和简单应对框架思路的主要内容,如果未能解决你的问题,请参考以下文章

大并发服务器框架设计

Nginx高并发配置思路(轻松应对1万并发量)

Nginx高并发配置思路(轻松应对1万并发量)

Nginx高并发配置思路(轻松应对1万并发量)

php 高并发解决思路解决方案

高并发场景以及应对技巧