博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ATS 分级缓存 icp parent remap.config

Posted on 2017-07-24 11:16  bw_0927  阅读(1504)  评论(0)    收藏  举报

http://blog.csdn.net/tao_627/article/details/48196183

http://ats-zh.readthedocs.io/en/latest/reference/configuration/parent.config.zh.html

 

理解缓存分级cache hierarchies
缓存分级是由彼此能够相互通信的各级缓存组成的,ATS支持几种类型的缓存分级。

ATS支持父缓存和ICP两种形式的缓存选项。

你能够配置ATS节点去使用多个父缓存,以便假如某个父缓存不可用时,转而去查询另一个父缓存,依次下去,直至要么能有资源响应该请求,要么在没有更多父缓存的情况下去源站回源。这种情况叫做父缓存故障转移Parent Failover

当你修改parent.config文件后,运行traffic_ctl config reload命令去让变更生效。当你对集群中的一个节点更新配置时,ATS会自动将配置更新应用到集群中的所有其它的节点。 

父级缓存Parent Caching

与remap.config结合
假如使用了remap规则(配置了proxy.config.reverse_proxy.enabled),当请求到达子节点是,它的remap.config将在parent规则之前处理

 

示例
客户端发送请求到 http://example.com. 上的ATS,ats发到源站的请求是http://origin.example.com; 父节点是parent1.example.com,子节点被配置为反向代理

  1. 子缓存节点
  • remap.config中添加

map http://example.com http://origin.example.com

  • parent.config中添加

dest_domain=origin.example.com method=get parent="parent1.example.com:80

处理流程:

子ATS接收客户端的请求 http://example.com,子ATS根据remap.config会把 http://example.com转发到源站http://origin.example.com上, 但因为子ATS又配置的父ATS,子ATS检查自己的parent.config配置,匹配到了一条到http://origin.example.com的规则,

所以子ATS会把客户端请求 http://example.com转发到其父ATSparent1.example.com上

 

  1. 父缓存节点

remap.config中配置
map http://origin.example.com http://origin.example.com   #直接去源站取
该例子中,假如 parent1.example.com宕机,子节点在cache miss的情况下,会自动直连源站 origin.example.com

 

配置ATS使用父缓存
为了配置ATS使用一个或多个父缓存,你需要像下面那样详细配置。
注意  你只需要配置子缓存,假设父缓存配置为子缓存的源站,对父缓存不需要额外配置

  • 在records.config中开启父缓存选项parent caching option

CONFIG proxy.config.http.parent_proxy_routing_enable INT 1

  • 确保你想使用父缓存去服务于 service missed requests。如果另外要使用parent failover,你必须指定一个以上的父缓存,以便当一个父缓存不可用时,请求可以转发到另一个父缓存
  • 配置parent.config中的parent proxy rules 

下面的例子配置ATS子缓存将所有path为/viewpoint 和含有正则表达式politics的请求直接发往源站(跳过任何父缓存)
url_regex=politics prefix=/viewpoint go_direct=true
下面的例子配置ATS子缓存将所有以http://host1开头的URL的missed请求转发到父缓存,假如parent1不能服务,就转发到parent2.
因为round-robin=true, ATS会基于client IP address轮询方式遍历父缓存列表
dest_host=host1 scheme=http parent="parent1;parent2" round-robin=strict
运行traffic_ctl config reload命令去让配置变动生效。

附注:现在v6.0的版本最好使用"traffic_ctl config set "来代替"traffic_line -s"动态配置参数。

ICP Peering

The Internet Cache Protocol (ICP)被代理缓存使用去交换彼此的资源信息,ICP query消息去查询其它缓存是否存有指定的URL?
ICP response消息会应答为hit或miss。缓存只会和自己相邻的,并且能够接收ICP消息的特定ICP peer交换ICP消息。一个ICP缓存可以是一个sibling缓存(在分级缓存中同级)或是parent缓存(在分级缓存中高一级)


假如ATS开启了ICP caching,那么当HTTP请求cache miss时,它发送ICP query到ICP peers。假如ICP peers都没有hit,但是存在父级缓存,它会使用轮询策略
(round-robin policy)选择一个父缓存。假如没有ICP父缓存存在,ATS会将请求转发到HTTP父缓存。假如没有HTTP父缓存,ATS会转发请求到源站。


为了配置ATS节点作为ICP分级缓存的一部分,你必须执行下面的任务:

  • 确定ATS是否只能接收ICP消息,或者是否发送和接收ICP消息
  • 确定ATS是否可以直接将消息发给每个ICP peer,或者在指定多播通道发送单个消息
  • 指定ICP消息使用的端口
  • 确定能与ATS通信的ICP peer(siblings and parents)


在records.config中配置如下选项来使用ICP分级缓存ICP cache hierarchy
proxy.config.icp.enabled
proxy.config.icp.icp_port
proxy.config.icp.multicast_enabled
proxy.config.icp.query_timeout
配置icp.config,对每个你想识别的ICP peer,给出一条单独的规则

运行traffic_ctl config reload去让配置变动生效

参考文档
[1].https://docs.trafficserver.apache.org/en/latest/admin/hierachical-caching.en.html#configuring-traffic-server-to-use-a-parent-cache
[2].https://docs.trafficserver.apache.org/en/latest/reference/configuration/parent.config.en.html

 

=============================

http://blog.csdn.net/tao_627/article/details/48196519

parent.config

parent.config文件识别用在缓存分级中的父代理,用这个文件去执行下面的配置:

  • 搭建父分级缓存,兼容多父级缓存和父级缓存故障转移
  • 配置指定的URL请求避开父代理缓存

仅当父缓存选项开启后,ATS才能使用parent.config文件。
当你修改parent.config文件后,运行traffic_ctl config reload命令去让变更生效。当你对集群中的一个节点更新配置时,ATS会自动将配置更新应用到集群中的所有其它的节点。

格式
parent.config中每行必须包含一个parent caching rule,ATS识别以空格分隔的标签:
primary_destination=value  secondary_specifier=value   action=value
下表给出了primary_destination的目标和它们的允许值:
dest_domain:   请求的域名和子域名
dest_host: 请求主机名
dest_ip:  请求的IP地址或是IP地址范围,使用短杠-分隔
url_regex: URL中的正则表达式(regex)


secondary_specifiers在parent.config中可选,可能的指示符和允许的值如下:
port:      请求URL的端口
scheme:       请求URL的协议:http或https
prefix:   请求URL的path前缀
suffix:         请求URL的path后缀
method:    请求URL的方法,可以为get,post,put,trace中之一
time:         父缓存服务请求的时间段,比如 08:00-14:00,这个功能太牛逼了
src_ip:       client的IP地址
internal:     布尔值true或false,指定该规则是match还是not match一个来自内部API(也就是插件自身触发的)的transaction,比如background_fetch插件发送的http请求


下表给出了可能的actions和它们允许的值
parent:   父服务器列表,假如请求不能被列表中的最后一个父服务器处理,将会直接回源,可以使用域名或是IP地址指定,但必须指定端口号
round_robin: 下列值之一:
  true  ATS基于client IP地址轮询方式遍历父缓存
  strict ATS严格依照次序处理请求,比如proxy1服务第一个请求,proxy2服务第二个请求,等等
  false  禁用轮询父缓存方法
  consistent_hash  url一致性hash,以便于一个给定url只有一个父缓存服务,假如一个父缓存宕机,ATS会跳过该宕机的父缓存去重新对剩下的父缓存们做一致性hash,
                 其它流量不受影响,一旦宕机的父缓存再次可用时,流量分布会重回宕机前的状态
go_direct: 下列两个值之一:
  true  请求会跳过父级缓存直接回源
  false 请求不跳过父级缓存,按正常思路走呗

示例
下面的规则配置了一个一子两父(p1.x.com和p2.x.com)的分级缓存,ATS会转发它不能serve的请求到父服务器p1.x.com和p2.x.com,
dest_domain=. method=get parent="p1.x.com:8080; p2.y.com:8080" round_robin=true  //使用轮询方式round_robin=true;primary_destination=value  secondary_specifier=value   action1=value1 action2=value2


dest_domain=. method=get parent="p1.x.com:8080|1.0; p2.y.com:8080|2.0" round_robin=consistent_hash  //使用round_robin=consistent_hash

下面的规则配置了ATS将所有含有正则表达式politics和path为/viewpoint的请求直接到源站(跳过任何父级缓存):
url_regex=politics prefix=/viewpoint go_direct=true     //primary_destination=value  secondary_specifier=value   action=value

 



注意
parent.config中每行必须包含parent=或go_direct=指示符

参考文献
[1].https://docs.trafficserver.apache.org/en/latest/reference/configuration/parent.config.en.html 

 

 

=================================实例分析======================

子ATS:

CONFIG proxy.config.reverse_proxy.enabled INT 1 

map http://www.mytest.com:8080/ http://oringin.server.com:8000/pic/    #代表子ATS收到的http://www.mytest.com:8080/请求会被转换成http://oringin.server.com:8000/pic/

例如:

客户发发起的http://www.mytest.com:8080/trafficserver.png,会被转成http://oringin.server.com:8000/pic/trafficserver.png

日志:   "TCP_MISS:DIRECT" 

给子ATS增加父ATS

dest_host=http://oringin.server.com port=8000 prefix=/pic parent="ip_of_parent_ats:8080" round_robin=true 

解释:

当ATS收到的http://www.mytest.com:8080/,如果cache miss了,请求会被转换成http://oringin.server.com:8000/pic/,但在向源站发起请求之前,子ATS会检查parent.config配置,如上例所示刚好匹配到了

dest_host=http://oringin.server.com port=8000 prefix=/pic parent="ip_of_parent_ats:8080" round_robin=true 

所以子ATS会把请求转发给父ATS, 日志:"TCP_MISS:PARENT_HIT", 【该状态只是代表本节点miss了,并且找到了父节点,但父节点能不能响应该请求不确定

子ATS会向地址为ip_of_parent_ats的父ATS的8080端口转发请求,转发出去的请求为:http://origin.server.com:8000/pic/trafficserver.png

 

父ATS:

如果父ATS没有配置关于origin.server.com:8000的规则的话,日志会返回: ERR_INVALID_URL:NONE

如果父ATS在其remap.config中有origin.server.com:8000相关的配置的话,例如  

map http://origin.server.com:8000/pic/ http://origin.server.com:8000/pic/   #直接去源站取

map http://origin.server.com:8000/pic/ http://127.0.0.1:8000/ats/   #去其他地方去也可以

 

 

注意:

remap.config中的

 

<map_type> client-URL origin-server-URL <tag_value> <filtering>

Where client-URL and origin-server-URL are both of the format
<scheme>://<host>:<port>/<path_prefix>    到路径截至,不能包括特定的file name

client-URL:既可以是来自http客户端的直接请求,也可以是来自其他ATS透传过来的真实的客户端请求,端口号并一定非得是ATS的监听端口

比如一个源站对外服务的url是: http://example.com:9999/test.cgi

客户端可以通过给浏览器配置代理的方法,使得客户端的请求被发往ATS服务器。或者直接使用wget -e http_proxy=ats机器的ip:port http://example.com:9999/test.cgi -S ,

此时ATS的remap.config的配置应该如下:

map  http://example.com:9999/   http://example.com:9999/   #直接发往源站

map  http://example.com:9999/   http://othersize.com/   #直接发往任意其他站点