构建高性能WEB站点

本书以apache服务器,PHP,MYSQL编程为例子在讲解,只能理解思路。具体用不上

1.绪论 ............................................................................................9

1.1等待的真相 ........................................................................9

·数据在网络上传输的时间

·站点服务器处理请求并生成回应数据的时间

·浏览器本地计算和渲染的时间

1.2瓶颈在哪里? ...................................................................... 10

一旦找到正真影响系统性能的主要因素,就要坚决对其进行调整或优化

1.3增加带宽 .........................................................................11

1.4减少网页中的HTTP 请求 ............................................................................................. 11

如何加快网页速度?

·设计简单的网页,使其包含较少的图片和脚本,但是就要牺牲美观

·将多个图片合并为一个文件,利用CSS背景图片的偏移技术呈现在网页中

·合并javascript脚本或者CSS样式

·充分利用HTTP中的浏览器端cache策略,减少重复下载

(大部分已经在这样做了,其他就是浏览器缓存策略了)

1.5加快服务器脚本计算速度 ............................................................................................. 12

1.6使用动态内容缓存 ......................................................................................................... 12

将动态内容的HTML输出结果缓存起来,在随后的一段时间内,当有用户访问时便跳过重复的动态内容计算而直接输出。

(研究试用)

1.7使用数据缓存 ..................................................................... 13

动态内容缓存是将数据和表现整体打包

(研究试用)

1.8将动态内容静态化 ......................................................................................................... 13

1.9更换Web 服务器软件 .................................................................................................. 13

1.10页面组件分离 ............................................................................................................... 14

1.11合理部署服务器 ........................................................................................................... 14

1.12使用负载均衡 ............................................................................................................... 15

承受压力到达极限时将流量合理转移到更多的服务器

方法:HTTP重定向,基于DNS的轮询解析,通过反向代理,LVS组建服务器群

(可以采取以上方法优化)

1.13优化数据库 ....................................................................... 15

频繁的数据库连接和释放无疑将导致数据访问等待时间加长

方法:使用数据库持久连接

设计关系数据库的表结构时,是否合理使用各种类型的索引

将数据散列在多台服务器,包括必要的冗余数据,来分散数据库的密集访问

(可以采取以上方法优化)

1.14考虑可扩展性 ............................................................................................................... 16

扩展方面:代码层面、架构层面

扩展性:不是速度和性能的概念,它是指当系统负载增大时,通过增加资源来提高性能的能力。

扩展时间:了解何时需要扩展,这离不开对站点性能的把握

1.15减少视觉等待 ............................................................................................................... 17

2.数据的网络传输 .............................................................................................................17

2.1分层网络模型 .......................................................................................................... 18

发展铁路运输..................................................................... 18

铺设铁路.........................................................................19

预约线路.........................................................................19

货物包.............................................................................19

调度站.............................................................................20

车流控制.........................................................................20

货物重发.........................................................................20

跨城运输.........................................................................21

城市互联.........................................................................21

火车站名称.....................................................................22

火车站地址转换............................................................................................................. 23

传输包.............................................................................23

产品包.............................................................................24

故事角色介绍..................................................................... 24

故事尾声.........................................................................27

2.2带宽 ...............................................................................27

数据如何发送?............................................................................................................. 28

一般经过几个环节:

[if !supportLists]1.[endif]应用程序首先得将要发送的数据写入该进程的内存地址空间中

[if !supportLists]2.[endif]应用程序通过系统函数库接口向内核发出系统调用,由系统内核进行随后的操作

,它将这些数据从用户态内存区复制到由内核维护的一段称为内核缓冲区的内存地址空间。

[if !supportLists]3.[endif]当数据写入内核缓冲区后,内核会通知网卡控制器前来取数据,同时CPU转而处理其他进程。

[if !supportLists]4.[endif]网卡缓冲区中的数据需要发送到线路中,同时释放缓冲区来获取更多要发送的数据。

[if !supportLists]5.[endif]发送时,网卡会使用内部特定的物理装置来生成可以传播的各种信号。

电磁波的速度..................................................................... 28

数据发送速度..................................................................... 29

为什么要限制带宽?..................................................................................................... 30

共享还是独享?............................................................................................................. 30

2.3响应时间 .......................................................................32

下载速度.........................................................................32

从服务器到达用户PC的数据库的多少

如何计算响应时间?..................................................................................................... 33

响应时间=发送时间 + 传播时间 + 处理时间

响应时间=(数据量比特数 / 宽带) + (传播距离 / 传播速度) + 处理时间

下载速度=数据量字节数 / 响应时间

一些习惯和约定............................................................................................................. 34

来一次实地计算............................................................................................................. 34

非理想因素:

·实际传输的文件数据要小于网络流量

·在交换节点中数据在转发队列中的等待时间

·写入磁盘

·长距离传播

·经过其他(路由器)节点设备,两次转发

2.4互联互通 .......................................................................37

8个核心节点城市:北京、沈阳、先、成都、上海、南京、广州、武汉

3.服务器并发处理能力 .............................................................................................. 39

3.1吞吐率 ...........................................................................39

吞吐量:单位时间内服务器处理的请求数。单位“reqs/s”“requests/sec”

查看方法:通过mod_status查看lighttpd的实时吞吐量

吞吐率和压力测试......................................................................................................... 40

吞吐率:服务器在实际运行期间单位时间内处理的请求书。

要关心的是最大吞吐量。

压力测试:通过模拟足够数目的并发用户数,分别持续发送一定的HTTP请求,并统计测试持续的总时间,计算出基于这种“压力”下的吞吐量,即为一个平均值。

压力测试的前提条件..................................................................................................... 41

·并发用户数

·总请求数

·请求资源描述

并发用户数.....................................................................41

并发数:某一时间段同时向服务器发送请求的用户总数。

最大并发用户数和最大并发连接数的决定因素从本质上说是不同的。

单位“Requests currently being processed”

查看方法:通过mod_status

请求等待时间..................................................................... 44

·用户平均请求等待时间

·服务器平均请求处理时间

硬件环境.........................................................................44

来一次压力测试............................................................................................................. 45

用apache2.2.11中附带的ab(ApacheBench),开始压力测试

测试注意的项目:

server software:web服务器软件名称

server hostname:请求的URL中的主机部分名称

Server port:被测试的WEB服务器软件的监听端口

Document path:请求的URL中的根绝对路径

Concurrency Level:并发用户数

Complete requests:总请求数

Failed requests:失败的请求数

Requests per second:吞吐量

(可以安装一下该软件,测试上面这些数据,方便优化后有对比)

继续压力测试..................................................................... 49

对不同的并发用户数进行测试,吞吐量越大越好,请求时间越短越好

影响这些的因素:除去服务器配置还有并发策略

并发策略:在服务器同时处理较多请求的时候,合理协调并充分利用CPU计算和I/O操作,使其在较大的并发用户数的情况下提供较高吞吐量。

(了解站点正在处理哪些性质的请求?)

3.2 CPU并发计算 ...........................................................................................................53

进程.................................................................................54

轻量级进程.....................................................................54

线程.................................................................................55

进程调度器.....................................................................55

进程优先级别可以由进程自己决定,进程调度器也可以动态调整他们的优先级

测试:用lighttpd的fastcgi,主要看PR和NI

系统负载.........................................................................57

系统负载越高,代表CPU越繁忙,越无法满足所有进程的需要。

查看方法:Top,W等工具

  Load average:98.26 , 46.89 , 17.94

进程切换.........................................................................58

进程切换:进程调度器在必要的时候挂起正在运行的进程,同时恢复以前挂起的某个进程。

有对应的数据分析图,此处没法输入,进入书本查看

IOWait ...........................................................................64

指CPU空间并且等待I/O操作完成的时间比例

锁竞争.............................................................................67

锁竞争:当一个任务占用资源的时候,锁住资源,其他任务都在等待锁的释放。

3.3系统调用 .........................................................................67

减少系统调用,减少降低请求处理时间

3.4内存分配 .........................................................................70

3.5持久连接 .........................................................................72

在一次TCP连接中持续发送多份数据而不断开连接,叫长连接,即持久连接。

连接次数越少,越有利性能的提升。

HTTP的长连接需要浏览器和WEB服务器的共同协作,缺一不可。

Connection:keep-alive:告诉服务器不要在处理完当前请求后就马上关闭连接。

3.6 I/O模型 .........................................................................76

PIO与DMA ...................................................................... 77

同步阻塞I/O ..................................................................... 77

同步非阻塞I/O ............................................................................................................. 78

多路I/O就绪通知 ........................................................................................................ 79

内存映射.........................................................................83

直接I/O .........................................................................84

sendfile .........................................................................85

异步I/O .........................................................................89

3.7服务器并发策略 .........................................................................................................89

一个进程处理一个连接,非阻塞I/O ......................................................................... 90

一个线程处理一个连接,非阻塞I/O ......................................................................... 93

一个进程处理多个连接,非阻塞I/O ......................................................................... 95

一个线程处理多个连接,异步I/O ........................................................................... 104

4.动态内容缓存 ..................................................................... 104

4.1重复的开销 ....................................................................... 105

4.2缓存与速度 ....................................................................... 106

缓存的目的:就是把需要花费昂贵开销的计算结果保存起来,在以后需要的时候直接取出,而避免重复计算。

缓存机制:整页缓存、局部缓存、数据缓存、解释器缓存、WEB服务器缓存等。

4.3页面缓存 .......................................................................107

将动态内容的计算结果进行缓存,并在随后需要的时候直接取出返回给用户。

缓存的内容实际上就是动态网页输出的HTML,动态图片和动态XML,也可以将它们的输出结果整体进行缓存。

Smarty缓存 ............................................................................................................... 108

PHP,使用smarty模板框架

缓存持久化与查找....................................................................................................... 110

不同参数生成不同的缓存文件,产生大量的文件,如果缓存文件的读写比较频繁的话,可能CPU使用率达到100%。可以使用支持目录HASH等加速目录遍历的文件系统来缓解该情况。缓存文件不会自动删除。

在smarty中,设置选择让缓存支持目录分级,而这个选项默认是关闭的

$this->smarty->use_sub_dirs = true

过期检查.......................................................................111

缓存不可能长期有效,何时过期?何时生成新的缓存?

实行过期检查策略:

对动态网页指定缓存有效期长度,比如设置1小时。

$this->smarty->cache_lifetime = 60*60;

放弃Smarty缓存? .................................................................................................. 113

在动态网页加载HTML缓存并终止程序之前,我们要让它尽可能只加载必要的其他文件,这些文件越少越好。

如果使用缓存的目的是为了跳过数据库的访问,在加载缓存之前,就将与数据库访问先关的库文件引用关闭掉。

把缓存放到内存中....................................................................................................... 117

借助PHP的APC模块,可以将任何PHP运行时的数据或对象缓存在内存中。

缓存服务器....................................................................... 119

可以将HTML缓存存储在一台独立的缓存服务器中,利用memcached,通过TCP将缓存存储在其他服务器中。Memcached会自动删除过期KEY,只需要在保存缓存数据时指定过期时间即可。

如何选择?....................................................................... 120

APC(本机内存)或memcached?

如果为缓存分配的内存空间不足,遍会降低性能。而内存配置达到了上限,就要考虑如何扩展缓存存储区。使用memcached来实现分布式缓存。

memcached不如本机内存速度快,出于多方面的考虑,结合站点规模,也许会觉得值得,首先WEN服务器本身的内存有限,无法大量拿来存储HTML缓存;其次,本机内存不具备良好的扩展性。

有效期取值....................................................................... 122

有效期太长,虽然缓存命中率提高了,但是动态网页的内容更新不能及时;而有效期如果太短,动态网页的内容能实时变化,但是频繁的创建缓存比没有缓存好不到哪里去。

缓存机制提供了一个有效的缓存控制途径,可以在任何时候强制清除缓存,这在动态内容更新频率较低的时候适合使用。

阅读的人远远多于撰写内容的人,就将缓存有效期设长些。

使用smarty的内置缓存方法

$this->smarty->clear_cache(‘place_posts.html’,’121882’)

4.4局部无缓存 ..............................................................................................................122

根据内容需要局部及时更新,比如统计、评论

Smarty中要实现局部无缓存,可以增加一个模板扩展标记,并且注册到smarty对象中

4.5静态化内容 ..............................................................................................................123

直接访问缓存............................................................................................................... 124

尽管静态化网页的性能要大大高于动态缓存的性能,但是它仍需要由动态程序来创建和更新。手动维护不现实。

一旦使用静态化网页的缓存方案后,之前说的缓存更新、过期检查就彻底颠覆。

一般会使用CMS来管理静态化内容。

更新策略.......................................................................126

·在数据更新时重新生成静态化内容

数据多时,将导致CMS系统的服务响应大幅降低。如果站点的静态化内容需要分发到更多的服务器,频繁的更新会给文件的同步带来较大的压力。

常见方法:引入延迟更新机制,将更新任务放入队列,一旦队列写满或者达到超时,便一次性将它们更新到磁盘。

·定时重新生成静态化内容

通过定时任务来执行,比如crontab或daemon程序,然后通过CMS系统进行管理。

可以指定范围的静态化内容进行重建。如热门的可以每个1分钟定时更新,对于不重要的内容可以延长更新时间。

这2种策略可以相互弥补。

(目前我们采用的就第一种方式,第二种虽然也在用,但是是人为的。可以研究试试。)

局部静态化....................................................................... 127

静态网页可可以不必整页更新,可以通过SSI(服务器端包含)技术实现各个局部页面的独立更新。节省了磁盘I/O开销。

SSI优点:提高页面重用性,提高可维护性

SSI缺点:需要查找include标签,需要大量的CPU开销。

5.动态脚本加速 ..............................................................................................................133

5.1 opcode缓存 ..............................................................................................................133

什么是opcode? .............................................................................................................133

生成opcode ............................................................................138

避免重复编译...................................................................... 140

5.2解释器扩展模块 ........................................................................................................... 149

5.3脚本跟踪与分析 ........................................................................................................... 151

代码段执行时间..................................................................... 151

上下文信息收集..................................................................... 152

代码覆盖范围.....................................................................153

函数跟踪.............................................................................154

瓶颈分析.............................................................................158

6.浏览器缓存 .....................................................................162

6.1别忘了浏览器 ............................................................................................................... 162

浏览器不只是用户的......................................................................................................... 162

尽可能的把WEB站点内容缓存在用户浏览器中,减少服务器开销

缓存放在哪里?........................................................................................................... 163

不同的浏览器采用不同的方式来缓存

IE在本地设置了临时文件目录

FF采用二进制存储方式来存储和管理缓存文件。在浏览器输入about:cache可查看

6.2缓存协商 .......................................................................168

如何协商?....................................................................... 169

当浏览器向WEB服务器请求一些内容时,WEB服务器需要告诉浏览器哪些内容可以被缓存。一旦浏览器知道某个内容可以缓存后,下次当浏览器需要请求这个内容时,它不会直接向服务器请求完整的内容,而是询问服务器是否可以使用本地的缓存,服务器在收到浏览器的询问后需要作出回应,到底是允许浏览器使用本地缓存还是将最新的内容传回浏览器。

做好协商的准备........................................................................................................... 169

对于post请求,浏览器一般不启用本地缓存

Last-Modified ............................................................................................................ 171

最后修改时间

处理浏览器的询问....................................................................................................... 172

另一种协商方法........................................................................................................... 174

ETag:采用一串编码来标记内容

让动态内容学会和浏览器交流................................................................................... 175

性能如何?....................................................................... 176

SSI和Last-Modified ............................................................................................... 182

6.3彻底消灭请求 ............................................................................................................... 183

浏览器缓存截止期....................................................................................................... 184

Expires指示内容过期的绝对时间

格式:Expires:Sun,10 feb 2002 16:00:00 GMT

对于静态内容,默认不会开启Expires,需要进行配置

如何请求页面?........................................................................................................... 185

Ctrl+F5:强制刷新,不使用缓存协商

F5:一般刷新,允许浏览器在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,能让Last-Modified发挥作用,但对Expires无效

单击浏览器地址栏的“转到”:Expires只对这种方式有效

添加Expires标记 ...................................................................................................... 185

对比三种请求方法....................................................................................................... 186

适应本地的过期时间................................................................................................... 187

Expires指定的过期时间是来自WEB服务器的系统时间,如果用户本地的时间和服务器时间不一致,那会影响到本地缓存的有效时间。

Cache-control弥补Expires的不足

Cache-control:max-age=

性能...............................................................................189

7.Web服务器缓存 ........................................................................................................... 190

7.1 URL映射 ......................................................................190

可地址重写

静态写到动态内容中

将请求转发给后端的其他WEB服务器

7.2缓存响应内容 .............................................................................................................. 191

准备好缓存区............................................................................................................... 191

将缓存内容存储在什么位置:本机内存、磁盘、其他服务器

缓存静态内容............................................................................................................... 192

使用了SSI的shtml和普通的HTML页面

缓存动态内容............................................................................................................... 195

控制有效期....................................................................... 196

要为动态内容指定缓存有效期,仍然是在HTTP响应头追加Expires标记

取而代之?....................................................................... 198

7.3缓存文件描述符 .......................................................................................................... 198

8.反向代理缓存 ..................................................................... 202

8.1传统代理 .......................................................................202

8.2何为反向? ....................................................................... 203

8.3在反向代理上创建缓存 ............................................................................................... 203

如果没有缓存............................................................................................................... 204

引入缓存.......................................................................209

修改缓存规则............................................................................................................... 212

清除缓存.......................................................................215

监控缓存命中率........................................................................................................... 216

从缓存命中率中寻找答案........................................................................................... 220

缓存命中率和后端吞吐率的理想计算模型............................................................... 222

ESI ................................................................................227

和动态内容缓存一起工作........................................................................................... 229

8.4小心穿过代理 ............................................................................................................... 230

8.5流量分配 .......................................................................232

[if !supportLists]9.[endif]Web组件分离 ............................................................................................................ 234

WEB组件:动态内容、图片、javascript、CSS等

WEB组件的差异:

·文件大小

·文件数量

·内容更新频率

·预计并发用户数

·是否需要脚本解释器

·是否涉及大量CPU计算

·是否访问数据库

·访问数据库的主要操作是读还是写

·是否包含远程调用RPC

采取方法:

·是否使用epoll模型

·是否使用sendfile()

·是否使用异步I/O

·是否支持HTTP持久连接

·是否需要opcode缓存

·是否使用动态内容缓存以及有效期为多长

·是否使用WEB服务器缓存以及有效期为多长

·是否使用浏览器缓存以及有效期为多长

·是否使用反向代理缓存以及有效期为多长

·是否使用负载均衡策略

9.1备受争议的分离 ........................................................................................................... 234

9.2因材施教 .......................................................................235

9.3拥有不同的域名 ........................................................................................................... 236

如何WEB组件分离?将对应的组件迁移到各自的服务器上

·使用二级域名:

·使用新顶级域名:当多个二级域名需要使用cookies的时候,启用新的顶级域名

这也是一种负载均衡的策略

(可以组件分离,把CSS或JS分离到独立二级域名,现在只有图片分离了,且没有分离服务器)

9.4浏览器并发数 ............................................................................................................... 239

用不同的域名对WEB组件进行分类后,提高浏览器在下载WEB组件时的并发数

组件分离后,可以使用HttpWatch等浏览器监视程序观察站点,不同域名下载过程互不影响,整体提高下载速度。HttpWatch目前只支持IE和FF。其他浏览器可使用在线工具,http://site-perf.com

9.5发挥各自的潜力 ........................................................................................................... 242

动态内容.......................................................................242

·开启opcode缓存

·足够快的CPU

·足够大内存

·多进程

·与数据库保持高速连接

·可靠的数据中心

分离的好处:

·域名更具有可读性

·有利于各种服务的独立访问量统计

·有利于各服务的独立扩展

静态网页.......................................................................244

静态内容的吞吐率很大程度上取决于服务器的并发处理能力

·支持epoll

·非阻塞I/O

·异步I/O

·使用sendfile()系统调用

·单进程

·使用高速磁盘

·使用RAID分区

·购买足够的宽带

图片...............................................................................245

通过HTTP持久连接

设置Expires有效期为1天

样式表...........................................................................246

Expires有效期可设置长点,更新不怎么频繁,比如设置1月

如果在1月内需要强制更新,就加个参数

(后面可以试着用)

脚本...............................................................................247

更新不频繁,可长期寄存在用户浏览器中

(后面可以试着用)

视频...............................................................................247

使用多线程

10.分布式缓存 .....................................................................250

10.1数据库的前端缓存区? ............................................................................................. 250

10.2使用memcache ...................................................................................................... 251

key-vlaue ....................................................................... 251

数据项过期时间........................................................................................................... 252

网络并发模型............................................................................................................... 252

对象序列化....................................................................... 254

10.3读操作缓存 ..................................................................... 256

重复的身份验证........................................................................................................... 256

数据库索引?............................................................................................................... 257

缓存用户登录状态....................................................................................................... 259

10.4写操作缓存 ..................................................................... 260

直接更新.......................................................................261

线程安全和锁竞争?................................................................................................... 262

原子加法.......................................................................262

10.5监控状态.....................................................................264

10.6缓存扩展.....................................................................266

[if !supportLists]11.[endif]数据库性能优化.............................................................................................................270

11.1友好的状态报告 ......................................................................................................... 270

想要优化先了解数据库工作得怎么样,都在忙什么?

Mysql命令可查:

Maysql > show status;

Maysql > showinnodb status;

Mysqlreport第三方的MYSQL状态报告工具

11.2正确使用索引 ............................................................................................................. 274

到底什么是索引?....................................................................................................... 274

相当于一本书的目录,帮助用户快速找到目标内容。

并不是所有索引都好过全表扫描,比如要查的占了整个数据表的很大比例,那么用索引扫描性能更差。

数据库索引不像书,数据库索引面临在索引列表中找到某一个索引项的效率问题。

除了普通索引外,还有唯一索引、主键、全文索引等

(现在的设计没有用上索引等,学习这方面的东西用上)

这是你自己的事情....................................................................................................... 275

主动建立索引

解释查询.......................................................................275

你要知道为哪些字段建立索引?

仔细分析应用中将会执行的所有SQL语句,一般来说,如果一个字段出现在查询语句中基于行的选择、过滤或排序条件中,那么为该字段建立索引便是有价值的,但也不是绝对的。

可以分析查询语句。不包括update语句

使用组合索引............................................................................................................... 279

一个数据表只能使用一个索引

在多条件查询情况下,使用组合索引

小心组合索引的副作用............................................................................................... 282

一定要根据查询的需要设计有针对性的组合索引

使用慢查询分析工具................................................................................................... 285

查看查询日志,查看每次执行时间

使用mysqlsla第三方开源工具查询查询哪些比较慢

索引缓存.......................................................................287

数据表的索引也可以缓存起来,它的缓存在内存中,最理想的情况是所有的索引都可以直接在内存中查找,不需要访问磁盘。

(详细研究学习并使用)

索引的代价....................................................................... 288

任何事务都有双面性,我们需要思考是否值得

索引会占据更多的磁盘空间,不过硬盘扩展方便,牺牲空间换取时间是值得的。

当建立索引的字段发生更新时,会引发索引本身的更新,将产生不小的开销,牺牲更新时间换取读取时间是值得的。

索引需要我们花费时间维护,可能会索引损坏,需要手动修复,牺牲维护时间换取运行时间也是值得的。

11.3锁定与等待 ..................................................................... 289

锁机制是影响查询性能的另一个重要因素。

查询时间开销包括:查询本身的计算时间和查询开始前的等待时间。索引影响的是前者,锁机制影响的是后者。

目标就是要减少等待时间。

减少表锁定等待........................................................................................................... 290

行锁定带来了什么?................................................................................................... 293

站点主要依靠用户创造内容,频繁的数据更新南面,将给select等读取带来很大影响。

可用行锁解决问题。

行锁定真的很好吗?................................................................................................... 295

好处不是绝对的,表锁定和行锁定各有利弊,需要根据站点的应用来灵活的使用它们。且要正确的使用。

11.4事务性表的性能 ......................................................................................................... 298

11.5使用查询缓存? .......................................................................................................... 299

将select查询出来的结构缓存在内存中,以供下次直接获取。

但是涉及一个问题,就是缓存过期策略,MYSQL采用的机制是,当一个数据表有更新操作后,那么涉及这个表的所有查询缓存都会失效。这样一来,对于select和update混合的应用来说,查询缓存反而会添乱。

MYSQL默认是没有开启查询缓存的,需要设置:

Query_cache_size = 268435456

Query_cache_type = 1

Query_cache_limit = 1048576

11.6临时表 ..........................................................................301

MYSQL可将临时表创建在磁盘、内存及临时文件中,而在磁盘上创建是开销最大的,所以尽量不在磁盘上创建临时表。

11.7线程池 ..........................................................................302

11.8反范式化设计 ............................................................................................................. 303

对关系数据库中关系的一定要求,不同程度的要求为不同范式。

最低要求第一范式,进一步要求称为第二范式,我们通常遵循第三范式

第三范式要求在一个数据表中,非主键字段之间不能存在依赖关系

11.9放弃关系型数据库? ................................................................................................. 304

12.Web负载均衡 .....................................................................307

12.1一些思考.....................................................................307

外包?...........................................................................308

把部分工作外包给别人做,减轻自己的负担。

接口人?.......................................................................308

一个负责与外包公司进行长期沟通的叫接口人。要有助理,万一人有事就没法工作了。

工作量分配?............................................................................................................... 308

风险管理?....................................................................... 309

出现问题,将任务快速转移给其他的外包公司。

制约?...........................................................................309

外包工作越来越多,就要建立更多的外包接口人,否则制约效率。

12.2 HTTP重定向 .........................................................................................................310

将HTTP请求进行转移,用它来完成跳转。可以用于负载均衡,以达到WEB扩展的目的。

熟悉的镜像下载........................................................................................................... 311

用代码来实现............................................................................................................... 313

www.hight.com.  in  A  10.0.1.100

重定向的性能和扩展能力........................................................................................... 314

RR策略下的性能 ........................................................................................................ 315

更多考虑.......................................................................319

12.3 DNS负载均衡 ......................................................................................................320

多个A记录 ...................................................................... 321

域名被解析到不同的IP

方法一:

www1.hight.com.  in  A  10.0.1.100

www.hight.com.  in  A  www1.hight.com.

www2.hight.com.  in  A  10.0.1.101

www.hight.com.  in  A  www2.hight.com.

方法二:

www.hight.com.  in  A  10.0.1.100

www.hight.com.  in  A  10.0.1.101

区别:

性能上么有区别,但是前一种可以满足一些需求,如:

·保留之前的www1等的域名访问

·希望多个二级域名指向同一IP,可以取个别名来代替IP

扩展能力和可管理性................................................................................................... 323

智能解析.......................................................................324

DNS软件,如bind,根据用户IP智能解析,寻找离用户最近的服务器。

需要接入城市或运营商的核心骨干节点,收集相应的网络地址分布数据,并添加DNS服务器的智能解析策略中。

可以使用第三方DNS智能解析服务

故障转移?....................................................................... 325

一旦发现某台服务器发生故障,需要立即将它从调度策略中拿掉。也就是暂停指向该服务器的DNS记录。

一些不足.......................................................................326

·需要一段时间才能生效

·需要人手动修改,如不能及时发现或修改

解决:通过动态DNS协议来迅速修改DNS记录。动态域名解析

·比HTTP重定向能更好的隐藏实际服务器,但是为维护人员带来不方便

解决:通过修改etc/hosts来为域名指定某个实际服务器的IP地址,以跳过DNS服务器的调度。

·因为DNS的负载均衡框架之下,调度器工作在DNS层面,导致灵活性陪削弱

·DNS记录缓存

所谓均衡,不是平均分配,,是希望所有服务器都不要过载,最大程度的发挥作用。

12.4反向代理负载均衡 ................................................................................................329

反向代理负载均衡就是转发HTTP请求。

转移和转发?............................................................................................................... 329

目的提高承载能力

这种机制的改变,使调度器扮演用户和实际服务器的中间人

·任何对于实际服务器的HTTP请求都必须经过调度器

·调度器必须等待实际服务器的HTTP响应,并反馈给用户

按照权重分配任务....................................................................................................... 330

能者多劳

调度器的并发处理能力............................................................................................... 334

扩展的制约....................................................................... 335

健康探测.......................................................................340

粘滞会话.......................................................................343

12.5 IP负载均衡 ...........................................................................................................345

DNAT ............................................................................346

NAT服务器做了什么? .............................................................................................. 347

Netfilter/iptables ............................................................................................................ 349

用iptables来实现调度器? ..................................................................................... 349

IPVS/ipvsadm ..................................................................... 351

LVS-NAT .....................................................................352

性能...............................................................................353

动态调度策略............................................................................................................... 355

网关瓶颈.......................................................................356

12.6直接路由........................................................................ 359

使用IP别名 ..................................................................... 360

可以一个网络接口拥有一个IP地址,但是使用别名可以有更多的IP地址

将实际服务器接入外部网络....................................................................................... 361

LVS-DR .......................................................................363

与LVS-NAT的性能比较............................................................................................ 364

转型到DNS-RR?...................................................................................................... 368

12.7 IP隧道 .......................................................................368

12.8考虑可用性 ..................................................................... 369

不能出现单点故障,即某个组件发生故障,导致整个系统瘫痪

[if !supportLists]13.[endif]共享文件系统.......................................................................371

如何保证多台实际服务器拥有一致的程序和文件?

13.1网络共享.....................................................................371

利用共享文件系统实现图片共享:

可以为集群中的多台实际服务器共享同一个物理存储设备,也可把上传的照片直接存储在这里。相当一台独立的图片服务器。可可以是位于集群中的某一台实际服务器的磁盘。

共享文件系统并不是磁盘文件系统,它不能用于存储和管理磁盘数据,只是定义了文件在网络传输中的组织格式和传输协议。

常用的有NFS和Samba

13.2 NFS ............................................................................373

NFS的服务器端和客户端软件包一般在LINUX中被默认安装,配置简单。如,想将10.0.0.1上的/data目录共享给10.0.0.2,就要在10.0.0.1上声明:

S-200:~ # vi /etc/exports  /data 10.0.0.2 (rw,sync)

然后启动NFS服务器端:

S-200:~ # /ect/init.d/nfsserver start starting kernel based NFS server done

表示允许2的服务器对自己的/data目录进行读写操作,并且采用同步方式,然后需要在2上执行mount操作,将1共享的目录绑定到自己的文件系统中

S-201:~ # mount -t nfs 10.0.0.1:/data /mnt /data

在执行前,首先要创建/mnt /data目录

基于RPC传输 ............................................................................................................. 374

LINUX内置服务

通过rpcinfo

统计I/O ...........................................................................376

I/O延迟 ...........................................................................376

同步:NFS服务器会在写操作完成后才返回成功

异步:NFS服务器在接收到写操作请求后立即返回成功(慎重选择)

13.3局限性...........................................................................379

影响性能的因素包括服务器本身的磁盘吞吐率上限,还有NFS服务器端的并发处理能力及网络宽带等。

扩展性不强

14.内容分发和同步 ...........................................................................................................380

14.1复制 ............................................................................380

将图片复制到集群中所有服务器上

好处:WEB服务器将直接读取本地磁盘的图片来响应HTTP请求

如何实现复制?需要考虑哪些策略?

主动分发和被动同步,区别在于复制的发起方和触发方式不同。

14.2 SSH ............................................................................382

Secure Shell,建立在应用层和传输层基础上的安全协议,属于主动分发方式

SCP ...............................................................................382

SFTP .............................................................................383

多级分发.......................................................................384

14.3 WebDAV ....................................................................... 386

14.4 rsync .........................................................................386

14.5 Hash tree ..................................................................... 388

14.6分发还是同步? ......................................................................................................... 390

14.7反向代理.....................................................................390

[if !supportLists]15.[endif]分布式文件系统................................................................................................................392

15.1文件系统? ..................................................................... 392

15.2存储节点和追踪器 ..................................................................................................... 394

15.3 MogileFS ...................................................................... 396

host/device ............................................................................................................... 396

domain/class ............................................................................................................ 398

存储节点可用性检测................................................................................................... 398

多个副本的负载均衡................................................................................................... 400

异步复制.......................................................................401

存储节点和WebDAV ................................................................................................. 403

提取文件.......................................................................404

16.数据库扩展 ...........................................................................407

16.1复制和分离 ..................................................................... 407

主从复制.......................................................................407

读写分离.......................................................................408

使用数据库反向代理................................................................................................... 409

16.2垂直分区.....................................................................411

16.3水平分区.....................................................................413

把数据放在不同分区中............................................................................................... 413

分区和分表....................................................................... 416

如何分区?....................................................................... 416

分区扩展.......................................................................418

分区反向代理............................................................................................................... 418

17.分布式计算 ............................................................................420

17.1异步计算.....................................................................420

分布式消息队列........................................................................................................... 420

Gearman ........................................................................ 421

MemcacheQ .............................................................................................................. 425

17.2并行计算.....................................................................426

分而治之.......................................................................426

Map/Reduce .............................................................................................................. 427

18.性能监控 .................................................................................431

18.1实时监控.....................................................................431

18.2监控代理.....................................................................435

18.3系统监控.....................................................................437

18.4服务监控.....................................................................441

(2014-3-20)

你可能感兴趣的:(构建高性能WEB站点)