《大型网站技术架构:核心原理与案例分析》读书笔记(一)
1.大型网站架构演化
1.1 大型网站软件系统的特点
高并发、大流量
高可用
海量数据
用户分布广泛,网络情况复杂
安全环境恶劣
需求快速变更,发布频繁
渐进式发展
1.2 大型网站架构沿海发展历程
初始阶段的网站架构:
应用程序,数据库,文件等所有资源都在一台服务器上,通常汇集各种免费开源软件,LAMP
应用服务和数据服务分离:
三台服务器:应用服务器,文件服务器,数据库服务器
三台服务器硬件资源配置要求:
应用服务器:需要处理大量业务逻辑=》更快更强大的CPU
数据库服务器:需要快速磁盘检索和数据缓存=》更快的硬盘和更大的内存
文件服务器:需要存储大量用户上传的文件=》更大的硬盘
2.大型网站架构模式
2.1网站架构模式
分层
应用层 负责具体业务和试图展示,如网站首页及搜索输入和结果展示
服务层 为应用层提供服务支持,如用户管理服务,购物车服务等
数据层 提供数据存储访问服务,如数据库、缓存、文件、搜索引擎等
细分层
应用层:视图层(美工负责),业务逻辑层(工程师负责)
服务层:数据接口层(适配各种输入和输出的数据格式),逻辑处理层
分割
分层式将软件在横向方面的切分,分割时在纵向方面对软件进行切分
将不同功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有助于按软件的开发和维护,另一方面,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
分布式
对于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。
常用的分布式方案:
分布式应用和服务
分布式静态资源
分布式数据和存储
分布式计算
分布式配置
分布式锁
分布式文件
集群
将独立部署的服务器集群化,即将多台服务器部署相同应用,构成一个集群,通过负载均衡设备共同对外提供服务。
3.大型网站核心架构要素
性能
可用性
伸缩性
扩展性
安全性
4.瞬时响应:网站的高性能架构
4.1 网站性能测试
系统操作响应时间表
操作 响应时间
打开一个网站 几秒
在数据库查询一条记录(有索引) 十几毫秒
机械磁盘一次寻址定位 4毫秒
从机械磁盘顺序读取1MB数据 2毫秒
从SSD磁盘顺序读取1MB数据 0.3毫秒
从远程分布式缓存Redis读取一个数据 0.5毫秒
从内存中读取1MB数据 十几微秒
Java程序本地方法调用 几微秒
网络传输2KB数据 1微秒
4.2 Web前端性能优化
浏览器访问优化
减少http请求:合并css,合并JavaScript,合并图片。
使用浏览器缓存:设置HTTP Header中Cache-Control和Expires属性,对css,js,lo,图标等静态资源文件进行缓存,缓存时间可以是数天甚至几个月。批量更新静态资源时需足部更新,有一定时间间隔,一面用户浏览器突然大量缓存失效,造成服务器负载突增。
启用压缩:在服务器端对文件进行压缩,在浏览器端对文件解压。
css放在页面最上面,js放在页面最下面:页面下载完css后进行渲染,css在最上面尽快渲染,然后进行js加载。
减少Cookie传输:cookie包含在每次请求和响应中,写入cookie中的数据要慎重,一面数据传输。对于静态资源访问,发送cookie无意义,可考虑静态资源独立域名访问,避免请求时发送cookie。
4.3 应用服务器性能优化
分布式缓存
网站性能优化第一定律:优先考虑使用缓存优化性能。
(1)缓存的基本原理:缓存指将数据存储在相对高访问速度的存储介质中,以供系统处理,一方面缓存访问速度快,可以减少数据访问时间,另一方面如果缓存的数据经过计算处理得到的,那么被缓存的数据无需重复计算即可直接使用,减少计算时间。
缓存的本质时一个内存Hash表,网站应用中,数据缓存以一对key、value的形式存储在内存Hash表中。Hash表数据读写的时间复杂度位O(1);
(2)合理使用缓存:
频繁修改的数据:数据的读写比在2:1以上,即写入一次缓存,在数据更新前至少读取2次以上,缓存才有意义。
没有热点的访问:若应用系统访问数没有热点,不遵循二八定律,那么缓存就没有意义,因大部分数据还没被再次访问就被挤出缓存了。
数据不一致与脏读:一般对缓存的数据设置失效时间,一旦超过失效时间,就从数据库中重新加载,应用要容忍一定时间的数据不一致,这种延迟时可以被接受的,但具体应用需慎重对待。
缓存可用性:缓存时为了提高数据读取性能,缓存数据对视或者缓存不可用不会影响到应用程序的处理,它可以从数据库直接获取数据,但随者业务发展,缓存会承担大部分数据访问的压力,当缓存服务崩溃时,数据库会承受不住压力而宕机。通过分布式缓存服务集群,将缓存数据分布到集群多台服务器上可在一定程度上改善缓存性能。当一台缓存服务器宕机的时候,只有部分缓存数据丢失,重新从数据库加载这部分数据不会对数据库产生很大影响。
缓存预热:缓存中存放的是热点数据,热点数据又是缓存系统利用LRU(最近醉酒未用算法)。新启动的缓存系统,在重建缓存数据过程中加载好热点数据。
缓存穿透:如果因为不恰当的业务或恶意攻击,持续高并发请求某个不存在的数据,由于缓存没有保存该数据,所有请求会落在数据库上,会对数据库造成很大压力,甚至崩溃。对策是将不存在的数据缓存起来,其值为null
(3)分布式缓存架构:分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种,一种以JBoss Cache为代表的需要风险同步的分布式缓存,一种以Memcached为代表不互相通信的分布式缓存。
JBoss Cache:在集群中所有服务器中保存相同的缓存数据,当某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存数据或清除缓存数据。多见于企业应用系统中,很少在大型网站中使用。
Memcached:采用一种集中式的缓存集群管理,互不通信的分布式架构方式,缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据,缓存服务器之间不通信,缓存集群的规模可以很容易地实现扩容,具有莱昂和的可伸缩性。
Memcached:被大量网站使用
简单的通信协议:Memcached使用TCP协议(UDP也支持)通信,其序列号协议则是一套基于文本的自定义协议,非常简单,一个命令关键词开头,后面是一组命令操作数。
丰富的客户端程序:只要支持该协议的客户端都可以和Memcached服务通信。
高性能的网络通信:Memcached服务通信模块基于Libevent,一个支持事件触发的网络通信程序库。
高效的内存管理:内存碎片管理对策是固定空间分配。
互不通信的服务器集群架构:客户端路由算法一致性Hash称为数据存储伸缩性架构设计的经典凡是。集群内服务器互不通信使得集群可以做到几乎无限制的线性伸缩。
4.4 存储性能优化
B+树:一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到所需的数据。
LSM树:一个N阶合并树,数据写操作都在内存中进行,并且都会创建一个新纪录,这些数据在内存中仍然还是一棵排序树,当数据量超过设定的内存阈值后,会将这棵排序树和磁盘上最新的排序树合并。当这棵排序树的数据量超过设定阈值后,和磁盘上下一级的排序树合并。合并过程中,会用最新的数据覆盖旧数据。
在LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树。当数据访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大程度地减少磁盘访问次数,加快访问速度。
许多NoSQL产品采用LSM树作为主要数据结构。B+树不是关系数据库所独有的,NoSQL数据库也可使用B+树,同理关系数据库也可使用LSM。
HDFS:(Hadoop分布式文件系统)中,系统在整个存储集群的多台服务器上进行数据并发读写和备份,可看作在服务器集群规模上实现类似RAID的功能。HDFS以块为单位管理文件内容,一个文件被分割成若干个块,当应用程序写文本时,没写完一个块,HDFS就将其自动赋值到另外两台机器上,保证每个块有三个副本,即使有两台服务宕机,数据依然可以访问,相当于实现RAID1大数据复制功能
翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内) 译
浙公网安备 33010602011771号