一般来讲,大型网站都是从小型网站发展而来,一开始的架构都比较简单,随着业务复杂和用户量的激增,才开始做很多架构上的改进。当它还是小型网站的时候,没有太多访客,一般来讲只需要一台服务器就够了,这时应用程序、数据库、文件等所有资源都在一台服务器上,网站架构如下图所示:
随着网站业务的发展和用户量的增加,一台服务器就无法再满足需求了。大量用户访问导致访问速度越来越慢,而逐渐增加的数据也会导致存储空间不足。这时就需要将应用和数据分离,应用和数据分离后整个网站使用3台服务器:应用服务器、文件服务器和数据库服务器。这3台服务器对硬件资源的要求各不相同:
此时,网站系统的架构如下图所示:
网站使用的缓存一般分为缓存到应用服务器或者缓存在专门的分布式缓存服务器。缓存到应用服务器自己的访问速度快很多,但是受自身内存限制,往往不太适用。远程分布式缓存使用一个集群专门负责缓存服务,当内存不够还可以轻松得动态扩容。
使用缓存后,数据访问压力得到了缓解,但是单一应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器就成了整个网站的效率瓶颈。使用分布式集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力和存储空间不足时,不要尝试去更换更强大的服务器,对大型网站而言,多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。对网站架构而言,只要能通过增加一台服务器的方式改善负载压力,就可以以同样的方式持续增加服务器不断改善系统性能,从而实现系统的可伸缩性。应用服务器实现集群是网站可伸缩架构设计中较为简单成熟的一种,如下图所示:
通过负载均衡调度服务器,可以将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多用户,就在集群中加入更多的应用服务器,使应用服务器的压力不再成为整个网站的瓶颈。
网站在使用缓存后,使对大部分数据读操作访问都可以不通过数据库就能完成,但是仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作都需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。如下图所示:
应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明。
任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展依然不能满足需求,这时需要使用分布式数据库。文件系统也一样,需要使用分布式文件系统。如下图所示:
分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。不到不得已时,网站更常用的数据库拆分手段是业务分库,将不同业务的数据部署在不同的物理服务器上。
随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎。如下图所示:
NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持。应用服务器则通过一个统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线。如大型购物交易网站都会将首页、商铺、订单、买家、卖家等拆分成不同的产品线,分归不同的业务团队负责。
具体到技术上,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应用独立部署。应用之间可以通过一个超链接建立关系(在首页上的导航链接每个都指向不同的应用地址),也可以通过消息队列进行数据分发,当然最多的还是通过访问同一个数据存储系统来构成一个关联的完整系统,如下图所示:
随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。由于所有应用要和所有数据库系统连接,在数万台服务器规模的网站中,这些连接的数目是服务器规模的平方,导致数据库连接资源不足,拒绝服务。
既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作。如下图所示:
大型网站的架构演化到这里,基本上大多数的技术问题都可以得以解决了。
2013/04/18更新
[只是大框架介绍,实际使用中的不容易注意的细节太多了,需要经验的积累,才能运用娴熟]
以下的架构都是在假设已经优化过linux内核的情况下进行
初级篇:(单机模式)
假设配置:(Dualcore2.0GHz,4GBram,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_luaorC)+Memcache+Mysql(此时处理个同时在线三四千人没有问题了)
进阶3:随着用户的增多,Mysql的写入速度成了又一大瓶颈,读取有memcache做缓存,但写入是直接面对Mysql,性能受到了很大阻碍,这时候,要在Nginx和Mysql中间加入一层写缓存,队列系统就出场了,就以RabbitMQ为例,所有写入操作全部丢到这只兔子的胃里面,然后屁股后面写个接应程序,一条条的拉出来再写入mysql。而RabbitMQ的写入效率是Mysql的N倍,此时架构的处理能力又上一阶层。|----write------>RabbitMQ--------Nginx(luaorc)-----|--------->Mysql|----read------>Memcache--------
(此时的并发吞吐能力已经可以处理万人左右在线)
中级篇:(分而治之)
此时我们在单机优化上已经算是达到极限,接下来就要集群来显示作用了。
数据库篇:数据库总是在整个环节中是吞吐能力最弱的,最常见的方法就是sharding。sharding可以按多种方法来分,没有定式,看情况。可以按用户ID区段分,按读写分等等,可用参考软件:mysqlproxy(工作原理类似lvs)
缓存篇:memcache一般采用的是构建memcachepool,将缓存分散到多台memcache节点上,如何将缓存数据均匀分散在各节点,一般采用将各节点顺序编号,然后hash取余对应到各个节点上去。这样可以做到比较均匀的分散,但是有一个致命点就是,如果节点数增加或减少,将会带来几乎80%的数据迁移,解决方案我们在高级篇再提。
高级篇:(高可用性+高可扩展性的集群)
为了提高存储的平衡性,算法还可以加入虚拟节点的概念,即每个实际cache节点,会在圆上对应N个虚拟的节点,这样可以提高算法的命中率,更加平衡。
系统架构演化历程-初始阶段架构
系统架构演化历程-应用服务和数据服务分离
系统架构演化历程-使用缓存改善性能
系统架构演化历程-使用应用服务器集群
系统架构演化历程-数据库读写分离
系统架构演化历程-反向代理和CDN加速
系统架构演化历程-分布式文件系统和分布式数据库
系统架构演化历程-使用NoSQL和搜索引擎
系统架构演化历程-业务拆分
系统架构演化历程-分布式服务
圈子里有一个伟人说过一句话:亿万级的架构是逐步演化出来的,傻缺才会上来就直接照着亿万级的来搭(′`)...(没错这个伟人就是我),所以这里只是解释下不同量级下的架构形式,具体要看业务规模和体量。
补一个,中小型网站推荐的技术选型LAMP(linux+apache+mysql+php)。大型网站的架构技术则可以灵活选择。
这个时期可以说不存在太多架构的概念,apache/IIS+MYSQL/MSSQL+PHP/JAVA/NET等选型都可以,具体看公司的技术合伙人的方向,技术合伙人来确定方案和选型即可。
假设业务情况涉及到的文件会比较多,建议可以做多台文件服务器对文件进行储存,比如电商类的商品文描图片及主图,多域名,多服务器储存。即便是业务初期,也建议至少有一台热备服务器,不需要太高的配置,实时对业务数据库进行备份即可。
另外一点就是,考虑到业务量极大,为了防止出现线上事故影响服务,另外就是分担网站入口的请求,因此需要部署负载均衡服务器。因为网站是一辆需要一直跑的汽车,不能停车换轮,负载均衡的作用之一就是保证每次修轮胎的时候,车子仍然在跑:
一行字就可以描述:
其实很多大公司都会把自己的架构公开,只有国内公司藏着掖着
初始阶段的网站架构
应用服务和数据服务分离
使用缓存改善网站性能
使用应用服务器集群改善网站的并发处理能力
数据库读写分离
使用反向代理和CDN加速网站响应
使用分布式文件系统和分布式数据库系统
使用NoSQL和搜索引擎
业务拆分
分布式服务
Atitit常用的软件架构与架构模式(相对固定总结的架构方法)attilax总结
架构模式是一个系统的高层次策略,涉及到大尺度的组件以及整体性质和力学。架构模式的好坏可以影响到总体布局和框架性结构。
设计模式是中等尺度的结构策略。这些中等尺度的结构实现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总体布局和总体框架。设计模式定义出子系统或组件的微观结构。
代码模式(或成例)是特定的范例和与特定语言有关的编程技巧。
一、模块结构(FromMudtoStructure)型。帮助架构师将系统合理划分,避免形成一个对象的海洋。包括Layers(分层)模式、Blackboard(黑板)模式、Pipes/Filters(管道/过滤器)模式等。
二、分散系统(DistributedSystems)型。为分散式系统提供完整的架构设计,包括像Broker(中介)模式等。
三、人机互动(InteractiveSystems)型,支持包含有人机互动介面的系统的架构设计,例子包括MVC(Model-View-Controller)模式、PAC(Presentation-Abstraction-Control)模式等。
四、AdaptableSystems型,支持应用系统适应技术的变化、软件功能需求的变化。如Reflection(反射)模式、Microkernel(微核)模式等。
2.2.3Blackboard模式
SSH架构ssm架构,javanetlamp架构大泥球风格批量顺序处理风格分发-订阅风格map-reduce风格ormioc
主要软件类型适用的几种典型的架构模式-dzldzl-博客园.html
软件架构模式基本概念及三者区别-jsd2root的博客-博客频道-CSDN.NET.html
《面向模式的软件架构,卷1:模式系统》((德)布施曼等著)【简介_书评_在线阅读】-当当图书.html
《恰如其分的软件架构(软件架构设计新经典)》((美)GeorgeFairbanks著)【简介_书评_在线阅读】-当当图书.html