您的位置:首页 > 其它

《构建高性能Web站点》笔记二(第7章到第12章)

2016-08-06 16:22 169 查看
第7章 Web服务器缓存

涉及Apache的缓存技术,Apache提供两个扩展,分别是mod_disk_cache和mod_mem_cache,推荐用前者。

第8章 反向代理缓存

正向代理:客户端隐藏在代理服务器之后,代理端代理的是客户端。

反向代理:Web服务器隐藏在代理服务器之后,客户端通过反向代理服务器来间接访问Web服务器。服务端知道客户端,客户端不知道服务端,通过代理端连接服务端。代理端代理的是服务端。向代理的一个目的是基于缓存的加速。

用Nginx作为反向代理服务器,只需要设置proxy_pass指令即可,同时别忘打开mod_proxy模块

vamish:反向代理缓存更加专业,而且对于后面要介绍的负载均衡也有很好的支持

vamish 的配置文件使用VCL

监控缓存命中率

缓存存命中率 = 1 -(后端吞吐率/实际吞吐率) 叫回%

缓存命中率因素:

1、缓存区空间大小

2、缓存过期时间

3、有些内容可能根本没有被代理服务器操作

Vamish 还将提供基于 Web 的监控界面

在 Cactl 上监控 Vamish的命中率

和动态内容缓存-起工作

备用缓存

暴露后端

首次加载

小心穿过代理

流量分配

第9章 Web组件分离

Web组件:动态内容、图片、JavaScript脚本、CSS样式表

web组件各有不同特点,如何优化?

是否使用epoll模型

是否使用 sendfile()系统调用

是否使用异步 IO

是否直持 HITP 持久连接 ( HTTP Keep-alive )

是否需要opcode续存

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

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

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

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

是否使用负载均衡策略

拥有不同的域名可提高浏览器下载组件并发数

www.highperfweb.com

img.highperfweb.com

upload.highperfweb.com

static.highperfweb.com

发挥各自的潜力

动态内容:开启opcode缓存、足够快的cpu、足够大的内存、多进程、与数据库保持高速连接、可靠的数据中心

静态网页:支持epoll、非阻塞I/O、异步I/O、使用sendfile()系统调用、单进程、使用高速磁盘、使用 RAID 分区、购买足够的带宽

图片:HTTP长连接、压缩

样式表:有效期设置、加版本号更新

视频等大文件:提高出口带宽、多进程、 sendfile 这样的I/O优化

第10章 分布式缓存

页高速缓存包括:读缓存、写缓存

读缓存保存着最近系统从磁盘读取的数据, 一旦下次需要直接返回

写缓存主要在于减少磁盆的物理写操作

使用 memcached

memcached -d -m 4086 -1 10.0.1.12 -p 11711

数据顶过期时间

<?php

$memcache_obj - memcache_connect ( ' 10.0.1.12 ' , 11211);

$memcache_obj->add('item_key' ,'item_value', false , 30 ) ;

?>

对靠序列化

<?php

class Person{
var $name;
function setName($name){
$this->name=$name;
}

}

$person=new Person();

$person->setName('ken');

$key='person_ken';

$memcache=memcache_connect('10.0.1.12',11711);

$memcache->add($key,$person,false,0);

$obj=$memcache->get($key);

echo $obj->name;

?>

读操作缓存

可用memache缓存用户登录状态、身份验证

写操作缓存

利用memache的原子操作

将直接更新改成累积到一定量再更新到数据库

如访问量达到每递增1000次才写一次数锯库:

<?php

$page='article090222.htm';

$memcache=memcache_connect('l0.0.1.12' , 11711);

$count=$memcache->increment($page , 1);

if ($count===false){
$memcaChe->add($page , 1 , false , 0);
exit(l);

}

if($count==1000){
$memcache->set($page , 0 , false, 0 );
$sql="update page_view set view_count=view_count+ ".$count." where page='" . $page . "'";
$conn=mysql_connect( 'localhost' , 'root' , '123456','dbyage');
mysql_query($sql , $conn);

}

?>

监控状态

memcache提供相关api可监控,还可以使用cacti监控系统将这些指标以图形方式展现

空间使用率

缓存命中率

I/O流量

<?php

$memcache=memcache_connect('l0.0.1.12' , 11711);

$stats=$memcach e ->getStats();

var_dump($stats) ;

?>

缓存扩展,多服务器

需要使用缓存连接器,根据传入的参数定位服务器

<?php

function memcache_connector($key){
$hosts=array(
'10.0.1.12',
'10.0.1.13',
'10.0.1.14'
);
$host_index=hexdec(substr(md5($key),0,5))%3;
$host=$hosts[$host_index];
return memcache_connect($host,11711);

}

$memcache=memcache_connector('article_090.html');

?>

缓存扩展

多台memache缓存服务器就不能直接连接了,而是采用'缓存连接器'

如:

<?php

function memcache_connector($key){
$hosts=array(
'10.0.1.12',
'10.0.1.13',
'10.0.1.14'
);
$host_index=hexdec(substr(md5($key),0,5))%3;//服务器台数
$host=$hosts[$host_index];
return memcache_connect($host,11711);

}

$memcache=memcache_connector('article_090.html');

?>

第11章 数据库性能优化

1、状态报告

show status;

show innodb status;

mysqlreport

2、正确使用索引

组合索引

使用慢查询分析工具

开启慢查询 my.cnf中增加配置,意味着Mysql自动将执行超过1秒的查询记录在文件中。

long_query_time = 1

long-slow-queries = /data/var/mysql_slow.log

还可以将没有使用索引的查询记录下来log-queries-not-using-indexes

索引缓存

3、锁定与等待

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

减少表锁定时间

MySQL为MyISAM类型提供了表级别的锁定。允许多个线程同时读数据,比如select,它们之间不需要等待,但对于更新操作(update),排斥对当前表的所有其他查询,包括select查询。除此之外,更新操作有着默认的高优先级。

适合大部分查询为读取操作,混合一小部分快速的更新操作。

行锁定

MySQL为Innodb提供了行锁的支持。

在select和update混合的情况下,行锁定可以很巧妙的解决读和写互斥的问题。

行锁定只是一种逻辑层面的约束,即便是同时拥有updating的状态,也不能加速update操作的总时间,因为磁盘的物理写操作最终还是以此进行的。

4、事物性表的性能

MySQL的Innodb除了支持行锁定外,还支持事务,这也是使用Innodb的另一个原因。

当然Innodb还有其他特性,比如行锁定、外键以及易于修复。

5、使用查询缓存

将select查询的结果缓存在内存中,以供下次直接获取。MySQL采取的机制是,当一个数据表有更新操作,那么涉及这个表的所有查询缓存都会失效。

6、临时表

MySQL将临时表创建在磁盘、内存、以及临时文件中。

7、线程池

MySQL采用多线程处理并发的连接,通过mysqlreport中的threads部分,可以看到线程创建的统计结果。

8、反范式设计

数据库范式

第一范式:指数据库表的每一列都是不可分割的基本数据项

第二范式:数据库表中不存在非关键字段对任一候选键的部分函数依赖,也即所有非关键字 段都完全依赖于任意一组候选关键字。

2NF的违例只会出现在候选键由超过一个字段构成的表中,因为对单关键字字段不存在部分依赖问题。

第三范式:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式

9、放弃关系型数据库使用nosql,如memcacheDB、mongodb

第12章 Web负载均衡

1、HTTP重定向

转移HTTP请求,在Web开发中经常使用它来完成自动跳转。eg. 用户登录成功后跳转到相应的管理页面。

顺序调度的性能总是比不上随机调度的性能。

2、DNS负载均衡

多个A记录

指定域名对应的IP地址。

DNS的负载均衡实现依赖于DNS服务器的设置。

扩展能力和可管理性

智能解析

根据用户IP来进行智能解析,DNS服务器在所有可用的A记录中挑选一个离用户最近的服务器。

故障转移

在检测到某台实际服务器发生故障以后,便可以通过动态DNS协议来迅速修复DNS记录。

DNS记录的修改需要一定时间才能生效,例如一个DNS记录的TTL为3600秒,那么对它的更新最多要过一个小时才会生效。

动态DNS,允许DNS服务器开放特定的服务,为我们自动化修改DNS记录提供了可能。

3、反向代理负载均衡

反向代理服务器的核心工作便是转发HTTP请求,在TCP七层协议的第七层。

按照权重分配任务——按能力分配请求到不同的服务器

调度器的并发处理能力

粘滞会话

同一用户对同一内容的多次请求,可能被转发到不同的后端服务器。

调整策略,让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器。这种机制也称为粘滞会话。——将用户的IP地址进行Hash计算并散列到不同的后端服务器。

利用Cookie机制设计持久化算法。eg. 调度器将某个后端服务器的编号追加到写给用户的Cookies中,这样调度器便在该用户的随后的请求中知道应该转发给哪台后端服务器。

4、IP负载均衡

DNAT 反向NAT,实际服务器部署在内网网络,而作为网关的NAT服务器将来自用户端的数据包转发给内部网络的实际服务器。工作在传输层

它需要修改数据包的目的地址和端口。

Netfilter/iptables

当网络数据包到达服务器的网卡并且进入某个进程的地址空间之前,先要通过内核缓冲区,这时候内核中Netfilter便对数据包有着绝对的控制权,可以修改数据包,改变路由规则。

iptables,是工作在用户空间的一个命令行工具,通过它来对Netfilter的过滤表进行插入、修改或者删除等操作。

5、直接路由

工作在数据链路层(第二层)。通过修改数据包的mac地址,将数据包转发到实际服务器上,并且最重要的是,实际服务器的相应数据包将直接发送给用户端,而不经过调度器。

实际服务器必须直接接入外部网络。

IP别名

为一个网络接口(物理网卡,虚拟接口)配置多个IP地址。根据规定,一个网络接口最多可以设置256个IP别名。

将实际服务器添加和调度器IP地址相同的IP别名。

6、IP隧道

基于 IP 隧道的请求转发机制,简单地说 , 它是将调度器收到的 I P 数锯包封装在一个新的IP 数据包 中, 转交给实际服务器,然后实际服务嚣的响应数据包可以直接到达客户端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: