1. 大型网站系统的特色
- 高并发、大流量
- 高可用
- 海量数据
- 用户分布普遍,网络状况复杂
- 安全环境恶劣
- 需求快速变动,迭代频繁
- 渐进式发展
2. 大型网站架构演化历程
2.1. 初始阶段架构
问题:网站运营初期,访问用户少,一台服务器绰绰有余。前端
特征:应用程序、数据库、文件等全部的资源都在一台服务器上。linux
描述:一般服务器操做系统使用 linux,应用程序使用 PHP 开发,而后部署在 Apache 上,数据库使用 Mysql,通俗称为 LAMP。聚集各类免费开源软件以及一台廉价服务器就能够开始系统的发展之路了。算法
2.2. 应用服务和数据服务分离
问题:愈来愈多的用户访问致使性能愈来愈差,愈来愈多的数据致使存储空间不足,一台服务器已不足以支撑。sql
特征:应用服务器、数据库服务器、文件服务器分别独立部署。数据库
描述:三台服务器对性能要求各不相同:应用服务器要处理大量业务逻辑,所以须要更快更强大的 CPU;数据库服务器须要快速磁盘检索和数据缓存,所以须要更快的硬盘和更大的内存;文件服务器须要存储大量文件,所以须要更大容量的硬盘。后端
2.3. 使用缓存改善性能
问题:随着用户逐渐增多,数据库压力太大致使访问延迟。浏览器
特征:因为网站访问和财富分配同样遵循二八定律:80% 的业务访问集中在 20% 的数据上。将数据库中访问较集中的少部分数据缓存在内存中,能够减小数据库的访问次数,下降数据库的访问压力。缓存
描述:缓存分为两种:应用服务器上的本地缓存和分布式缓存服务器上的远程缓存,本地缓存访问速度更快,但缓存数据量有限,同时存在与应用程序争用内存的状况。分布式缓存能够采用集群方式,理论上能够作到不受内存容量限制的缓存服务。安全
2.4. 使用应用服务器集群
问题:使用缓存后,数据库访问压力获得有效缓解。可是单一应用服务器可以处理的请求链接有限,在访问高峰期,成为瓶颈。性能优化
特征:多台服务器经过负载均衡同时向外部提供服务,解决单一服务器处理能力和存储空间不足的问题。
描述:使用集群是系统解决高并发、海量数据问题的经常使用手段。经过向集群中追加资源,提高系统的并发处理能力,使得服务器的负载压力再也不成为整个系统的瓶颈。
2.5. 数据库读写分离
问题:网站使用缓存后,使绝大部分数据读操做访问均可以不经过数据库就能完成,可是仍有一部分读操做和所有的写操做须要访问数据库,在网站的用户达到必定规模后,数据库由于负载压力太高而成为网站的瓶颈。
特征:目前大部分的主流数据库都提供主从热备功能,经过配置两台数据库主从关系,能够将一台数据库服务器的数据更新同步到一台服务器上。网站利用数据库的主从热备功能,实现数据库读写分离,从而改善数据库负载压力。
描述:应用服务器在写操做的时候,访问主数据库,主数据库经过主从复制机制将数据更新同步到从数据库。这样当应用服务器在读操做的时候,访问从数据库得到数据。为了便于应用程序访问读写分离后的数据库,一般在应用服务器端使用专门的数据访问模块,使数据库读写分离的对应用透明。
2.6. 反向代理和 CDN 加速
问题:中国网络环境复杂,不一样地区的用户访问网站时,速度差异也极大。
特征:采用 CDN 和反向代理加快系统的静态资源访问速度。
描述:CDN 和反向代理的基本原理都是缓存,区别在于 CDN 部署在网络提供商的机房,使用户在请求网站服务时,能够从距离本身最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器时反向代理服务器,若是反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
2.7. 分布式文件系统和分布式数据库
问题:随着大型网站业务持续增加,数据库通过读写分离,从一台服务器拆分为两台服务器,依然不能知足需求。
特征:数据库采用分布式数据库,文件系统采用分布式文件系统。
描述:分布式数据库是数据库拆分的最后方法,只有在单表数据规模很是庞大的时候才使用。不到不得已时,更经常使用的数据库拆分手段是业务分库,将不一样的业务数据库部署在不一样的物理服务器上。
2.8. 使用 NoSQL 和搜索引擎
问题:随着网站业务愈来愈复杂,对数据存储和检索的需求也愈来愈复杂。
特征:系统引入 NoSQL 数据库及搜索引擎。
描述:NoSQL 数据库及搜索引擎对可伸缩的分布式特性具备更好的支持。应用服务器经过统一数据访问模块访问各类数据,减轻应用程序管理诸多数据源的麻烦。
2.9. 业务拆分
问题:大型网站的业务场景日益复杂,分为多个产品线。
特征:采用分而治之的手段将整个网站业务分红不一样的产品线。系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。
描述:应用之间能够经过超连接创建关系,也能够经过消息队列进行数据分发,固然更多的仍是经过访问同一个数据存储系统来构成一个关联的完整系统。
纵向拆分:将一个大应用拆分为多个小应用,若是新业务较为独立,那么就直接将其设计部署为一个独立的 Web 应用系统。纵向拆分相对较为简单,经过梳理业务,将较少相关的业务剥离便可。
横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只须要调用这些分布式服务横向拆分须要识别可复用的业务,设计服务接口,规范服务依赖关系。
2.10. 分布式服务
问题:随着业务越拆越小,存储系统愈来愈庞大,应用系统总体复杂程度呈指数级上升,部署维护愈来愈困难。因为全部应用要和全部数据库系统链接,最终致使数据库链接资源不足,拒绝服务。
特征:公共业务提取出来,独立部署。由这些可复用的业务链接数据库,经过分布式服务提供共用业务服务。
3. 大型网站架构模式
3.1. 分层
大型网站架构中常采用分层结构,将软件系统分为应用层、服务层、数据层:
- 应用层 - 负责具体业务和视图展现。如网站首页及搜索输入和结果展现。
- 服务层 - 为应用层提供服务支持。如用户管理服务、购物车服务等。
- 应用层 - 提供数据存储访问服务。如数据库、缓存、文件、搜索引擎等。
分层架构的约束:禁止跨层次的调用(应用层直接调用数据层)及逆向调用(数据层调用服务层,或者服务层调用应用层)。
分层结构内部还能够继续分层,如应用能够再细分为视图层和业务逻辑层;服务层也能够细分为数据接口层和逻辑处理层。
3.2. 分割
将不一样的功能和服务分割开来,包装成高内聚低耦合的模块单元。这有助于软件的开发和维护,便于不一样模块的分布式部署,提升网站的并发处理能力和功能扩展能力。
3.3. 分布式
大于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不一样模块部署在不一样的服务器上,经过远程调用协同工做。
分布式意味能够用更多的机器工做,那么 CPU、内存、存储资源也就更丰富,可以处理的并发访问和数据量就越大,进而可以为更多的用户提供服务。
分布式也引入了一些问题:
- 服务调用必须经过网络,网络延迟会影响性能
- 服务器越多,宕机几率也越大,是可用性下降
- 数据一致性很是困难,分布式事务也难以保证
- 网站依赖错综复杂,开发管理维护困难
经常使用的分布式方案:
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
3.4. 集群
集群即多台服务器部署相同应用构成一个集群,经过负载均衡设备共同对外提供服务。
集群须要具有伸缩性和故障转移机制:伸缩性是指能够根据用户访问量向集群添加或减小机器;故障转移是指,当某台机器出现故障时,负载均衡设备或失效转移机制将请求转发到集群中的其余机器上,从而不影响用户使用。
3.5. 缓存
缓存就是将数据存放在距离最近的位置以加快处理速度。缓存是改善软件性能的第一手段。
网站应用中,缓存除了能够加快数据访问速度之外,还能够减轻后端应用和数据存储的负载压力。
常见缓存手段:
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
使用缓存有两个前提:
- 数据访问热点不均匀,频繁访问的数据应该放在缓存中
- 数据在某个时间段有效,不过很快过时,不然缓存数据会因已经失效而产生脏读
3.6. 异步
软件发展的一个重要目标和驱动力是下降软件耦合性。事物之间直接关系越少,彼此影响就越小,也就更容易独立发展。
大型网站架构中,系统解耦的手段除了分层、分割、分布式等,还有一个重要手段——异步。
业务间的消息传递不是同步调用,而是将一个业务操做拆分红多阶段,每一个阶段间经过共享数据的方式异步执行进行协做。
- 在单一服务器内部可经过多线程共享内存队列的方式实现异步,处在业务操做前面的线程将操做输出到队列,后面的线程从队列中读取数据进行处理;
- 在分布式系统中,多个服务器集群经过分布式消息队列实现异步。
异步架构是典型的生产者消费模式,两者不存在直接调用。异步消息队列还有以下特性:
- 提升系统可用性
- 加快响应速度
- 消除并发访问高峰
3.7. 冗余
大型网站,出现服务器宕机是必然事件。要保证部分服务器宕机的状况下网站依然能够继续服务,不丢失数据,就须要必定程度的服务器冗余运行,数据冗余备份。这样当某台服务器宕机是,能够将其上的服务和数据访问转移到其余机器上。
访问和负载很小的服务也必须部署 至少两台服务器构成一个集群,目的就是经过冗余实现服务高可用。数据除了按期备份,存档保存,实现 冷备份 外;为了保证在线业务高可用,还须要对数据库进行主从分离,实时同步实现 热备份。
为了抵御地震、海啸等不可抗因素致使的网站彻底瘫痪,某些大型网站会对整个数据中心进行备份,全球范围内部署 灾备数据中心。网站程序和数据实时同步到多个灾备数据中心。
3.8. 自动化
大型网站架构的自动化架构设计主要集中在发布运维方面:
- 发布过程自动化
- 自动化代码管理
- 自动化测试
- 自动化安全监测
- 自动化部署
- 运维自动化
- 自动化监控
- 自动化报警
- 自动化失效转移
- 自动化失效恢复
- 自动化降级
- 自动化分配资源
3.9. 安全
- 密码 和 手机校验码 进行身份认证
- 登陆、交易等重要操做须要对网络通讯进行 加密,存储的敏感数据如用户信息等也进行加密处理
- 防止机器人程序攻击网站,使用 验证码 进行识别
- 对常见用于 攻击 网站的 XSS 攻击、SQL 注入、进行编码转换等相应处理
- 对垃圾信息、敏感信息进行 过滤
- 对交易转帐等重要操做根据交易模式和交易信息进行 风险控制
4. 大型网站核心架构要素
架构 的一种通俗说法是:最高层次的规划,难以改变的决定。
除了系统功能需求外,架构还须要关注如下架构要素:
4.1. 性能
性能问题无处不在,因此网站性能优化手段也十分繁多:
- 前端
- 浏览器缓存
- 静态资源压缩
- 合理布局页面
- 减小 cookie 传输
- CDN
- 应用服务器
- 本地缓存
- 分布式缓存
- 异步消息队列
- 集群
- 代码层面:使用多线程、改善内存管理
- 数据库
- 索引
- 数据库缓存
- SQL 优化
4.2. 可用性
可用性指部分服务器出现故障时,还可否对用户提供服务
- 冗余自动化:经过预发布验证、自动化测试、自动化发布、灰度发布等手段,减小将故障引入线上环境的可能
- 经过负载均衡设备创建集群共同对外提供服务
- 数据存储在多台服务器,互相备份
4.3. 伸缩性
衡量伸缩的标准就是是否能够用多台服务器构建集群,是否容易向集群中增删服务器节点。增删服务器节点后是否能够提供和以前无差异的服务。集群中可容纳的总服务器数是否有限制。
- 应用服务器集群 - 只要服务器上保存数据,则全部服务器都是对等的,经过负载均衡设备向集群中不断加入服务器便可
- 缓存服务器集群 - 加入新的服务器可能会致使缓存路由失效,进而致使集群中的大部分缓存数据都没法访问。虽然缓存数据能够经过数据库从新加载,可是若是应用严重依赖缓存,可能会致使网站崩溃。须要改进缓存路由算法保证缓存数据的可访问性。
- 关系型数据库集群 - 关系型数据库虽然支持数据复制,主从热备等机制,可是很难作到大规模集群的可伸缩性,所以关系型数据库的集群伸缩性方案必须在数据库以外实现,经过路由分区等手段将部署有多个数据库的服务器组成一个集群。
- NOSql 数据库集群 - 因为先天就是为了应对海量数据而产生,所以对伸缩性的支持一般都很是好。
4.4. 扩展性
衡量扩展性的标准就是增长新的业务产品时,是否能够实现对现有产品透明无影响,不须要任何改动或不多改动,既有功能就能够上线新产品。主要手段有:事件驱动架构和分布式服务。
4.5. 安全性
安全性保护网站不受恶意攻击,保护网站重要数据不被窃取。
【博客福利】Java高级资料免费免费领取,须要的本身领取,一共30G。
传送门: https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q