### 构建高性能WEB站点笔记三
第10章 分布式缓存
10.1数据库的前端缓存区
- 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经过它,所以也可看做是磁盘的前端设备。又称作 页高速缓冲
- 读缓冲区 保存最近系统从磁盘上读取的数据。
- 写缓冲区 主要在于减少磁盘的物理写操作。通过将多次写操作的指令累积起来,使用一次物理磁头的移动来完成。
10.2 使用memcached
分布式缓存系统
- key-value memcached使用物理内存作为缓冲区,启动时候指定分配给缓冲区的内存大小。使用key-value的方式存储数据,单索引的结构化数据组织形式。
- 数据项过期时间 一旦缓冲区没有足够的空间,基于LRU(Least Recently Used)算法。将最近不常访问的数据项淘汰掉。当然也可以设置过期时间。
- 网络并发模型
- 作为分布式缓存系统,memcached可以运行在独立的服务器上,动态内容通过TCP Socket来访问。
- 对象序列化
- 基于序列化的机制,我们可以将更高层的抽象数据类型转化为二进制字符串,以便通过网络进入缓存服务器,同时,读取这些数据的时候,二级制字符串又可以转换回原有的数据类型。
10.3 读操作缓存
都可使用memcached缓存,并且memcacd提供原子递增操作。
第11章 数据库性能优化
11.1 状态报告
show status;
show innodb status;
mysqlreport
11.2 正确使用索引
- 组合索引
- 使用慢查询分析工具
-
开启慢查询 my.cnf中增加配置,意味着Mysql自动将执行超过1秒的查询记录在文件中。
long_query_time = 1
long-slow-queries = /data/var/mysql_slow.log
还可以将没有使用索引的查询记录下来
log-queries-not-using-indexes
-
- 索引缓存
11.3 锁定与等待
查询的时间开销包括:查询本身的计算时间和查询开始前的等待时间,索引影响的是前者,锁机制影响的是后者。
- 减少表锁定时间
- MySQL为MyISAM类型提供了表级别的锁定。允许多个线程同时读数据,比如select,它们之间不需要等待,但对于更新操作(update),排斥对当前表的所有其他查询,包括select查询。除此之外,更新操作有着默认的高优先级。
- 适合大部分查询为读取操作,混合一小部分快速的更新操作。
- 行锁定
- MySQL为Innodb提供了行锁的支持。
- 在select和update混合的情况下,行锁定可以很巧妙的解决读和写互斥的问题。
- 行锁定只是一种逻辑层面的约束,即便是同时拥有updating的状态,也不能加速update操作的总时间,因为磁盘的物理写操作最终还是以此进行的。
11.4 事物性表的性能
MySQL的Innodb除了支持行锁定外,还支持事务,这也是使用Innodb的另一个原因。
当然Innodb还有其他特性,比如行锁定、外键以及易于修复。
11.5 使用查询缓存
将select查询的结果缓存在内存中,以供下次直接获取。MySQL采取的机制是,当一个数据表有更新操作,那么涉及这个表的所有查询缓存都会失效。
11.6 临时表
MySQL将临时表创建在磁盘、内存、以及临时文件中。
11.7 线程池
MySQL采用多线程处理并发的连接,通过mysqlreport中的threads部分,可以看到线程创建的统计结果。
11.8 反范式设计
- 数据库范式
第一范式:指数据库表的每一列都是不可分割的基本数据项
-
第二范式:数据库表中不存在非关键字段对任一候选键的部分函数依赖,也即所有非关键字 段都完全依赖于任意一组候选关键字。
2NF的违例只会出现在候选键由超过一个字段构成的表中,因为对单关键字字段不存在部分依赖问题。
第三范式:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式
11.9 放弃关系型数据库
第12章 Web负载均衡
12.2 HTTP重定向
转移HTTP请求,在Web开发中经常使用它来完成自动跳转。eg. 用户登录成功后跳转到相应的管理页面。
顺序调度的性能总是比不上随机调度的性能。
12.3 DNS负载均衡
- 多个A记录
- 指定域名对应的IP地址。
- DNS的负载均衡实现依赖于DNS服务器的设置。
- 扩展能力和可管理性
- 智能解析
- 根据用户IP来进行智能解析,DNS服务器在所有可用的A记录中挑选一个离用户最近的服务器。
- 故障转移
- 在检测到某台实际服务器发生故障以后,便可以通过动态DNS协议来迅速修复DNS记录。
- DNS记录的修改需要一定时间才能生效,例如一个DNS记录的TTL为3600秒,那么对它的更新最多要过一个小时才会生效。
- 动态DNS,允许DNS服务器开放特定的服务,为我们自动化修改DNS记录提供了可能。
12.4 反向代理负载均衡
反向代理服务器的核心工作便是转发HTTP请求,在TCP七层协议的第七层。
- 按照权重分配任务——按能力分配请求到不同的服务器
- 调度器的并发处理能力
- 粘滞会话
- 同一用户对同一内容的多次请求,可能被转发到不同的后端服务器。
- 调整策略,让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器。这种机制也称为粘滞会话。——将用户的IP地址进行Hash计算并散列到不同的后端服务器。
- 利用Cookie机制设计持久化算法。eg. 调度器将某个后端服务器的编号追加到写给用户的Cookies中,这样调度器便在该用户的随后的请求中知道应该转发给哪台后端服务器。
12.5 IP负载均衡
- DNAT 反向NAT,实际服务器部署在内网网络,而作为网关的NAT服务器将来自用户端的数据包转发给内部网络的实际服务器。工作在传输层
- 它需要修改数据包的目的地址和端口。
- Netfilter/iptables
- 当网络数据包到达服务器的网卡并且进入某个进程的地址空间之前,先要通过内核缓冲区,这时候内核中Netfilter便对数据包有着绝对的控制权,可以修改数据包,改变路由规则。
- iptables,是工作在用户空间的一个命令行工具,通过它来对Netfilter的过滤表进行插入、修改或者删除等操作。
12.6 直接路由
工作在数据链路层(第二层)。通过修改数据包的mac地址,将数据包转发到实际服务器上,并且最重要的是,实际服务器的相应数据包将直接发送给用户端,而不经过调度器。
- 实际服务器必须直接接入外部网络。
- IP别名
- 为一个网络接口(物理网卡,虚拟接口)配置多个IP地址。根据规定,一个网络接口最多可以设置256个IP别名。
- 将实际服务器添加和调度器IP地址相同的IP别名。
12.7 IP隧道
第16章 数据库扩展
16.1 复制和分离
- 主从复制
- 开启主服务器上的二进制日志
- 从主服务器和从服务器上分别进行简单的配置和授权。
- 从服务器定时向主服务器请求最新日志,而主服务器通过一个I/O线程来读取本地二进制文件,并输送给从服务器。
- 读写分离
- 对于所有的更新才做,必须作用于主服务器上
- 读操作指向从服务器,写操作指向主服务器。
- 数据库反向代理
- Mysql Proxy 负责所有请求和相应数据的转发。
16.2 垂直分区
对于数据库写操作频繁的站点,将不同的数据库分布到不同的服务器。
16.3 水平分区
将同一数据表中的记录通过特定的算法进行分离,分别保存在不同的数据表中,从而可以部署在不同的数据库服务器上。
- 分区算法
- 哈希算法
- 范围
- 映射关系