【读书笔记】2016.12.10 《构建高性能Web站点》
分享提纲:
1. 概述
1.1)【该书信息】
《构建高性能Web站点》:
-- 百度百科
-- 本书目录:
第1章 绪论
1.1 等待的真相
1.2 瓶颈在哪里
1.3 增加带宽
1.4 减少网页中的HTTP请求
1.5 加快服务器脚本计算速度
1.6 使用动态内容缓存
1.7 使用数据缓存
1.8 将动态内容静态化
1.9 更换Web服务器软件
1.10 页面组件分离
1.11 合理部署服务器
1.12 使用负载均衡
1.13 优化数据库
1.14 考虑可扩展性
1.15 减少视觉等待
第2章 数据的网络传输
2.1 分层网络模型
2.2 带宽
2.3 响应时间
2.4 互联互通
第3章 服务器并发处理能力
3.1 吞吐率
3.2 CPU并发计算
3.3 系统调用
3.4 内存分配
3.5 持久连接
3.6 I/O模型
3.7 服务器并发策略
第4章 动态内容缓存
4.1 重复的开销
4.2 缓存与速度
4.3 页面缓存
4.4 局部无缓存
4.5 静态化内容
第5章 动态脚本加速
5.1 opcode缓存
5.2 解释器扩展模块
5.3 脚本跟踪与分析
第6章 浏览器缓存
6.1 别忘了浏览器
6.2 缓存协商
6.3 彻底消灭请求
第7章 Web服务器缓存
7.1 URL映射
7.2 缓存响应内容
7.3 缓存文件描述符
第8章 反向代理缓存
8.1 传统代理
8.2 何为反向
8.3 在反向代理上创建缓存
8.4 小心穿过代理
8.5 流量分配
第9章 Web组件分离
9.1 备受争议的分离
9.2 因材施教
9.3 拥有不同的域名
9.4 浏览器并发数
9.5 发挥各自的潜力
第10章 分布式缓存
10.1 数据库的前端缓存区
10.2 使用memcached
10.3 读操作缓存
10.4 写操作缓存
10.5 监控状态
10.6 缓存扩展
第11章 数据库性能优化
11.1 友好的状态报告
11.2 正确使用索引
11.3 锁定与等待
11.4 事务性表的性能
11.5 使用查询缓存
11.6 临时表
11.7 线程池
11.8 反范式化设计
11.9 放弃关系型数据库
第12章 Web负载均衡
12.1 一些思考
12.2 HTTP重定向
12.3 DNS负载均衡
12.4 反向代理负载均衡
12.5 IP负载均衡
12.6 直接路由
12.7 IP隧道
12.8 考虑可用性
第13章 共享文件系统
13.1 网络共享
13.2 NFS
13.3 局限性
第14章 内容分发和同步
14.1 复制
14.2 SSH
14.3 WebDAV
14.4 rsync
14.5 Hashtree
14.6 分发还是同步
14.7 反向代理
第15章 分布式文件系统
15.1 文件系统
15.2 存储节点和追踪器
15.3 MogileFS
第16章 数据库扩展
16.1 复制和分离
16.2 垂直分区
16.3 水平分区
第17章 分布式计算
17.1 异步计算
17.2 并行计算
第18章 性能监控
18.1 实时监控
18.2 监控代理
18.3 系统监控
18.4 服务监控
18.5 响应时间监控
参考文献
索引
-- 下载地址
--【内容简介】:
《构建高性能Web站点(修订版)》是畅销修订版,围绕如何构建高性能Web站点,从多个方面、多个角度进行了全面的阐述,几乎涵盖了Web站点性能优化的所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存、脚本解释速度、页面组件分离、浏览器本地缓存、浏览器并发请求、文件的分发、数据库I/O优化、数据库访问、数据库分布式设计、负载均衡、分布式文件系统、性能监控等。在这些内容中充分抓住本质并结合实践,通过通俗易懂的文字和生动有趣的配图,让读者充分并深入理解高性能架构的真相。
--题外话:
这本书,我是在 微信读书app上看的,感觉很不错。可以分享想法,有计划还会买纸质的书,好好研读。
2. 知识点
1) 【函数追踪】
Xdebug的另一个重要跟踪功能便是函数跟踪,它可以根据程序在实际运行时的执行顺序,跟踪记录所有函数的执行时间,以及函数调用时的上下文,包括实际参数和返回值。没错,这听起来正是我们迫切需要的。
2) 【联合索引】
因为一次查询对于一个数据表只能使用一个索引
3) 【最左前缀】
你一定已经听说过“最左前缀”这个组合索引的基本原则
4)【数据库锁机制】
机制是影响查询性能的另一个重要因素。当有多个用户并发访问数据库中某一资源的时候,为了保证并发访问的一致性,数据库必须通过锁机制来协调这些访问。
5) 【第三范式】
第三范式要求在一个数据表中,非主键字段之间不能存在依赖关系
6)【不同层的负载均衡】
事实上,在数据链路层(第二层)、网络层(第三层)以及传输层(四层)都可以实现不同机制的负载均衡,但有所不同的是,这些负载均衡调度器的工作必须由Linux内核来完成
7) 【独享带宽】
这才叫独享带宽,它独享的是路由器的一部分出口带宽,而不是交换机的带宽,因为交换机本来就是各个端口独享带宽而互不影响。
8) 【中国互联网】
中国,由中国电信运营的互联网,也就是我们常说的“中国宽带互联网(CHINANET)”,它的骨干网络核心节点位于北京上地电信数据中心,它通过直接接入包括北京在内的国内8个重要城市节点,进而连接二级网络,然后层层延伸扩展,一直到周边城市、IDC、家庭宽带接入等。
9)【Nmon】
我们使用Nmon工具监视服务器每秒上下文切换次数。Nmon是一个非常不错的Linux性能监视工具
10) 【Apache多进程模型】
我们知道Apache这种多进程模型的开销限制了它的并发连接数,但是Apache也有自身的优势,比如从稳定性和兼容性的角度看,多进程模型的优势正体现在它相对安全的独立进程,任何一个子进程的崩溃都不会影响Aapche本身,Apache父进程可以创建新的子进程
11) 【脚本解释器】
脚本解释器通常运行在Web服务器的进程中(如Apache-prefork模型的子进程),或者以fastcgi进程的形式独立运行。
12)【PHP中引入Java】
举个例子,对于一些PHP开发者来说,要想直接在Web应用程序中引用Java类库,就得在PHP中加载Java扩展模块,
13) 【ESI】
ESI是由W3C制定的标准,它的语法非常类似于SSI(Server Side Includes),可以像SSI一样在网页中嵌入子页面,但不同的是,SSI是在Web服务器端组装内容,而ESI则是在HTTP代理服务器上组装内容,包括反向代理。
14) 【wordpress】
比如用Wordpress搭建的一个blog,动态内容和数据库完全可以通过UNIX Socket来建立更加快速的数据交换。
15)【数据库状态】
mysql> show status;
mysql> show innodb status;
show processlist命令
比如我们通过dig命令看到www.sina.com.cn指向了16台服务器
16)【索引的数据结构】
索引本身的数据结构(MySQL使用BTree、Hash以及RTree)决定了它们拥有非常高效的查找算法,我们基本上不用担心这部分的开销
17) 【创建索引的情况】
一般来说,如果一个字段出现在查询语句中基于行的选择、过滤或排序条件中,那么为该字段建立索引便是有价值的
18)【最左原则】
你一定已经听说过“最左前缀”这个组合索引的基本原则
19)【锁定和等待】
机制是影响查询性能的另一个重要因素。当有多个用户并发访问数据库中某一资源的时候,为了保证并发访问的一致性,数据库必须通过锁机制来协调这些访问
20)【反向代理nginx】
我们知道反向代理服务器工作在HTTP层面,对于所有HTTP请求都要亲自转
21)【粘滞回话】
我们需要做的就是调整调度策略,让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上,这种机制也称为粘滞会话(Sticky Sessions),要实现它的关键在于如何设计持续性调度算法。
22) 【持久性算法】
还可以利用Cookies机制来设计持久性算法,比如调度器将某个后端服务器的编号追加到写给用户的Cookies中,这样调度器便可以在该用户随后的请求中知道应该转发给哪台后端服务器。这样做可以更加细粒度地追踪到每一个用户,试想一下,当有很多用户隐藏在一个公开IP地址后面时,利用Cookies的持久性算法将显得更加有效。
23)【最好与本地无关】
在后端服务器上保存Session数据和本地化缓存,的确是一件不明智的事情,它使得后端服务器显得过于个性化,以至于和整个系统格格不入,如果允许的话,我们应该尽量避免这样的设计,比如采用分布式Session或者分布式缓存等,让后端服务器的应用尽量与本地无关,也可更好地适应环境
24)【IP负载均衡】
回忆一下网络分层模型,事实上,在数据链路层(第二层)、网络层(第三层)以及传输层(四层)都可以实现不同机制的负载均衡,但有所不同的是,这些负载均衡调度器的工作必须由Linux内核来完成
25) 【Iptables实现负载均衡】
说到iptables,最多的应用场景就是防火墙了,我几乎为每台Linux服务器都毫不犹豫地进行iptables防火墙配置
26) 【一个网卡多个IP】
一个网络接口理所当然地拥有一个IP地址,但是除此之外,我们还可以为它配置更多个IP地址,它们称为IP别名。这里的网络接口可以是物理网卡(如eth0、eth1),也可以是虚拟接口(如回环网络接口lo)。根据规定,一个网络接口最多可以设置256个IP别名,没错,你可以把一个C类网段的所有IP地址都设置到一个网卡上,理论上没有任何问题。
你也许已经张大了嘴巴,一个网卡竟然可以设置多个IP地址,并且拥有同样的MAC地址,没错,它们可以很好地工作。
27) 【LVS-DR.DNS-RR】
幸运的是,对于LVS-DR,一旦调度器失效,你可以马上将LVS-DR切换到DNS-RR模式,这几乎只需要增加几条DNS记录,将域名解析到多台实际服务器的真实IP地址即可。一旦调度器恢复后,你便可以再次修改DNS记录,将域名仅指向调度器,切换回LVS-DR。
28)【基于IP隧道的请求转发】
与LVS-DR的原理非常类似,基于IP隧道(IP Tunneling)的负载均衡系统同样可以用LVS来实现,也称为LVS-TUN。
29)【共享文件系统】
对于共享文件系统的实现,常用的有NFS(Network File System)和Samba
30)【RPC】
对于传输层,RPC服务默认使用了UDP,
31)【SSH】
提到SSH(Secure Shell),大家并不陌生,它是建立在应用层和传输层基础上的安全协议,可以用于传输任何数据,我们希望用它来实现文件复制,当然,这属于主动分发的方式。
32)【实现文件分发的http扩展协议 WebDAV】
WebDAV的设计目的还包括了对于版本控制的支持,还记得Subversion的HTTP工作方式吗?它便是使用WebDAV来实现的。
33)【更新上级目录时间】
操作系统本身对于文件的修改并不会自动更新上级目录的修改时间,一些特定的应用程序会这样做,比如通过VI编辑某个文件并保存后,你会发现它的所有上级目录都会自动更新修改时间。那么,对于文件同步,我们也必须想办法自己来实现。
34) 【降低开销,提高扩展】
越是响应数据包远远超过请求数据包的服务(如视频),就越应该降低调度器转移请求的开销,也就越能够提高整体扩展能力,最终也就越依赖于WAN出口带宽
35)【MogileFS】
MogileFS是一个开源的分布式文件系统,它采用Perl编写,包括追踪器、存储节点,以及一些管理工具,除此之外,追踪器使用MySQL来存储分布式文件系统运行中的所有信息。
36)【MySQL主从复制】
我们以MySQL为例,它支持主从复制,配置并不复杂,简单地说,你只需要做到以下两点:
● 开启主服务器上的二进制日志(log-bin)。
● 在主服务器和从服务器上分别进行简单的配置和授权。
我们知道,MySQL的主从复制是依据主服务器的二进制日志进行的,也就是说主服务器日志中记录的操作会在从服务器上进行重放,从而实现复制,所以主服务器必须开启二进制日志,它会自动记录所有对数据库产生更新的操作,也包括潜在的更新操作,比如没有删除任何实际记录的DELETE操作。
显然,这种复制是异步进行
37)【数据库反向代理】
使用数据库反向代理
如果你在使用MySQL,那么可以尝试MySQL Proxy,它工作在应用程序和MySQL服务器之间,负责所有请求和响应数据的转发
38)【站点成长】
事实上,很多大规模的站点基本上都经历了从简单主从复制到垂直分区,再到水平分区的步骤,这是一个必然的成长过程
39)【分区反向代理】
分区反向代理
还记得前面提到的MySQL Proxy吗?它帮助应用程序实现了读写分离,而在这里,另一个开源产品Spock Proxy也起到了类似的作用,它可以帮助应用程序实现水平分区的访问调度,这意味着我们不需要在应用程序中维护那些分区对应关系了。
40) 【Gearman】
Gearman是一个开源产品,它的初衷是用来实现远程函数调用,这样一来,它便可以将计算转移到其他服务器上,而这一切都巧妙地隐藏在它提供的API中
41)【Map/Reduce】
但是存在一定的并行计算框架,我们来看随后介绍的Map/Reduce。
42)【Nmon】
Nmon是一款工作在服务器本地的实时监控软件,它可以提供时间间隔为秒的系统监控
43)【监控中心】
当然,我们还需要建立监控中心,对这些状态数据进行统计和呈现。幸运的是,有很多开源产品可以帮助我们,这里我们主要以Cacti为例,它完全可以支持刚刚提到的这些系统监控,并且绘制出相应的图表,便于我们浏览。
Cacti采用RRDtool作为监控数据的存储引擎,它是一种专门针对绘制坐标图而设计的存储格式,相对于其他存储结构来说要节省很多存储空间,这为我们长期监控大量服务器提供
3. 待整理点
4. 参考文档
- 作者:天行健·自强不息
- 出处:http://www.cnblogs.com/aiweixiao/
- 本文版权归作者和博客园共有,欢迎转载,如需联系 sishuinianhua369#126.com
如果您觉得本文对您的学习有所帮助,可通过微信或者支付宝 来打赏博主,增加博主的写作动力
微信支付 支付宝支付