网站
架构师
Web 服务器

常见的网站服务器架构有哪些?

关注者
4,458
被浏览
304,094

18 个回答

2013/04/18 更新

[只是大框架介绍,实际使用中的不容易注意的细节太多了,需要经验的积累,才能运用娴熟]

以下的架构都是在假设已经优化过linux内核的情况下进行

初级篇:(单机模式)

假设配置:(Dual core 2.0GHz,4GB ram,SSD)

基础框架:apache(PHP) + Mysql / IIS + MSSQL

(最基础框架,处理一般访问请求)

进阶1:替换Apache为Nginx,并在数据库前加上cache层【数据库的速度是最大的瓶颈

Nginx(PHP) + Memcache + Mysql

(此时已经具备处理小型访问量的能力)

进阶2:随着访问量的上涨,最先面临的问题就来了:CGI无法匹配上Nginx的高IO性能,这时候可以通过写扩展来替代脚本程序来提升性能,C扩展是个好办法,但是大家更喜欢用简单的脚本语言完成任务,Taobao团队开源了一个Nginx_lua模块,可以用lua写Nginx扩展,这时候可处理的并发已经超越进阶1 一个档次了。

Nginx(nginx_lua or C) + Memcache + Mysql

(此时处理个同时在线三四千人没有问题了)

进阶3:随着用户的增多,Mysql的写入速度成了又一大瓶颈,读取有memcache做缓存,但写入是直接面对Mysql,性能受到了很大阻碍,这时候,要在Nginx和Mysql中间加入一层写缓存,队列系统就出场了,就以RabbitMQ为例,所有写入操作全部丢到这只兔子的胃里面,然后屁股后面写个接应程序,一条条的拉出来再写入mysql。而RabbitMQ的写入效率是Mysql的N倍,此时架构的处理能力又上一阶层。

|----write------>RabbitMQ--------

Nginx(lua or c)----- |--------->Mysql

|----read------>Memcache--------

(此时的并发吞吐能力已经可以处理万人左右在线)


中级篇:(分而治之)

此时我们在单机优化上已经算是达到极限,接下来就要集群来显示作用了。

数据库篇: 数据库总是在整个环节中是吞吐能力最弱的,最常见的方法就是sharding。

sharding可以按多种方法来分,没有定式,看情况。可以按用户ID区段分,按读写分等等,可用参考软件:mysql proxy(工作原理类似lvs)

缓存篇:memcache一般采用的是构建memcache pool,将缓存分散到多台memcache节点上,如何将缓存数据均匀分散在各节点,一般采用将各节点顺序编号,然后hash取余对应到各个节点上去。这样可以做到比较均匀的分散,但是有一个致命点就是,如果节点数增加或减少,将会带来几乎80%的数据迁移,解决方案我们在高级篇再提。

WEB服务器篇: web服务器集群的建设,最常见的就是lvs方式(memcache pool同样可以如此组建),lvs的核心就是调度节点,调度节点负责将流量通过算法分散到各个节点上,因调度所耗资源很少,所以可以产生很高的吞吐率,后台节点数量可以任意增删,但此法弊病就是如果调度节点挂了,则整个集群都挂了,解决方案我们在高级篇提。

方法2:参见

HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer

高级篇:(高可用性+高可扩展性的集群)


单点调度故障解决:

集群的好处显而易见,但是有一个弊端就是单节点进行调度,如果节点出现故障,则整个集群全部都无法服务,对此的解决方案,我们使用keepalived来解决。

Keepalived for Linux

keepalived是基于VRRP协议(

VRRP协议介绍

)的,请一定先了解VRRP协议后再进行配置。

keepalived可以把多台设备虚拟出一个IP,并自动在故障节点与备用节点之间实现failover切换。这样我们配置两台货多台lvs调度节点,然后配置好keepalived就可以做到lvs调度节点出现故障后,自动切换到备用调度节点。(同样适用于mysql)

memcache集群扩展解决:

memcache因为我们一般采用的都是hash后除以节点数取余,然后分配到对应节点上,如果节点数出现变化,以前的缓存数据将基本都不能命中。

解决方法:consistent hashing 简介:

一致性哈希

consistent hashing大概的思路就是,把hash后的值保证在 0 ~ (2^32)-1 的数值上,然后把这一连串数字对应映射到一个想象的圆上。


把要存储的各个值hash后,放到圆上,如图

然后把cache节点也用同样的hash方法,映射到圆上,然后每个刚才hash过的value顺时针寻找离自己最近的节点,这个节点就是存储它的节点。

为了提高存储的平衡性,算法还可以加入虚拟节点的概念,即每个实际cache节点,会在圆上对应N个虚拟的节点,这样可以提高算法的命中率,更加平衡。

consistent hashing原理:

Consistent hashing and random trees


完结。

另:以上图片来自互联网,未找到原创者,故未标注来源。

欢迎署名转载。

编辑于 2014-05-07 14:44

系统架构演化历程-初始阶段架构


初始阶段 的小型系统 应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP

特征:
应用程序、数据库、文件等所有的资源都在一台服务器上。

描述:
通常服务器操作系统使用linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用Mysql,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了。

系统架构演化历程-应用服务和数据服务分离


好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver

特征:
应用程序、数据库、文件分别部署在独立的资源上。

描述:
数据量增加,单台服务器性能及存储空间不足,需要将应用和数据分离,并发处理能力和数据存储空间得到了很大改善。

系统架构演化历程-使用缓存改善性能


特征:
数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。

描述:
系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。
缓存分为本地缓存和远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。

系统架构演化历程-使用应用服务器集群


在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了,突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来 是请求数太高导致需要排队等待,响应速度变慢

特征:
多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。

描述:
使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。

系统架构演化历程-数据库读写分离


享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢

特征:
多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。

描述:
使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,使得服务器的负载压力不在成为整个系统的瓶颈。

系统架构演化历程-反向代理和CDN加速


特征:
采用CDN和反向代理加快系统的 访问速度。

描述:
为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。

系统架构演化历程-分布式文件系统和分布式数据库


随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作

特征:
数据库采用分布式数据库,文件系统采用分布式文件系统。

描述:
任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。
分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。

系统架构演化历程-使用NoSQL和搜索引擎


特征:
系统引入NoSQL数据库及搜索引擎。

描述:
随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。

系统架构演化历程-业务拆分


特征:
系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。

描述:
为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。

纵向拆分:
将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统

纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。

横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务

横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。


系统架构演化历程-分布式服务


特征:
公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。

描述:
随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。

编辑于 2014-10-30 17:06

可以看看这本书

book.douban.com/subject

大型网站技术架构

编辑于 2014-01-01 00:28

这个问题之宽泛已经跨越银河系了_(:з」∠)_

哥哥我只能从初级到高级一点点解释了~~~~

圈子里有一个伟人说过一句话:

亿万级的架构是逐步演化出来的,傻缺才会上来就直接照着亿万级的来搭(´ᴥ`) ...(没错这个伟人就是我),所以这里只是解释下不同量级下的架构形式,具体要看业务规模和体量。

补一个,中小型网站推荐的技术选型LAMP ( linux+apache+mysql+php )。

大型网站的架构技术则可以灵活选择。

新生儿:

最初的网站一般只是个demo,老板拿去给朋友们看看,恩,小伙子网站做的不错,给你加工资∠( ᐛ 」∠)_,这个时期资源成本和时间成本第一,一般程序,数据库,文件都放在一台服务器,如下图:

这个时期可以说不存在太多架构的概念,apache/ IIS + MYSQL/MSSQL + PHP/JAVA/NET 等选型都可以,具体看公司的技术合伙人的方向,技术合伙人来确定方案和选型即可。

1周岁:

度过了前期的磨合,业务量开始稳步上升之后就建议开始做分离的工作了,可以根据服务器的用途不同,选用不同的配置安排:

假设业务情况涉及到的文件会比较多,建议可以做多台文件服务器对文件进行储存,比如电商类的商品文描图片及主图,多域名,多服务器储存。

即便是业务初期,也建议至少有一台热备服务器,不需要太高的配置,实时对业务数据库进行备份即可。

2周岁:

一般到了这个阶段之后,为了减轻数据库压力防止锁死,以及提高访问速度,可以开始考虑对核心业务做分布式缓存处理了。

一般来讲,业务初期可以考虑使用一些成熟的缓存引擎,比如resin等,将搜索,商品详情,CMS等页面基于此做缓存处理。

另外就是现在CDN服务的费用目前来讲成本要比以往低很多了,所以这个阶段可以考虑购买CDN的服务了:

5周岁:

如果进入这个阶段,那么首先恭喜你,开始走上正轨了<( ̄▽ ̄)>

一般到了这个阶段,随着访问量逐渐增加,即便有缓存的存在,数据库仍旧会有很大的瓶颈,尤其是电商类网站高并发下单的场景,或者知乎这类一堆人给我点赞刷评论的情况(虽然并没有╮(╯_╰)╭,一般初步改善数据库压力的方案就是做读写分离,然后进一步的操作就是分库分表。

另外一点就是,考虑到业务量极大,为了防止出现线上事故影响服务,另外就是分担网站入口的请求,因此需要部署负载均衡服务器。因为网站是一辆需要一直跑的汽车,不能停车换轮,负载均衡的作用之一就是保证每次修轮胎的时候,车子仍然在跑:




------------------------------------------

啊...要忙了,回来接着写,如果点赞的人多,就给你们看看我们集团的服务中心的架构~~~

编辑于 2016-06-16 09:47

其实很多大公司都会把自己的架构公开,只有国内公司藏着掖着

  • Evernote: blog.evernote.com/tech/
  • Dropbox: youtube.com/watch?
  • Facebook: makeuseof.com/tag/faceb
  • StackOverflow: highscalability.com/blo P.S. 仅有的一个Windows-based技术堆栈


其他慢慢补充

编辑于 2012-12-16 14:22

其实,计算机专业本科程度的算法与数据结构,已经给出了网站服务器的完整架构原理,从简单到复杂,从单机到分布式跨地域。你只需要熟知这些组件即可。

发布于 2016-05-21 23:59

一行字就可以描述:

根据瓶颈的优先级拆流水线到多台机器上,使得总吞吐率得以达标并且流水线的每个环节的吞吐率前后匹配

编辑于 2016-05-21 18:39

开源流行的架构 几乎都是下面这些技术拼装的

LAMP LNMP NOSQL /Memcached/Redis LVS KeepAlived Haproxy HeartBeat ......

发布于 2013-04-28 22:14

初始阶段的网站架构

应用服务和数据服务分离

使用缓存改善网站性能

使用应用服务器集群改善网站的并发处理能力

数据库读写分离

使用反向代理和 CDN 加速网站响应

使用分布式文件系统和分布式数据库系统

使用 NoSQL 和搜索引擎

业务拆分

分布式服务

编辑于 2017-08-30 11:11

Atitit 常用的软件架构 与 架构模式(相对固定总结的架构方法) attilax总结

1.1. 主进化路线Cs》》 bs 》3层架构》 SOA》rest》MSA(微服务架构 1

1.2. 做软件架构设计时,根据不同的抽象层次可分为三种不同层次的模式:架构模式(Architectural Pattern)、设计模式(Design Pattern)、代码模式(Coding Pattern)。 1

2. 架构模式常常划分成如下的几种:类型 2

3. 常用的软件架构(hybrid, 2

3.1. Cs》》 bs 》3层架构》 SOA》rest》MSA(微服务架构 2

3.2. 分层架构是使用最多的架构模式 Layers模式 也称Tiers模式 2

3.3. MVC架构 3

3.4. 微内核架构 •Microkernel(微核)模式 3

3.5. 元模型架构: 3

3.6. 管道-过滤器架构: 2.2.2 Pipes and Filters模式 3

3.7. 点对点(Peer to Peer)对等风格 3

3.8. 其他架构 3

1.1. 主进化路线Cs》》 bs 3层架构 SOA》rest》MSA(微服务架构

1.2. 做软件架构设计时,根据不同的抽象层次可分为三种不同层次的模式:架构模式(Architectural Pattern)、设计模式(Design Pattern)、代码模式(Coding Pattern)。

架构模式是一个系统的高层次策略,涉及到大尺度的组件以及整体性质和力学。架构模式的好坏可以影响到总体布局和框架性结构。

设计模式是中等尺度的结构策略。这些中等尺度的结构实现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总体布局和总体框架。设计模式定义出子系统或组件的微观结构。

代码模式(或成例)是特定的范例和与特定语言有关的编程技巧。

2. 架构模式常常划分成如下的几种:类型

一、 模块结构(From Mud to Structure)型。帮助架构师将系统合理划分,避免形成一个对象的海洋。包括Layers(分层)模式、Blackboard(黑板)模式、Pipes/Filters(管道/过滤器)模式等。

二、分散系统(Distributed Systems)型。为分散式系统提供完整的架构设计,包括像Broker(中介)模式等。

三、人机互动(Interactive Systems)型,支持包含有人机互动介面的系统的架构设计,例子包括MVC(Model-View-Controller)模式、PAC(Presentation-Abstraction-Control)模式等。

四、Adaptable Systems型,支持应用系统适应技术的变化、软件功能需求的变化。如Reflection(反射)模式、Microkernel(微核)模式等。

3. 常用的软件架构(hybrid,

3.1. Cs》》 bs 3层架构SOArestMSA(微服务架构

3.2. 分层架构是使用最多的架构模式Layers模式也称Tiers模式

3.3. MVC架构

3.4. 微内核架构•Microkernel(微核)模式

3.5. 元模型架构

元模型架构就是有元数据支撑的架构,现在使用的也很广泛,比如:ORM,.Net 类的设计等都是元数据支持的。元数据有自我描述性比如ORM会描述类对应 数据库中的表属性对应数据库里的字段,还有IOC类中的引用需要注入哪个类等等都会通过元数据的形式实现。IOC框架通过解析元数据信息使注入和被注入类只通过接口依赖,这样替换注入类很方便。元数据架构是很灵活的架构,可发展空间非常大,元数据架构会经常用反射技术或者动态代码生成技术。我之前做了一个ORM就是用到的元数据架构,我还想给ORM添加依赖注入面向切面编程等特性都很方便的。

3.6. 管道-过滤器架构: 2.2.2 Pipes and Filters模式 

5.这个模式就像是工厂的流水线,生产原料通过流水线经过很多环节进行处理变成产品。软件也是一样的,网络OSI7层就是消息通过管道内部的很多步处理对消息进行加工过滤转换。再举一个例子,两家企业需要信息交换,但是企业的信息格式和描述规则都不相同,如果想达到交换必须经过处理,所以我们就得用管道过滤器模式,通过管道过滤器模式信息进入管道我们会在管道里添加各种处理功能,比如:数据验证,信息加密,信息解密,信息压缩,信息解压缩,格式转换等功能,对消息进行处理以符合我们要求的消息格式,而且如果需要添加一个新的处理只要把处理的功能插入到管道中即可,这样达到最大的灵活性。应用此模式的有:ASP .Net请求模型,Spring 对象构造,Structs 数据请求等。

3.7. 点对点(Peer to Peer)对等风格

3.8. 其他架构

2.2.3 Blackboard模式 

SSH架构 ssm架构 ,java net lamp架构 大泥球风格 批量顺序处理风格 分发-订阅风格 map-reduce风格 orm ioc

[分享] 软件架构设计之常用架构模式介绍 - chunjuzhong的专栏 - 博客频道 - CSDN.NET.html

主要软件类型 适用 的几种典型的 架构模式 - dzldzl - 博客园.html

软件架构模式基本概念及三者区别 - jsd2root的博客 - 博客频道 - CSDN.NET.html

《面向模式的软件架构,卷1:模式系统》((德)布施曼 等著)【简介_书评_在线阅读】 - 当当图书.html

《恰如其分的软件架构(软件架构设计新经典)》((美)George Fairbanks 著 )【简介_书评_在线阅读】 - 当当图书.html

编辑于 2017-01-09 02:28
highscalability.com/blo
发布于 2013-08-02 11:06

常见的网站服务器架构有哪些?

看见前面回答的那么长的篇幅,感觉有点恐怖,看的我是那个累啊!

我也不多说废话了 ,这个问题的完美的回答都在这 --- 服务器架构是这些-----

编辑于 2017-08-21 15:29

好清晰的回答

发布于 2017-08-18 14:36
知乎是如何支撑两亿人使用的?
611 播放 · 5 赞同
可以学习这个
发布于 2023-06-02 10:32· 131 次播放

试图从模块化的角度来聊聊Nginx服务器的架构。Nginx模块众多,我个人把它分为四类,这四类模块各自有其不同的设计原则。


请求处理模块。负责生成响应或者影响后续的处理模块,请求处理模块遵循请求阶段设计,在同阶段内按序处理。

过滤模块。生成了HTTP响应后,此类模块可以对响应做再加工。

仅影响变量的模块。这类模块为其他模块的指令赋能,它们提供新的变量或者修改已有的变量。

负载均衡模块。它们提供选择上游服务器的负载均衡算法,并可以管理上游连接。

请求处理模块、过滤模块、负载均衡模块均遵循unitform pipe and filter架构,每个模块以统一的接口处理输入,并以同样的接口产生输出,这些模块串联在一起提供复杂的功能。Nginx把请求处理流程分为11个阶段,所有请求处理模块必须隶属于某个阶段,或者同时在多个阶段中工作。每个处理阶段必须依次向后执行,不可跳跃阶段执行。


同阶段内允许存在多个模块同时生效,这些模块串联在一起有序执行。当然,先执行的模块还有个特权,它可以决定忽略本阶段后续模块的执行,直接跳跃到下一个阶段中的第1个模块执行。

无论我们使用了哪些模块,Nginx框架中的变量一定是默认提供的,它为我们提供了基础功能,理解好它们是我们使用好Nginx变量的关键。框架变量分为5类:HTTP 请求相关的变量、TCP 连接相关的变量、Nginx 处理请求过程中产生的变量、发送 HTTP 响应时相关的变量以及Nginx 系统变量。

发布于 2021-01-14 11:45

听君一席话胜读十年书啊

发布于 2017-02-23 16:04

2.服务器的类型:

2.1:国内服务器(中国大陆机房的服务器)

2.2:海外服务器(香港、台湾、美国等地区机房的服务器)

2.3:普通服务器(没有防御的服务器)

2.4:高防服务器(有防御的服务器)

发布于 2016-12-01 16:05
( 为什么?)