多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 型互联网架构演进过程 1. 何为大型互联网架构 1.1 大型网站的特点 ![](https://img.kancloud.cn/40/8d/408d8653e7fb39637cc1d2667376e36a_322x206.png) 1.2 大型网站的架构目标 ![](https://img.kancloud.cn/84/44/84444ca14228d03426f7ca75dbd2f353_657x222.png) 1.3 大型网站架构模式 ![](https://img.kancloud.cn/07/c3/07c366438ff5b3b3e3f489ed2e83826d_960x374.png) # 2.衡量大型网站的标准与指标 技术:分布式集群,微服务架构 指标: QPS上千 pv上亿 并发上百 案例: 大型:BAJT等 中大型:58同城,B站等 # 3.分布式架构的演变过程 由单机计算机的架构——>分布式计算机架构 前言: 一个成熟的大型网站系统架构并不是一开始就设计的非常完美的,世上没有完美的架构,也不是一 开始就具备高性能、高可用、安全性等特性,而是随着用户量的不断增加、业务功能的扩展逐步完 善演变过来的。在这个过程中,开发模式、技术架构等都会发生非常大的变化。而针对不同的业务 特征的系统,会有各自的侧重点,比如像淘宝这类网站,要解决的是海量商品搜索、下单、支付等 问题;像腾讯,要解决的是数亿级别用户的实时消息传输;百度所要解决的是海量数据的搜索。每 一类的业务都有自己不同的系统架构。 我们以电商系统的发展演变为例,分析架构演变历程。 关注的是数据量、访问量提升,网站结构发生的变化,而不是具体关注业务功能点。其次,这个过 程是为了让大家更好的了,解网站演进过程中的一些问题和应对策略。 假如我们系统具备以下功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易及支付结算 ## 3.1 第1版应用:单机负载 得回忆公司刚创业那会。那是很多年前,那天,公司成立了,老板兴致勃勃的租了一间民宅,买了 一台服务器。然后大伙几个就开干了。 大伙把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个时候的讲究的 是效率。(这也是PHP的优势所在,快速开发快速迭代) 我们在一台机子上装了lnmp,下图描述了我们这台服务器: ![](https://img.kancloud.cn/0c/25/0c254f28c07c1092bb347e1c0df69212_657x519.png) ## 3.2 第2版:单机负载越来越高,数据库服务器和应用服务器分离 随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,在服务器还没有超载的时候,我们应 该做好规划,提升网站的负载能力。假如代码层面的优化已经没办法继续提高,在不提高单台机器 的性能,增加机器是一个比较好的方式,投入产出比非常高。这个阶段增加机器的主要目的是讲 web 服务器和 数据库服务器拆分,这样不仅提高了单机的负载能力,也提高了容灾能力。并且根 据服务器的用途配置不同的硬件,达到最佳的性能效果 ![](https://img.kancloud.cn/07/92/0792603fef2c1b63706ee0648a4fa4e9_878x538.png) ## 3.3 第3版:利用缓存改善网站性能 在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技 术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80% 的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问 路径,提高用户体验。 ![](https://img.kancloud.cn/f3/ca/f3cac0a5ed6ee2f2f95c7cbf7aa01c40_689x627.png) ## 3.4 第4版:使用集群改善应用服务器性能 随着访问量的继续增加,单台应用服务器已经无法满足需求。在假设数据库服务器还没有遇到性能 问题的时候,我们可以增加应用服务器,通过应用服务器集群将用户请求分流到各个服务器中,从 而继续提升负载能力。此时多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提 供服务。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用 服务器节点。 另外,我们还可以增加缓存服务器集群, 来提高访问速度并降低mysql等数据库的压力 ![](https://img.kancloud.cn/e8/f0/e8f0a5e74b02be8d594f330f3fefa28a_613x406.png) ## 3.5 第5版:数据库压力变大,数据库读写分离 架构演变到这里,并不是终点。上面我们把应用层的性能拉上来了,但是数据库的负载也在慢慢增 大,那么怎么去提高数据库层面的负载呢?有了前面的思路以后,自然会想到增加服务器。但是假 如我们单纯的把数据库一分为二,然后对于后续数据库的请求,分别负载到两台数据库服务器上, 那么一定会造成数据库不统一的问题。 所以我们一般先考虑读写分离的方式, 。 分库分表不是这个阶段要考虑的,是数据库优化的终极技能,因为会带来一些难题,所以能不用就 不用 ![](https://img.kancloud.cn/aa/ff/aaffbb35c8bb6b6953f1d3e0486c6c8a_617x383.png) ## 3.6 第6版:使用NoSQL和搜索引擎缓解读库的压力 数据库做读库的话,常常对模糊查找效率不是特别好,像电商类的网站,搜索是非常核心的功能, 即便是做了读写分离,这个问题也不能有效解决。那么这个时候就需要引入Nosql和搜索引擎了。 对于海量数据的查询和分析,我们使用NoSQL数据库加上搜索引擎可以达到更好的性能。并不是 所有的数据都要放在关系型数据中。 常用的NoSQL有MongoDB、HBase、Redis,搜索引擎有Lucene、Solr、Elasticsearch。 ![](https://img.kancloud.cn/e3/e7/e3e70fd29ca71f9fe229c90f7d3271d6_638x477.png) ## 3.7 第7版:使用CDN和反向代理提高网站性能 假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访 问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互 联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。 对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近 的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。 而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务 器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取 数据的成本。反向代理有Squid、Nginx。 ![](https://img.kancloud.cn/33/c8/33c85a2069fd28ea440f7c96e3b05342_651x543.png) ## 3.8 第8版 将应用服务器进行业务拆分 随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分 为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信 或者共享数据库来实现。 ![](https://img.kancloud.cn/5e/41/5e4137824f0c9213cca9e6c0526c320e_738x530.png) ## 3.9 第9版 数据库的水平、垂直拆分 我们的网站演进的变化过程,交易、商品、用户的数据都在同一个数据库中,尽管采取了增加缓 存,读写分离的方式,但是随着数据库的压力持续增加,数据库的瓶颈仍然是个最大的问题。因此 我们可以考虑对数据的垂直拆分和水平拆分。 ![](https://img.kancloud.cn/4e/68/4e6829e657880d2d18295682b8778c39_624x485.png) ## 3.10 第10版 :服务拆分 这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服 务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务 框架搭建分布式服务。 ![](https://img.kancloud.cn/08/9c/089c884e49ccf96a0721af94149ef409_777x604.png) # 4 大型网站架构目标: ## 1、高性能架构 ![](https://img.kancloud.cn/76/5f/765f5719f9aba73b93e89b5d53480b3b_757x325.png) ## 2、高可用架构 大型网站应该在任何时候都可以正常访问,正常提供对外服务。因为大型网站的复杂性,分布式,廉价 服务器,开源数据库,操作系统等特点,要保证高可用是很困难的,也就是说网站的故障是不可避免 的。 如何提高可用性,就是需要迫切解决的问题。首先,需要从架构级别考虑,在规划的时候,就考虑可用 性。行业内一般用几个9表示可用性指标,比如四个9(99.99),一年内允许的不可用时间是53分钟。 不同层级使用的策略不同,一般采用冗余备份和失效转移解决高可用问题。 应用层:一般设计为无状态的,对于每次请求,使用哪一台服务器处理是没有影响的。一般使用负 载均衡技术(需要解决Session同步问题)实现高可用。 服务层:负载均衡,分级管理,快速失败(超时设置),异步调用,服务降级,幂等设计等。 数据层:冗余备份(冷,热备\[同步,异步\],温备),失效转移(确认,转移,恢复)。数据高可 用方面著名的理论基础是CAP理论(持久性,可用性,数据一致性\[强一致,用户一致,最终一 致\]) ## 3、可伸缩架构 伸缩性是指在不改变原有架构设计的基础上,通过添加/减少硬件(服务器)的方式,提高/降低系统的 处理能力。 应用层:对应用进行垂直或水平切分。然后针对单一功能进行负载均衡(DNS、HTTP\[反向代理\]、 IP、链路层)。 服务层:与应用层类似; 数据层:分库、分表、NoSQL等;常用算法Hash,一致性Hash。 ## 4、可扩展架构 可以方便地进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性。 模块化,组件化:高内聚,低耦合,提高复用性,扩展性。 稳定接口:定义稳定的接口,在接口不变的情况下,内部结构可以“随意”变化。 设计模式:应用面向对象思想,原则,使用设计模式,进行代码层面的设计。 消息队列:模块化的系统,通过消息队列进行交互,使模块之间的依赖解耦。 分布式服务:公用模块服务化,提供其他系统使用,提高可重用性,扩展性。 ## 5、安全架构 对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。对于安全问题,首先要提高安全 意识,建立一个安全的有效机制,从政策层面,组织层面进行保障,比如服务器密码不能泄露,密码每 月更新,并且三次内不能重复;每周安全扫描等。以制度化的方式,加强安全体系的建设。同时,需要 注意与安全有关的各个环节。安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全 等。 基础设施安全:硬件采购,操作系统,网络环境方面的安全。一般采用正规渠道购买高质量的产 品,选择安全的操作系统,及时修补漏洞,安装杀毒软件防火墙。防范病毒,后门。设置防火墙策 略,建立DDOS防御系统,使用攻击检测系统,进行子网隔离等手段。 应用系统安全:在程序开发时,对已知常用问题,使用正确的方式,在代码层面解决掉。防止跨站 脚本攻击(XSS),注入攻击,跨站请求伪造(CSRF),错误信息,HTML注释,文件上传,路径 遍历等。还可以使用Web应用防火墙(比如:ModSecurity),进行安全漏洞扫描等措施,加强应 用级别的安全。 数据保密安全:存储安全(存储在可靠的设备,实时,定时备份),保存安全(重要的信息加密保 存,选择合适的人员复杂保存和检测等),传输安全(防止数据窃取和数据篡改); 常用的加解密算法(单项散列加密\[MD5、SHA\],对称加密\[DES、3DES、RC\]),非对称加密\[RSA\]等。 ## 6、敏捷性 网站的架构设计,运维管理要适应变化,提供高伸缩性,高扩展性。方便的应对快速的业务发展,突增 高流量访问等要求。 除上面介绍的架构要素外,还需要引入敏捷管理,敏捷开发的思想。使业务,产品,技术,运维统一起 来,随需应变,快速响应。 # 5 亿级流量架构设计实战 ## 5.1 大型分布式类型 ![](https://img.kancloud.cn/54/83/5483dd02f3974793140e1afafa46f933_766x426.png) ![](https://img.kancloud.cn/eb/1c/eb1ce78fe948df518b02b1c7be21854b_775x251.png) ## 5.2 需求功能矩阵 需求管理传统的做法,会使用例图或模块图(需求列表)进行需求的描述。这样做常常忽视掉一个很重 要的需求(非功能需求),因此推荐使用需求功能矩阵,进行需求描述。 本电商网站的需求矩阵如下 ![](https://img.kancloud.cn/a4/f1/a4f1854b5e898a5be188a4aa7b619e23_657x50.png) ![](https://img.kancloud.cn/09/2e/092ebfe9d2e37b506ea3e19972aabd40_744x619.png) ## 5.3 网站初级架构 ![](https://img.kancloud.cn/cf/e3/cfe32202f094728171b7c1ebb19ac7ca_751x503.png) 由于NFS服务功能很多,会有很多端口,这些端口还有可能不固定,(pc -ef | egrep nfs 我们可以看到 nfs 不同的端口号)那么客户端就无法与服务器进行通信,因为程序间通信必须通过端口(tcp/udp都是 端到端通信),那么就需要一个中间的桥接机制,RPC进程即充当这样一个角色,RPC的端口是一定的 (111),当NFS启动时,会向RPC进行注册, (rpc 一定是在nfs启动前,就已经启动了,)那么客户 端PRC就能与服务器RPC进行通信, 从而进行文件的传输。 当客户端用户打开一个文件或目录时,内核会判断,该文件是本地文件还是远程共享目录文件(如果是 远程共享文件就都挂载mount 到/etc/init.d/rc.local下面),如果是远程文件则通过RPC进程访问远程 NFS服务端的共享目录,如果是本地文件,则直接打开。 为了更好的并发,RPC进程及NFS进程都有多个。 但是,目前主流的网站架构一般都会采用集群的方式,进行高可用设计。 ![](https://img.kancloud.cn/c1/a4/c1a41faa386c1294209c58846a507907_726x366.png) ![](https://img.kancloud.cn/95/f8/95f86cadf6be9fc8abd9edbd7ba20fb6_639x74.png) ## 5.4 系统容量预估 ![](https://img.kancloud.cn/a7/af/a7afdf3bd19505fe324579e48200b654_570x376.png) 服务器预估:(以PHP举例) 按一台web服务器,支持每秒300个并发计算。平常需要10台服务器(约等于);\[PHP默认配置是 150\],高峰期需要30台服务器; 容量预估:70/90原则 系统CPU一般维持在70%左右的水平,高峰期达到90%的水平,是不浪费资源,并比较稳定的。内存, IO类似。 以上预估仅供参考,因为服务器配置,业务逻辑复杂度等都有影响。在此CPU,硬盘,网络等不再进行 评估。 # 5.5 网站架构分析 ![](https://img.kancloud.cn/0f/f9/0ff9a8736f49ff82d07edd01065a8bd3_789x475.png) ## 5.6 网站架构优化 ### 5.6.1 业务拆分 ![](https://img.kancloud.cn/cb/48/cb48706888c5e498a43102ca22d56b0b_751x269.png) ![](https://img.kancloud.cn/41/f2/41f2e026ebea7c6a7978314521f89251_643x384.png) 如上图每个应用单独部署,核心系统和非核心系统组合部署 ### 5.6.2应用集群部署(分布式,集群,负载均衡) ![](https://img.kancloud.cn/fb/17/fb17b1aff361d3c7161d991465a09922_789x120.png) 集群部署后架构图: ![](https://img.kancloud.cn/ea/b1/eab1f823d0a3d82ab3c7770156d9ac7f_634x577.png) ## 5.7、架构汇总 ![](https://img.kancloud.cn/4d/26/4d263a921c19011f5a3c52491dd68a68_475x635.png)