Apache Traffic Server 简介
一 介绍
Apache Traffic Server(ATS或TS)是一个高性能的、模块化的 HTTP 代理和缓存服务器。Traffic Server 最初是 Inktomi 公司的商业产品,该公司在 2003 年被 Yahoo 收购,之后 Traffic Server 一直在 Yahoo 内部使用长达 4 年,直到 2009 年 8 月 Yahoo 向 Apache 软件基金会(ASF)贡献了源代码,并于 2010 年 4 月成为了 ASF 的顶级项目(Top-Level Project)。 Apache Traffic Server 现在是一个开源项目,开发语言为C++。
Traffic Server 的开发团队曾经由 Chuck Neerdaels 领导,他也是 Harvest 项目的早期创始人之一,Harvest 项目后来发展为十分流行的 Squid 项目;Leif Hedstrom 直接管理着现在的 Traffic Server 开发团队。目前 Chuck Neerdaels 和 Leif Hedstrom都已加盟知名 CDN 服务提供商 Akamai。
HTTP 代理服务器是 HTTP 服务器的一种实现,处于客户端(一般为浏览器)与另一个 HTTP 服务器之间(通常指源服务器,Origin Server)。HTTP 代理通常分为正向代理、反向代理和透明代理,我们主要关注的是反向代理(Reverse Proxy, 见下图)反向代理服务器根据明确配置的映射规则来处理用户请求。反向代理服务器通常会设置一个较大的缓存区,服务器处理请求的同时将请求的内容缓存在服务 器本地,当下次用户请求同一个对象时,服务器可直接从缓存区里取出对象,而不用去源服务器去取,起到了加速的效果。另外,配置反向代理的映射规则也能实现 负载均衡的功能。除了 Traffic Server,常见的开源代理服务器还有 Squid,Varnish,Nginx,HAProxy。
- 超过 4 年的使用中,缓存中没有出现已知的数据损坏(data corruption);
- 作为反向代理,服务器方便部署和管理,并且大部分配置的更改可直接在线上服务器完成,而不用重启服务;
- 在高并发情况下扩展良好,支持 HTTP/1.1 协议特性,如 SSL、Keep-Alive;
- 在世界范围内部署了超过 100 台服务器;
- 在实际CDN中,每秒处理超过 350,000 次请求,达到 30 Gbps,最大容量至少十倍于普通使用,以应对高峰时的大量请求;
- 在实际 CDN 中,每台服务器有 20,000 到 30,000 的 keep-alive 并发连接,其中有 1,000 到 2,000 的连接是一直很活跃的;
- 实验环境中,单台服务器每秒处理 105,000 次请求,请求的对象是被缓存住的小文件;
- 实验环境中,请求大文件时,单台服务器达到 3.6 Gbps(4x GigE NIC bonded)。
二 组件、机制
Traffic Server(TS) 的组成
1.Traffic Server缓存
- TS 缓存包含一个高速的对象数据库,数据库根据 URL 和相关头部来索引对象,对于同一对象可以缓存不同版本(如不同的编码、语言)。
- 当缓存空间满后,TS 会移除过期的数据。
- 当磁盘出错时,TS 将不再使用该块磁盘,转而使用剩下的磁盘。所有磁盘都出错时,TS 将切换至 proxy-only 模式,即只代理,不缓存。
- 可分区,即可以给指定的协议和源服务器划分一定数量的磁盘空间
2.RAM 缓存
3.主机数据库
- 储存 DNS 信息,方便主机名到 IP 地址的快速转换
- 储存每个主机的 HTTP 版本,方便高级协议特性的使用
- 储存主机的可靠性和可用性信息
4.DNS 解析器
5.Traffic Server 进程
- traffic_server 进程负责接受连接,处理协议请求,然后从缓存或源服务器获取对象并返回
- traffic_manager 进程是 TS 的命令和控制设施,负责启动、监控和配置 traffic_server 进程,它也负责代理的端口配置、统计信息的接口、集群管理和虚拟 IP 的故障转移。
- 如果 traffic_manager 检测到 traffic_server 进程失效,它立即重启 traffic_server 进程并且维护一个连接队列,保存此时到来的请求,完全重启后这个队列里的连接将按顺序被处理。
- traffic_cop 进程监视 traffic_server 和 traffic_manager 进程,此进程周期性的查询 traffic_server 和 traffic_manager 进程的健康状况,如果查询在一定间隔时间内未返回或者返回信息不正确,traffic_cop 将重启 traffic_manager 和 traffic_server 进程。
6.管理工具
- Traffic Line 是命令行程序,可以用来快速监视 Traffic Server 的性能和网络流量,也能配置 TS。
- Traffic Shell 也是命令行工具,进入该 shell 后有自己一套语法,可代替 Traffic Line 完成监控、配置任务。
- 通过 Traffic Line 和 Traffic Shell
对配置作出的修改将会自动写入配置文件中。
Traffic Server 的底层机制
Apache Traffic Server 不同于大部分开源代理服务器,它结合了两种技术来处理高并发:
- 异步事件处理(Asynchronous event processing)
- 多线程(Multi-threading)
Traffic Server 在多 CPU、多核的硬件上扩展良好,能充分利用所有可用的 CPU 和其他资源。
HTTP 代理缓存相关机制
1. Traffic Server 处理请求的过程
2. Traffic Server 判断 HTTP 对象是否新鲜(fresh)的过程
- 如果有 Expires 或者 max-age 头部直接定义缓存的过期时间,TS将对比当前时间和过期时间去判断对象是否新鲜
- 如果没有上述头部,TS 将检查 Last-Modified 和 Date 头部(其中Date是源服务器返回对象的时间,如果没有 Last-Modified 头部,TS 会用对象写入缓存的时间以作代替),然后用以下公式算出新鲜的时间范围(freshness_limit,可理解为保质期):
freshness_limit = ( Date - Last-Modified ) x 0.1
0.1 这个参数可以作调整,并且能限制 freshness_limit 的上下限,默认最小是 1 小时,最大是 1 天 - 如果没有 Expires 头部或者没有 Last-Modified、Date 头部,TS 将使用默认的 fressness limit
- 另外,TS 还会检查 cache.config 配置文件中的 revalidate 规则,该规则可以对特定的 HTTP 对象设置特定的验证时间(特定的域名、IP、一定规则的 URL、特定的客户端等等)
3. 缓存过期(stale),Traffic Server 去源服务器重新验证对象可能的情况
- 仍然 fresh,TS 重置 freshness_limit,并返回对象
- 对象新副本可用,TS 缓存新对象,并同时返回给用户
- 源服务器上的对象不再存在,TS 也不再返回该副本给用户
- 源服务器没有响应,TS 返回过期的对象并发出警告。
更详细的说明请查看 Traffic Server 管理文档中的 HTTP Proxy Caching 部分
三 安装、使用
(以 Apache Traffic Server 2.1.1 unstable 为例在 32-bit Linux 环境下进行安装测试)
安装
1. 下载、解压
wget http://www.apache.org/dist/trafficserver/trafficserver-2.1.1-unstable.tar.bz2
wget http://www.apache.org/dist/trafficserver/trafficserver-2.1.1-unstable.tar.bz2.md5
md5sum -c trafficserver-2.1.1-unstable.tar.bz2.md5
tar jxvf trafficserver-2.1.1-unstable.tar.bz2
cd trafficserver-2.1.1-unstable
2. 编译、安装
./configure --help
./configure
make
make install
目录结构
默认目录 | 内容 |
/usr/local/var/log/trafficserver | 运行时创建的日志文件 |
/usr/local/var/trafficserver | 运行时的一系列文件 |
/usr/local/etc/trafficserver | 配置文件 |
/usr/local/bin | 可执行文件 |
/usr/local/libexec/trafficserver | 插件 |
初步配置
records.config 是 key-value 格式的配置文件,负责大部分全局的选项设置,即主配置文件。
storage.config 用于指定磁盘存储。
remap.config
- records.config 中关键的配置
CONFIG proxy.config.exec_thread.autoconfig INT 1
CONFIG proxy.config.exec_thread.autoconfig.scale FLOAT 2.0
CONFIG proxy.config.exec_thread.limit INT 2
# CONFIG proxy.config.cluster.ethernet_interface STRING eth0 # 设置以太网接口
CONFIG proxy.config.http.server_port INT 8080
# 监听端口,反向代理通常为80LOCAL proxy.local.incoming_ip_to_bind STRING 0.0.0.0 # 绑定的 IP,可省略,默认即为 0.0.0.0
CONFIG proxy.config.http.cache.http INT 1 # 打开缓存功能
CONFIG proxy.config.cache.ram_cache.size INT 512M
# RAM 缓存大小CONFIG proxy.config.reverse_proxy.enabled INT 1
# CONFIG proxy.config.url_remap.remap_required INT 1 # 1为只反向代理,0为正向+反向代理
CONFIG proxy.config.url_remap.pristine_host_hdr INT 0
CONFIG proxy.config.ssl.enabled INT 0 # 关闭SSL
CONFIG proxy.config.ssl.server.cert.filename STRING server.pem
CONFIG proxy.config.http.server_max_connections INT 2000
# 同源服务器的最大连接数CONFIG proxy.config.http.keep_alive_no_activity_timeout_out INT 60 # 当一个事务结束后同原服务器保持连接的时间
- remap.config
配置
-
storage.config 配置
更详细的配置可参考官方管理指南 http://trafficserver.apache.org/docs/v2/admin/
服务控制
- 运行 /usr/local/bin/trafficserver start
- 结束 /usr/local/bin/trafficserver stop
- 重启 /usr/local/bin/trafficserver restart
命令行工具、监控
- 查看帮助 traffic_line -h
- 查看变量的值 traffic_line -r 变量名 (变量名见官方管理指南附录C,含 TS 运行时统计数据)
- 给变量赋值 traffic_line -s 变量名 -v 值
(变量名见records.config) - 不重启TS 使配置生效 traffic_line -x
- 查看帮助 man traffic_shell (由于开发者疏忽,暂不能用)
- show 命令,如 %show:cache-stats 查看缓存统计,如命中情况,缓存大小;如%show:proxy-stats 查看命中率
- config 命令,如 %config:logging event disable 关闭日志;如 %config:cache clear,清除缓存,config命令作出的修改都会立即生效
- traffic_logcat -h 获得帮助
- 查看二进制日志 traffic_logcat 日志文件名
- Traffic Server 系统自身的运行日志可在 /var/log/message 中查看(centos),用于排错
- traffic_logstats 提供了基于日志的统计功能
四 结论