大型网站技术架构—核心原理与案例分析
大型网站
特点
- 高并发,大流量
- 高可用
- 海量数据
- 渐进式发展
发展历程
大型网站的发展随着业务需求渐进式变化。
演化价值观
业务发展是驱动大型网站技术发展的主要力量。伴随着业务的逐步发展,小网站慢慢演化为一个大型网站,而不可能从无到有搭建一个大型网站
大型网站架构模式
-
分层
目的:分层架构便于将系统分开部署,分工合作开发和维护;便于调用可以复用的服务 -
分割
分割是纵向切分,按照网站的业务进行划分开来,将各模块包装成高内聚低耦合的单元。比如将网站业务划分为搜索,账户,登陆等。
目的:便于开发和维护,不同模块之间不会干扰;便于模块的分布式部署,提高网站的并发能力和功能扩展能力。 -
分布式
分割分层的目的还是为了将系统切分后进行分布式部署。不同模块部署在不同服务器上,能够利用更多的计算机资源完成任务。
问题:网络调用需要通过网络,影响性能;一台服务器宕机可能导致比无法提供服务,导致系统出现问题;数据的一致性问题。
常用方案:分布式应用和服务;分布式静态资源;分布式数据和存储;分布式计算
-
集群
集群和分布式的区别在于集群里每台服务器不是相同的应用程序,有些应用经常要被访问,需要多台服务器分担响应的负担,通过负载均衡设备共同对外提供服务。
目的:分担服务器负担,加快响应。 -
缓存
将数据存储在访问速度较快的节点上。
实现方法:CDN,反向代理,本地缓存,分布式缓存; -
异步
异步操作与同步区别在于调用其他方法之后,不需要等其返回结果,而直接执行下面的任务。
目的:加快响应速度,消除并发高峰,提高系统可用性。但可能对业务流程造成影响。消息队列里的任务不一定能完成,但完成结果已经提前返回。 -
冗余
服务器冗余运行,数据库冗余备份(冷备份,热备份,灾备数据中心)。 -
自动化
自动化发布,自动化检测, 自动化测试,减少人为操作带来的失误、 -
安全
手机验证登陆,密码,验证码
网站结构
性能
性能测试指标:响应时间,并发数量,负载能力,吞吐量,性能计数器(服务器或者操作系统的数据指标)
性能测试方法:负载测试,压力测试,稳定性测试
优化策略:环节分析(分析时延较长的环节),性能优化
web前端性能优化
- 浏览器访问优化
- 减少http请求。http无状态应用协议,通信链路连接建立成本较高。
- 使用浏览器缓存。
- 压缩
- 减少Cookie传输
- CDN加速
- 反向代理
保护服务器,在客户端和服务器端建立安全屏障。反向代理服务器上配置缓存服务,存储静态资源。
应用服务器性能优化
-
缓存
网站性能优化第一定律:优先考虑使用缓存优化性能。数据缓存建立在二八定律上,通常情况下80%的请求访问20%的数据。当出现 频繁修改数据,没有热点访问 缓存效率降低 -
分布式缓存架构
- Jboss cache 互相同步
- Memcached 不需要
-
异步操作
使用消息队列实现操作异步化。当请求高峰期时,用户写入请求对数据库将造成巨大压力,造成响应缓慢。使用消息队列,用户请求发送后会立即得到反馈,请求进入消息队列后,由消费者进程读取消息执行相应的操作。以此实现异步操作。 -
集群
-
代码优化
-
多线程处理多用户并发访问,每个用户请求用一个线程处理。原因:IO阻塞和多CPU,多线程可以最大限度使用CPU。
-
资源复用减少开销大的系统资源的创建和销毁,数据库连接、网络通信连接、线程等。从编程角度分两种模式:单例模式和对象池。对象池复用对象实例,减少对象的创建以及资源消耗。
-
数据结构 hash表加快数据的读写性能。
-
垃圾回收机制 理解JVM中的垃圾回收机制,当内存中的对象失效后更快的收集,以释放内存。
-
存储优化
-
机械硬盘 & 固态硬盘
机械硬盘:马达驱动磁头臂,将磁头带到磁盘指定位置访问该位置数据,随机访问时效率低下,顺序访问时高。
固态硬盘:可以快速随机访问,噪声、震动小。 -
B+树 & LSM树
-
RAID & HDFS
RAID:数据分开并行写入多块磁盘中。
HDFS:具有高度容错性的Hadoop分布式文件系统
网站的高可用架构
网站可用性度量和考核
可用性度量:不可用时间描述,99%,全年有1%的时间不可用。
可用性考核:对网站故障进行分类加权计算故障大小,故障时间*权重
高可用的网站架构
- 硬件故障是常态,在保证硬件故障时服务仍然可用,数据依然保存能够被访问。
- 手段:数据和服务的冗余备份和失效转移。
- 高可用架构:网站结构分层,应用层、数据层、服务层。不同层部署在不同的集群上,同一层,可以再细粒度划分。
- 应用层:使用负载均衡设备将一组服务器组成一个集群对外提供服务,当一台服务器不可用时候,从集群列表删除。保持集群整体的高可用。
- 服务层:集群,应用层通过分布式服务调用框架访问服务层服务。
- 数据层:冗余备份。
高可用的应用
- 负载均衡实现无状态服务的失效转移
- 应用服务器集群的Session管理
- session复制
- session绑定
- session服务器
高可用的服务
为各种业务提供基础公共服务。
- 分级管理 核心服务和应用使用更好的硬件
- 超时设置 服务响应超时时进行重试或者进行采用其他操作,防止继续占用系统资源
- 异步调用
- 服务降级 用户高并发访问某应用时候,可以拒绝不重要的服务或者关闭部分不重要的功能。
- 幂等性设计 应用调用服务如果成功,但是由于网络原因,应用没有得到及时响应,可能会重复调用,导致业务出现问题。比如转账。因此保证这些业务一次调用和多次调用的结果具有一致性。
高可用的数据
方法:冗余备份和失效转移
- 数据备份:
- 热备份
- 异步热备方式 异步写入从存储服务器
- 同步热备方式 同步写入从存储服务器
- 冷备份
- 热备份
- 失效转移
步骤:失效确认,访问转移,数据恢复
失效确认:心跳检测、应用程序访问失败报告。
高可用网站的软件质量保证
网站运行监控
网站的伸缩性架构
不改变网站的软硬件设计,仅仅通过改变部署的服务器的数量就扩大或者缩小网站的处理能力。
- 不同功能进行物理分离实现伸缩
- 单一功能通过集群规模实现伸缩
应用服务器的集群的伸缩性设计
-
HTTP重定向负载均衡。 评价:简单。负载均衡效果取决于重定向服务器的性能,并且客户端需要两次像服务器发送请求,性能较低。包括DNS域名解析实际上为三次发送请求。
-
DNS域名解析负载均衡。评价:简单,省去了单独维护管理负载均衡服务器的麻烦,DNS服务器支持基于地理位置的域名解析,返回离用户最近的服务器的IP地址。缺点是DNS负载均衡的控制权在域名服务商,不易管理。通常DNS服务器作为第一层负载均衡服务器,返回的IP地址对应的服务器为第二层负载均衡服务器,而不是真正访问的服务器。
-
反向代理服务均衡。反向代理服务器作为负载均衡服务器,将访问请求分发到后面的web服务器。评价:优点简单,反向代理服务器和负载均衡服务器集成,缺点反向代理服务器可能成为性能瓶颈。
-
IP负载均衡。修改访问的IP地址,请求包到达内网时修改IP地址,响应包出内网时改为原来的IP地址,对外透明。评价:优点部署简单,在内核进程中完成数据分发,性能较好。缺点响应包也需要经过负载均衡服务器,当有高并发访问时,负载均衡服务器出现瓶颈。
-
数据链路层负载均衡。
-
负载均衡算法
轮询、加权轮询、随机、最少连接、原地址散列
分布式缓存集群的伸缩性设计
- 余数hash算法 无法实现伸缩
- 一致性hash算法 可以实现伸缩,但不能完成绝对的负载均衡
- 虚拟层上实现hash算法 能够基本实现负载均衡
数据存储服务器集群的伸缩性设计
网站的可扩展架构
网站的安全架构
- 攻击防御
- XSS攻击 跨站点脚本攻击 反射型、持久性;诱使用户点击含有恶意脚本的链接,执行响应操作
- CSRF攻击 跨站点请求伪造 ,伪造用户请求,诱使用户以合法身份进行非法操作
- SQL注入
- 信息加密
- 单向散列加密 密码保存
- 对称加密
- 非对称加密
- 密钥管理 分布式存储密钥,将密钥切片分开存储。
- 信息过滤与反垃圾
- 文本匹配 Trie树
- 反垃圾 分类算法(贝叶斯等)
- 黑名单 布隆过滤器
- 风险控制
- 风险:买家,卖家,平台,交易四种风险。
- 控制:规则引擎,统计模型