server的三条要求:

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

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

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

另外不论什么网络系统结构都能够抽象成C/S架构。我们常说的B/S模式本质上也是C/S架构(浏览器看作client)。

一个典型的server架构:

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

因为server须要高效处理大并发连接。因此多个位置均可能出现性能瓶颈,以下我们分析不同位置产生瓶颈的原因及其处理方法:

(一)数据库瓶颈

【1】超过数据库的连接数的解决方法:加上一层DAL。使用队列等待(队列等待--数据訪问层)。也能够再使用连接池(DAL队列服务+连接池)这样不须要又一次连接。直接从池中找资源。

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

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

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

1. 缓存的时效性。if timeout then 又一次去数据库查询。(将热点数据放至缓存)这样的方法实时性较差。

2. 一旦数据库更新,马上通知前端缓存更新。

Update之后改动更新缓存,实时性较好。可能实现起来较难。

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

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

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

还有Redis 。memached 缓存等分布式开源软件。这些软件是能够跨server的。可是假设部署在应用server上,则是局部的,其它同级server訪问非常麻烦。

可是假设单独布置机器,使用分布式缓存,这些就是全局的。全部的应用server都能够訪问。方便快捷。

【3】数据库读写分离

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

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

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

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

(二)应用server瓶颈

加入任务server相应用server的任务分配进行负载均衡,当中又分为主动和被动两种方案:

(1)应用server被动接受方案:

使用任务server实现负载均衡,暴露一个接口,任务server能够当作一个client,应用server看作httpserver

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

(2)应用server主动到任务server接受任务进行处理

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

(1)的方式可能会造成不公平。(2)的缺点是假设应用server处理不同的业务。那么可能任务server的编程逻辑会非常复杂。

当中任务server能够设置多台。彼此之间通过心跳联系------>满足 高可用性(fail over机制)。

如此一来(数据库,缓存,应用server,任务server)不论什么位置出现瓶颈就仅仅须要添加server好了。

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

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

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

多线程可以充分发挥多核server的性能,也要注意线程间切换的开销

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

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

以上的信息能够归纳为以下的这张图:

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

[Step1]web server与数据库分离

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Apache/Nginx处理静态(前端server)  JBoss/Tomat处理动态 (后端server)

[Step2]缓存处理

1.浏览器缓存降低对站点的訪问

2.前端server静态页面缓存降低对webserver的请求

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

4.本地缓存降低对数据库的查询

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

负载均衡:
前端负载均衡
DNS负载均衡
在DNSserver中,能够为多个不同的地址配置同一个名字,对于不同的客户机訪问同一个名字,得到不同的地址。

反向代理
使用代理server将请求发给内部server,让代理server将请求均匀转发给多台内部webserver之中的一个。从而达到负载均衡的目的。标准代理方式是客户使用代理訪问多个外部Webserver。而这样的代理方式是多个客户使用它訪问内部Webserver。因此也被称为反向代理模式。

基于NAT的负载均衡技术
LVS
F5硬件负载均衡
应用server负载均衡

数据库负载均衡

[Step4]CDN、分布式缓存、分库分表

眼下流行分布式缓存方案:memcached、membase、redis等,基本上当前的NoSQL方案都能够用来做分布式缓存方案

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

Map/Reduce:

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

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

大并发server架构 && 大型站点架构演变的更多相关文章

  1. .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)

    阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...

  2. 大型站点图片server架构的演进

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/dinglang_2009/article/details/31450731 在主流的Web站点中,图 ...

  3. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括wap站点.手机app站点. 一.现有公司技术人员现状: 1.熟悉asp ...

  4. 设计高性能大并发WEB系统架构注意点

    设计高性能大并发WEB系统架构注意点 第01:大型架构的演进之路第02(上):分布式缓存第02(下):分布式缓存第03:分布式消息队列第04:分布式数据存储第05:分布式服务框架第06:高性能系统架构 ...

  5. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

  6. Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战

    视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...

  7. 大型站点技术架构PDF阅读笔记(一):

    1.数据库读写分离: 2.系统吞吐量和系统并发数以及系统响应时间之间的关系: 3.系统负载的概念: 4.反向代理的概念: 5.使用缓存来读取数据: 6.利用cookie来记录session: 利用co ...

  8. Drupal与大型网站架构(译)- Large-Scale Web Site Infrastructure and Drupal

    Drupal与大型网站架构(译)- Large-Scale Web Site Infrastructure and Drupal Linuxjournal 网站经典文章翻译,原文地址: Large-S ...

  9. 从100PV到1亿级PV站点架构演变

    假设你对项目管理.系统架构有兴趣,请加微信订阅号"softjg".增加这个PM.架构师的大家庭 一个站点就像一个人,存在一个从小到大的过程. 养一个站点和养一个人一样.不同一时候期 ...

随机推荐

  1. HDU 1011 Starship Troopers【树形DP/有依赖的01背包】

    You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...

  2. 牛刀小试之Django二

    model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  3. Flask实战第55天:cms轮播图上传到七牛功能完成

    登录七牛云,进入“对象存储”, 新建存储空间(Bucket), 我创建的空间命名为flask-bbs 创建完Bucket,七牛会给我们提供一个测试域名,生产环境中,我们需要绑定自己的域名 在个人面板中 ...

  4. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  5. AGC 022 C - Remainder Game

    题面在这里! 显然权值是 2^i 这种的话就是要你贪心,高位能不选就不选. 并且如果 % x 之后再去 % 一个>=x的数是没有用的,所以我们可以把操作的k看成单调递减序列. 这样的话就是一个有 ...

  6. BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...

  7. 【找规律】计蒜客17118 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow

    题意:一张有n个点的图,结点被编号为0~n-1,i往所有编号比它大的点j连边,权值为i xor j.给你n,问你最大流. 打个表,别忘了把相邻两项的差打出来,你会发现神奇的规律……你会发现每个答案都是 ...

  8. 【贪心】AtCoder Regular Contest 079 E - Decrease (Judge ver.)

    每次将最大的数减到n以下,如此循环直到符合题意. 复杂度大概是n*n*log?(?). #include<cstdio> #include<iostream> #include ...

  9. 【计算几何】【分类讨论】Gym - 101173C - Convex Contour

    注意等边三角形的上顶点是卡不到边界上的. 于是整个凸包分成三部分:左边的连续的三角形.中间的.右边的连续的三角形. 套个计算几何板子求个三角形顶点到圆的切线.三角形顶点到正方形左上角距离啥的就行了,分 ...

  10. Spring的Bean生命周期理解

    首先,在经历过很多次的面试之后,一直不能很好的叙述关于springbean的生命周期这个概念.今日对于springBean的生命周期进行一个总结. 一.springBean的生命周期: 如下图所示: ...