构建高性能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提供原子递增操做。mysql
第11章 数据库性能优化
11.1 状态报告
show status;
web
show innodb status;
算法
mysqlreport
sql
11.2 正确使用索引
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 反范式设计
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线程来读取本地二进制文件,并输送给从服务器。
- 读写分离
- 对于全部的更新才作,必须做用于主服务器上
- 读操做指向从服务器,写操做指向主服务器。
- 数据库反向代理
16.3 水平分区
将同一数据表中的记录经过特定的算法进行分离,分别保存在不一样的数据表中,从而能够部署在不一样的数据库服务器上。