本文是学习大型分布式网站架构的技术总结。对架构一个高性能、高可用、可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考。文中一部分为读书笔记,一部分是我的经验总结,对大型分布式网站架构有较好的参考价值。前端
烂皮猪,十余年工做经验,曾在Google等外企工做过几年,精通Java、分布式架构,微服务架构以及数据库,最近正在研究大数据以及区块链,但愿可以突破到更高的境界程序员
用户多,分布普遍web
大流量,高并发算法
海量数据,服务高可用数据库
安全环境恶劣,易受网络攻击设计模式
功能多,变动快,频繁发布浏览器
从小到大,渐进发展缓存
以用户为中心tomcat
免费服务,付费体验安全
高性能:提供快速的访问体验。
高可用:网站服务一直能够正常访问。
可伸缩:经过硬件增长/减小,提升/下降处理能力。
安全性:提供网站安全访问和数据加密、安全存储等策略。
扩展性:方便地经过新增/移除方式,增长/减小新的功能/模块。
敏捷性:随需应变,快速响应;
分层:通常可分为应用层、服务层、数据层、管理层与分析层;
分割:通常按照业务/模块/功能特色进行划分,好比应用层分为首页、用户中心。
分布式:将应用分开部署(好比多台物理机),经过远程调用协同工做。
集群:一个应用/模块/功能部署多份(如:多台物理机),经过负载均衡共同提供对外访问。
缓存:将数据放在距离应用或用户最近的位置,加快访问速度。
异步:将同步的操做异步化。客户端发出请求,不等待服务端响应,等服务端处理完毕后,使用通知或轮询的方式告知请求方。通常指:请求——响应——通知模式。
冗余:增长副本,提升可用性、安全性与性能。
安全:对已知问题有有效的解决方案,对未知/潜在问题创建发现和防护机制。
自动化:将重复的、不须要人工参与的事情,经过工具的方式,使用机器完成。
敏捷性:积极接受需求变动,快速响应业务发展需求。
以用户为中心,提供快速的网页访问体验。主要参数有较短的响应时间、较大的并发处理能力、较高的吞吐量与稳定的性能参数。
可分为前端优化、应用层优化、代码层优化与存储层优化。
大型网站应该在任什么时候候均可以正常访问,正常提供对外服务。由于大型网站的复杂性,分布式,廉价服务器,开源数据库,操做系统等特色,要保证高可用是很困难的,也就是说网站的故障是不可避免的。
如何提升可用性,就是须要迫切解决的问题。首先,须要从架构级别考虑,在规划的时候,就考虑可用性。行业内通常用几个9表示可用性指标,好比四个9(99.99),一年内容许的不可用时间是53分钟。
不一样层级使用的策略不一样,通常采用冗余备份和失效转移解决高可用问题。
伸缩性是指在不改变原有架构设计的基础上,经过添加/减小硬件(服务器)的方式,提升/下降系统的处理能力。
能够方便地进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性。
对已知问题有有效的解决方案,对未知/潜在问题创建发现和防护机制。对于安全问题,首先要提升安全意识,创建一个安全的有效机制,从政策层面,组织层面进行保障,好比服务器密码不能泄露,密码每个月更新,而且三次内不能重复;每周安全扫描等。以制度化的方式,增强安全体系的建设。同时,须要注意与安全有关的各个环节。安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全等。
经常使用的加解密算法(单项散列加密[MD五、SHA],对称加密[DES、3DES、RC]),非对称加密[RSA]等。
网站的架构设计,运维管理要适应变化,提供高伸缩性,高扩展性。方便的应对快速的业务发展,突增高流量访问等要求。
除上面介绍的架构要素外,还须要引入敏捷管理,敏捷开发的思想。使业务,产品,技术,运维统一块儿来,随需应变,快速响应。
以上采用七层逻辑架构,第一层客户层,第二层前端优化层,第三层应用层,第四层服务层,第五层数据存储层,第六层大数据存储层,第七层大数据处理层。
一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并非一开始设计时就具有完整的高性能、高可用、高伸缩等特性的,它是随着用户量的增长,业务功能的扩展逐渐演变完善的,在这个过程当中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几我的发展到一个部门甚至一条产品线。
因此成熟的系统架构是随着业务的扩展而逐步完善的,并非一蹴而就;不一样业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索、下单、支付;例如腾讯,要解决数亿用户的实时消息传输;百度它要处理海量的搜索请求。
他们都有各自的业务特性,系统架构也有所不一样。尽管如此咱们也能够从这些不一样的网站背景中,找出其中共用的技术,这些技术和手段普遍运用在大型网站系统的架构中,下面就经过介绍大型网站系统的演化过程,来认识这些技术和手段。
架构技术是程序员绕不开的话题,在这里顺便给你们推荐一个架构技术交流群:650385180,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工做和遇到技术瓶颈的码友,在这个群里会有你须要的内容。
最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:
随着业务的扩展,一台服务器已经不能知足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,而且根据服务器的用途配置不一样的硬件,达到最佳的性能效果。
在硬件优化性能的同时,同时也经过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),因此咱们能够对热点数据进行缓存,减小这些数据的访问路径,提升用户体验。
缓存实现常见的方式是本地缓存、分布式缓存。固然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,能够存在内存中,也能够存在文件,OSCache就是经常使用的本地缓存组件。本地缓存的特色是速度快,但由于本地空间有限因此缓存数据量也有限。分布式缓存的特色是,可
以缓存海量的数据,而且扩展很是容易,在门户类网站中经常被使用,速度按理没有本地缓存快,经常使用的分布式缓存是Memcached、Redis。
应用服务器做为网站的入口,会承担大量的请求,咱们每每经过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。
经常使用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx和HAProxy是七层负载均衡,能够根据报文内容选择内部服务器,所以LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如能够用来作动静分离(根据请求报文特征,选择静态资源服务器仍是应用服务器)。
随着用户量的增长,数据库成为最大的瓶颈,改善数据库性能经常使用的手段是进行读写分离以及分库分表,读写分离顾名思义就是将数据库分为读库和写库,经过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切分则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务的不一样来切分,如用户业务、商品业务相关的表放在不一样的数据库中。
假如咱们的服务器都部署在成都的机房,对于四川的用户来讲访问是较快的,而对于北京的用户访问是较慢的,这是因为四川和北京分别属于电信和联通的不一样发达地区,北京用户访问须要经过互联路由器通过较长的路径才能访问到成都的服务器,返回路径也同样,因此数据传输时间比较长。对于这种状况,经常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减小了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。
而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,若是没有缓存数据才会继续访问应用服务器获取,这样作减小了获取数据的成本。反向代理有Squid、Nginx。
用户一每天增长,业务量愈来愈大,产生的文件愈来愈多,单台的文件服务器已经不能知足需求,这时就须要分布式文件系统的支撑。经常使用的分布式文件系统有GFS、HDFS、TFS。
对于海量数据的查询和分析,咱们使用NoSQL数据库加上搜索引擎能够达到更好的性能。并非全部的数据都要放在关系型数据中。经常使用的NoSQL有MongoDB、HBase、Redis,搜索引擎有Lucene、Solr、Elasticsearch。
随着业务进一步扩展,应用程序变得很是臃肿,这时咱们须要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每一个业务应用负责相对独立的业务运做。业务之间经过消息进行通讯或者共享数据库来实现。
这时咱们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。咱们将这些服务抽取出来利用分部式服务框架搭建分布式服务。阿里的Dubbo是一个不错的选择。
一、电商案例的缘由
分布式大型网站,目前看主要有几类:
大型门户通常是新闻类信息,可使用CDN,静态化等方式优化,开心网等交互性比较多,可能会引入更多的NoSQL,分布式缓存,使用高性能的通讯框架等。电商网站具有以上两类的特色,好比产品详情能够采用CDN,静态化,交互性高的须要采用NoSQL等技术。所以,咱们采用电商网站做为案例,进行分析。
二、电商网站需求
客户需求:
客户就是客户,不会告诉你具体要什么,只会告诉你他想要什么,咱们不少时候要引导,挖掘客户的需求。好在提供了明确的参考网站。所以,下一步要进行大量的分析,结合行业,以及参考网站,给客户提供方案。
需求功能矩阵
需求管理传统的作法,会使用用例图或模块图(需求列表)进行需求的描述。这样作经常忽视掉一个很重要的需求(非功能需求),所以推荐你们使用需求功能矩阵,进行需求描述。
本电商网站的需求矩阵以下:
三、网站初级架构
通常网站,刚开始的作法,是三台服务器,一台部署应用,一台部署数据库,一台部署NFS文件系统。
这是前几年比较传统的作法,以前见到一个网站10万多会员,垂直服装设计门户,N多图片。使用了一台服务器部署了应用,数据库以及图片存储。出现了不少性能问题。
以下图:
可是,目前主流的网站架构已经发生了翻天覆地的变化。通常都会采用集群的方式,进行高可用设计。至少是下面这个样子:
四、系统容量预估
预估步骤:
根据客户需求:3~5年用户数达到1000万注册用户,能够作每秒并发数预估:
没好好学数学后悔了吧?!(不知道以上算是否有错误,呵呵~~)
服务器预估:(以tomcat服务器举例)
按一台web服务器,支持每秒300个并发计算。日常须要10台服务器(约等于);[tomcat默认配置是150],高峰期须要30台服务器;
容量预估:70/90原则
系统CPU通常维持在70%左右的水平,高峰期达到90%的水平,是不浪费资源,并比较稳定的。内存,IO相似。
以上预估仅供参考,由于服务器配置,业务逻辑复杂度等都有影响。在此CPU,硬盘,网络等再也不进行评估。
五、网站架构分析
根据以上预估,有几个问题:
架构技术是程序员绕不开的话题,在这里顺便给你们推荐一个架构技术交流群:650385180,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工做和遇到技术瓶颈的码友,在这个群里会有你须要的内容。
大型网站通常须要作如下架构优化(优化是架构设计时,就要考虑的,通常从架构/代码级别解决,调优主要是简单参数的调整,好比JVM调优;若是调优涉及大量代码改造,就不是调优了,属于重构):
六、网站架构优化
6.1业务拆分
根据业务属性进行垂直切分,划分为产品子系统,购物子系统,支付子系统,评论子系统,客服子系统,接口子系统(对接如进销存,短信等外部系统)。
根据业务子系统进行等级定义,可分为核心系统和非核心系统。核心系统:产品子系统,购物子系统,支付子系统;非核心:评论子系统,客服子系统,接口子系统。
拆分后的架构图:
参考部署方案2
如上图每一个应用单独部署,核心系统和非核心系统组合部署
6.2应用集群部署(分布式,集群,负载均衡)
集群部署后架构图:
6.3 多级缓存
缓存按照存放的位置通常可分为两类本地缓存和分布式缓存。本案例采用二级缓存的方式,进行缓存的设计。一级缓存为本地缓存,二级缓存为分布式缓存。(还有页面缓存,片断缓存等,那是更细粒度的划分)
一级缓存,缓存数据字典,和经常使用热点数据等基本不可变/有规则变化的信息,二级缓存缓存须要的全部缓存。当一级缓存过时或不可用时,访问二级缓存的数据。若是二级缓存也没有,则访问数据库。
缓存的比例,通常1:4,便可考虑使用缓存。(理论上是1:2便可)。
根据业务特性可以使用如下缓存过时策略:
6.4单点登陆(分布式Session)
系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题。通常可采用Session同步,Cookies,分布式Session方式。电商网站通常采用分布式Session实现。
再进一步能够根据分布式Session,创建完善的单点登陆或帐户管理系统。
流程说明
结合Cache中间件,实现的分布式Session,能够很好的模拟Session会话。
6.5数据库集群(读写分离,分库分表)
大型网站须要存储海量的数据,为达到海量数据存储,高可用,高性能通常采用冗余的方式进行系统设计。通常有两种方式读写分离和分库分表。
读写分离:通常解决读比例远大于写比例的场景,可采用一主一备,一主多备或多主多备方式。
本案例在业务拆分的基础上,结合分库分表和读写分离。以下图:
相关中间件可参考Cobar(阿里,目前已不在维护),TDDL(阿里),Atlas(奇虎360),MyCat。
分库分表后序列的问题,JOIN,事务的问题,会在分库分表主题分享中,介绍。
6.6服务化
将多个子系统公用的功能/模块,进行抽取,做为公用服务使用。好比本案例的会员子系统就能够抽取为公用的服务。
6.7消息队列
消息队列能够解决子系统/模块之间的耦合,实现异步,高可用,高性能的系统。是分布式系统的标准配置。本案例中,消息队列主要应用在购物,配送环节。
目前使用较多的MQ有Active MQ、Rabbit MQ、Zero MQ、MS MQ等,须要根据具体的业务场景进行选择。建议能够研究下Rabbit MQ。
6.8其余架构(技术)
除了以上介绍的业务拆分,应用集群,多级缓存,单点登陆,数据库集群,服务化,消息队列外。还有CDN,反向代理,分布式文件系统,大数据处理等系统。
此处不详细介绍,你们能够问度娘/Google,有机会的话也能够分享给你们。
七、架构汇总
大型网站的架构是根据业务需求不断完善的,根据不一样的业务特征会作特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段,但愿能给你们带来启发。