Apache Traffic Server由于主要面向大规模的网站和ISP等服务对象,它所面向的主要场景都极其复杂,而ATS在各种使用场景中,都非常依赖一套完整高效的DNS系统。基于众所周知的历史原因,ATS在dns方面的文档说明资料几乎没有,仅有的官方文档里甚至对最基础的一些dns配置选项都语焉不详,文档的缺乏极大困扰着新老用户用户。在这里,我们尝试对DNS相关的文档以及配置进行详细的说明,并对其他相关的技术方案给予指导,希望成为目前ATS对DNS系统配置的一个实用指南。
ATS的dns使用思想 在ATS中,DNS是一个很重要的模块。我们都知道ATS是一个异步事件编程框架,而传统的DNS解析库形式的如bind等,在异步多线程事件框架下均有很大的局限性。为达成ATS的高效能,在设计之初ATS设计者就考虑到将DNS的解析、缓存做成一个基础的核心模块,并且充分考虑到极大集群模式下的工作方式。同时,由于ATS面向的用户域名规模、复杂度都是很大的,ATS系统设计者推荐使用合理的DNS系统来进行回源管理控制,如remap或parent的控制等。从而与其他基于hostname、domain的控制机制连成整体。
ATS对DNS系统依赖有多重呢?简单的说,如果没有个合理的DNS系统配合,ATS可能都没法工作。
ATS的dns配置项目 要了解ATS的DNS系统,我们首先需要了解ATS的DNS主要功能,ATS的DNS系统,在核心里被切分为两部分,分别是dns解析部分和dns缓存部分。在dns解析部分,又派生出了SplitDNS这样一个单独的功能,对SplitDNS的使用,我们通过独立的文档予以说明,本文仅予概要介绍。
resolver解析 ATS的解析服务,可以看作是类似bind实现的libresolver功能,通常的配置涉及到超时时间、重试次数、以及SplitDNS特殊功能等。
参数 参数类型 默认值 生效模式 格式 proxy.config.dns.lookup_timeout RECD_INT 20 RECU_DYNAMIC proxy.config.dns.retries RECD_INT 5 RECU_DYNAMIC [0-9] proxy.config.dns.search_default_domains RECD_INT 0 RECU_DYNAMIC [0-1] proxy.config.dns.failover_number RECD_INT 5 RECU_DYNAMIC proxy.config.dns.failover_period RECD_INT 60 RECU_DYNAMIC proxy.config.dns.max_dns_in_flight RECD_INT 2048 RECU_DYNAMIC proxy.config.dns.validate_query_name RECD_INT 0 RECU_DYNAMIC [0-1] proxy.
ATS插件开发需要提前了解ATS的插件的一些设计思想,以及系统提供的一些不同方向。我们将会介绍ATS的基础开发知识,以利于后续的插件开发课程讲解。
ATS的SDK文档,是了解ATS的核心设计、接口设计的很重要资料,甚至是老的PDF版本文档,都是非常非常有用的资料。以至于我经常建议完全不了解ATS核心代码的初学者也好好看看SDK文档,这里讲的很多基础知识,有利于对核心的深入理解。ATS的API以及核心插件接口设计是一个很庞大的工程,其设计思想我们很难一下消化掉,这里点出一些知识点供大家参考。如有纰漏、谬误之处,以SDK文档、代码注释、代码为准。
官方SDK文档
历史的SDK PDF文件
下一篇:手把手教你写plugin
ATS开发环境 名词解释 HTTP Transaction HTTP Transaction 是ATS特指http的处理流程,在ATS中,一个HTTP的请求的处理过程,叫做一个HTTP Transaction。ATS的很多API是以Transaction为核心的函数处理过程,也就赋予了这个过程以特殊的意义。在相关的API函数中,TSHttpTxn数据结构,以及以TSHttpTxn开头的API函数都是围绕这个处理流程来的。
HTTP SM HTTP SM 是一般是指ATS的主流程状态机,在ATS中,处理的流程是通过HTTP Transaction中的函数处理的,而状态数据是存储在HTTP SM中的。ATS核心主流程就是HTTP Transaction和HTTP SM的交互过程。
HTTP session HTTP session是指http会话,一般指一个请求交互过程,特指如客户端的一个请求,回源的一个请求,分别对应客户端和服务器端HTTP session。对照HTTP Transaction,我们对应的ATS一个用户请求引起的ATS HTTP Transaction,可以包含一个客户端 HTTP Session,0个或1个甚至多个回源 HTTP Session。
remap remap是ATS做URL rewrite的方式,也是ATS在配置文件设计方面的特殊部分。从功能上来讲,ATS的remap更像一个精简版本的Apache Httpd的rewrite模块。remap之所以重要,是因为它定义了一个很方便的API入口,我们可以通过remap系统,编写remap插件。
基础知识: - Continuation
Continuation,从学术上应该是叫做Continuation的编程模型(方法),这个技术相当古老,后来微软围绕这个方案,改进出了coroutine的编程模型(方法),一定程度上来讲Continuation是整个异步回调机制的多线程事件编程基础。对应ATS中,Continuation是一个最最基础的抽象结构,后续的所有高级结构,如Action Event VC等都封装Continuation数据结构,我们先看Continuation结构的实际代码:
class Continuation: private force_VFPT_to_top { public: ContinuationHandler handler; Ptr<proxymutex> mutex; LINK(Continuation, link); int handleEvent(int event = CONTINUATION_EVENT_NONE, void *data = 0) { return (this->*handler) (event, data); } Continuation(ProxyMutex * amutex = NULL); }; Continuation主要包含:
Apache Traffic Server的程序文件,与传统的服务器系统有大不同,这里我们将会对这些文件进行详细的解读,并尽可能的对程序的功能和基本用法、参数等进一步说明,以利于新入门的同学们快速上手。
本文中,我们以Fedora系统的安装结构进行解释,其他系统请参考《ATS安装大全》中介绍的路径(闹补)做变换。
ATS程序综述 ATS是一个服务器系统,相比多数服务器设计的单一程序设计,ATS设计的较为复杂,主要服务器程序可以分为:
代理服务器代 理服务器是ATS业务服务器,负载http代理和缓存职能
管理服务器 管理服务器包括两部分,分别是server系统管理和服务器控制
独立日志服务器 专用的日志收集、中转服务器 另外ATS还附带了其他工具程序:
日志查看、分析工具 系统配置管理工具 模块开发配套工具 性能测试工具 典型的ATS安装会包括如下程序,我们将会按照上述的分类对他们进行介绍:
traffic_cop traffic_line traffic_logcat traffic_logstats traffic_manager traffic_sac traffic_server traffic_shell trafficserver tstop tsxs ATS主要服务器程序 traffic_server traffic_manager traffic_cop traffic_sac是ATS的主要服务器程序,是我们日常最常用到的服务器,我们将对他们的功能和使用进行详解的讲解
代理服务器 traffic_server traffic_server是ATS的业务处理服务器,也是最ATS中最复杂的主程序,这个程序可以单独运行,也可以在traffic_manager管理下运行,主要包括服务器、回归测试、初始化cache系统三大功能块,默认功能是服务器。下面是traffic_server可以接受的命令行参数:
Usage: ./traffic_server [--SWITCH [ARG]] switch__________________type__default___description -l, --lock_memory int 0 Lock process in memory (must be root) -n, --net_threads int 8 Number of Net Threads -Z, --cluster_threads int 1 Number of Cluster Threads -U, --udp_threads int 0 Number of UDP Threads -a, --accept_thread tog false Use an Accept Thread -b, --accept_till_done tog true Accept Till Done -p, --httpport str (null) Port descriptor for HTTP Accept -P, --cluster_port int 0 Cluster Port Number -o, --dprintf_level int 0 Debug output level -V, --version tog false Print Version String -R, --regression int 0 Regression Level (quick:1.