大型网站软件特点
- 高并发
- 高并发用户,大流量访问
- 高可用
- 系统24小时不间断服务
- 海量数据
- 存储/管理海量数据
- 网络复杂
- 服务用户范围广,网络情况千差万别
- 安全环境恶劣
- 互联网的开放性,导致网站更易受到攻击
大型网站架构发展历程
- 单机架构
应用程序/数据库/文件等资源都部署在一台服务器上
- 应用服务和数据服务分离
应用服务器/文件服务器/数据服务器分离
- 缓存改善网站性能
- 本地缓存: 访问速度快,受应用服务器内存限制,缓存数据有限
分布式缓存: 使用集群方式,理论上不受内存容量限制的缓存服务
- 应用服务器集群
通过负载均衡服务器,将用户访问请求分发到应用服务器集群中任何一台,若出现更多用户,就在集群中加入更多应用服务器,使应用服务器的负载不再成为网站瓶颈
- 数据库读写分离
数据库主从热备功能实现数据库读写分离
- 使用反向代理和CDN加速网站响应
- 反向代理: 基本原理是缓存,部署在网站的中心机房,用户请求到达中心机房后,首先访问反向代理服务器,若反向代理服务器缓存着用户请求的资源,就将其直接返回给用户
CDN: 基本原理是缓存,部署在网络提供商的机房,用户请求网站服务时,可从距离最近的网络提供商机房获取数据
- 使用分布式文件系统和分布式数据库系统
业务分库: 将不同业务数据库部署在不同的物理机上(分库分表)
- 使用NoSQL和搜索引擎
通过统一数据模块访问各种数据(聚合)
- 业务拆分
分而治之: 将网站拆分成不同应用,每个应用独立部署维护
- 分布式服务
抽象复用服务,搭建共用业务服务(基础服务)
网站架构设计误区
- 一味追随大公司的解决方案
- 因地制宜,不可一味盲从
- 为了技术而技术
- 脱离业务发展实际,一味追求新技术
- 企图用技术解决所有问题
- 技术是用来解决业务问题的,而业务问题也可以通过业务手段解决
网站架构模式
- 分层
- 概念: 将系统横向纬度切分为几个部分,每个部分负责相对单一的职责,然后通过上层对下层的依赖和调用组成一个完成的系统(如网络七层协议)
- 挑战: 合理规划层次边界及接口,严格遵循分层架构约束,禁止跨层次调用(应用层直接调用数据层)及逆向调用(数据层调用服务层或服务层调用应用层)
优点: 清晰的逻辑结构便于开发维护,各层之间具有一定独立性,只要维持调用接口不变,各层可根据具体问题独立演化发展而不需要其他层做出相应调整(扩展性)
- 分割
- 概念: 将系统纵向纬度切分,按不同业务进行分割(如:订单/库存/支付/搜索),也可更小粒度分割
- 优点: 便于开发维护,不同模块分布式部署,提高网站并发处理能力和功能扩展能力
- 分布式
- 分布式挑战
# 网络: 分布式意味着服务调用必须通过网络,这可能对性能造成严重影响
# 服务器宕机概率: 服务器越多,宕机几率越大,使网站可用性降低
# 数据一致性: 分布式环境中保持数据一致性非常困难,分布式事务也难以保证
# 可维护性: 分布式网站依赖错综复杂,开发管理维护困难
- 分布式方案
# 分布式应用和服务: 将分层和分割后的模块分布式部署,改善网站性能/并发性,加快开发和发布速度,减少数据库连接资源消耗,使不同应用复用共用服务,便于业务功能扩展
# 分布式静态资源: 静态资源分布式部署减轻应用服务器负载压力;使用独立域名加快浏览器并发加载的速度.(即常说的动静分离)
# 分布式数据和存储: 大型网站需要处理以P为单位的海量数据,单台计算机无法提供如此大的存储空间,需要分布式存储;除对传统关系数据库进行分布式部署外,为网站应用而生的NoSQL产品几乎都是分布式的
# 分布式文件系统: 支持云存储
# 分布式计算: 实时计算与非实时计算,如搜索引擎的索引构建/数据仓库的数据分析统计(如MapReduce及Storm)
# 分布式配置: 支持网站线上服务器配置实时更新(携程的开源分布式配置中心Apollo)
# 分布式锁: 实现并发和协同
- 集群
- 概念: 多台服务器相同应用构成一个集群,通过负载均衡服务器共同对外提供服务
- 优点: 提供更好并发特性,如:有更多用户访问时,只需向集群中加入新机器即可;提高系统可用性,如:某台服务器发生故障,负载均衡服务器或系统的失效转移机制将请求转发到集群中其他服务器上,使服务器故障不影响用户使用
- 缓存
- CDN: 即内容分发网络,部署在离用户最近的网络服务商,用户的请求先到达网络服务商,在这里缓存网站的一些静态资源,可就近最快速度返回给用户,如视频和门户网站将访问量大的热点内容缓存在CDN
- 反向代理: 用户请求到达网站的数据中心时,最先访问反向代理服务器,这里缓存网站的静态资源,无需将请求转发给应用服务器即可返回给用户
- 本地缓存: 应用服务器本地缓存热点数据(如Google的Guava或JDK的Caffeine)
- 分布式缓存: 将数据缓存在专门的分布式缓存集群中,应用通过网络通信访问缓存数据(如Redis)
- 异步
- 分类: 单机架构中内部通过多线程方式实现异步;分布式系统中通过分布式消息队列实现异步
- 优点: 提高系统可用性;加快网站响应速度;消除并发访问高峰
- 冗余
- 冷备份: 数据库定期备份,存档保存
- 热备份: 数据库主从复制,实时同步
- 灾备数据中心: 抵抗地震/海啸的那个不可抗力导致的网站瘫痪,需进行灾备
- 自动化
- 自动化代码管理
- 自动化测试
- 自动化安全检测
- 自动化部署
- 自动化监控
- 自动化报警
- 自动化失效转移
- 自动化失效恢复
- 自动化降级
- 自动化分配资源
- 安全
- 网络通信加密
- 垃圾及敏感信息过滤
- 风控
系统层次
- 基础服务层
- 提供数据库/缓存/存储/搜索等数据服务
- 平台服务/应用服务层
- 通过依赖调用和共享基础数据构成
- API/业务层
- 客户端和第三方应用
大型网站核心架构要素
- 性能
- 衡量网站性能有一系列指标,重要的有响应时间/TPS/系统性能计数器等
- 可用性
- 衡量一个系统架构设计是否满足高可用的目标,就是假设系统中任何一台或多台服务器宕机,以及出现各种不可预期的问题时,系统整体是否依然可用
- 伸缩性
- 所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求
- 衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群;是否容易向集群中添加新的服务器;加入新的服务器后是否可以提供和原来的服务器无差别的服务;集群中可容纳的总的服务器数量是否有限制
- 扩展性
- 衡量标准: 衡量网站架构扩展性好坏的主要标准就是在网站增加新的业务时,是否可以实现对现有业务透明无影响,不需要任何改动或很少改动既有业务就可以上线新业务
- 主要手段
# 事件驱动架构: 利用消息队列实现
# 分布式服务: 将业务和可复用服务分离,通过分布式服务框架调用
- 安全性
- 保护网站不受恶意访问和攻击,保护网站重要数据不被窃取
- 衡量网站安全架构的标准就是针对现存和潜在的各种攻击与窃密手段,是否有可靠的应对策略