C2-Squid_neighbour 与 haproxy_roundrobin
拓扑:
- DNS 10.0.100.71
- Haproxy 10.0.100.82
- Squid 10.0.100.72/73
- Nginx 10.0.100.75/76
- NFS 10.0.100.70
- DNS
- | (static)
- Haproxy ------> Squid.72/73 (origin server Nginx.75/76)
- |(dynamic)
- Nginx
- |
- NFS
前一遍介绍过haproxy_url-hash
B4-haproxy_url-hash
url hash 优点: 相同的uri总是转到同一台服务器上,这样haproxy后面多台squid缓存服务器,每台squid缓存的内容都是不一样的,用来增加缓存命中率。
url hash 缺点: 最怕遇到热点特别热那种,因为单一的url 并发过高,而导致其中一个cache server 跑满了一个cpu(url hash 把这个url 都调度到这个cache) ,squid 只能使用一个cpu(听说squid 3.2 beta 版支持SMP 了) ,这个cpu 跑满载了请求就会开始阻塞了。
下面介绍另一个方法
haproxy_roundrobin 与 squid_neighbour
haproxy 代码
- acl static path_end -i .jpg .png .bmg .gif .html
- use_backend cache.test.com if static
- backend cache.test.com
- option forwardfor
- #balance uri len 15 #url hash
- balance roundrobin
- server server1 10.0.100.72:80 check inter 2000 rise 3 fall 3 weight 3
- server server2 10.0.100.73:80 check inter 2000 rise 3 fall 3 weight 3
squid 代码
- #配置 cache02为其邻居,当 cache01(squid) 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
- cache_peer cache02.test.com sibling 80 3130
- cache_peer cache03.test.com sibling 80 3130
- #cache01 的两个父节点,originserver 参数指明是源服务器;
- #round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;
- #squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了;
- #那么 squid 会从剩余的 origin 服务器中抓取数据
- cache_peer 10.0.100.75 parent 80 0 no-query originserver round-robin name=webServer1
- cache_peer 10.0.100.76 parent 80 0 no-query originserver round-robin name=webServer2
- cache_peer 10.0.100.70 parent 80 0 no-query originserver round-robin name=webServer3
- #将 monitor.test.com 域的请求通过 RR 轮询方式转发到两个父节点中的一个
- cache_peer_domain webServer3 monitor.test.com
- cache_peer_domain webServer1 webServer2 bbs.test.com
- cache_peer_domain webServer1 webServer2 forum.test.com
- cache_peer_domain webServer1 webServer2 blog.test.com
- cache_peer_domain webServer1 webServer2 www.test.com
//编辑主机名
- tail -n3 /etc/hosts
- 10.0.100.72 cache01.test.com
- 10.0.100.73 cache02.test.com
- 10.0.100.74 cache03.test.com
测试
//firefox浏览器
HTTP/1.0 304 Not Modified
Date: Thu, 19 Jul 2012 06:24:14 GMT
Content-Type: image/png
Expires: Wed, 15 May 2013 06:24:14 GMT
Last-Modified: Thu, 19 Jul 2012 06:23:58 GMT
Age: 58
X-Cache: HIT from cache02.test.com, MISS from cache01.test.com
Via: 1.0 cache02.test.com:80 (squid/2.7.STABLE9), 1.0 cache01.test.com:80 (squid/2.7.STABLE9)
//cache01
192.168.4.33 - - [19/Jul/2012:14:25:09 +0800] "GET http://blog.test.com/wp-content/uploads/2012/07/squid-linjun11-300x100.png HTTP/1.1" 304 373 "http://blog.test.com/?p=66" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" TCP_MISS:SIBLING_HIT
//cache02
192.168.4.33,%2010.0.100.82 - - [19/Jul/2012:14:25:10 +0800] "GET http://blog.test.com/wp-content/uploads/2012/07/squid-linjun11-300x100.png HTTP/1.0" 304 291 "http://blog.test.com/?p=66" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" TCP_IMS_HIT:NONE
//firebug 截图
参考
C1-Squid_Cache-Server
Squid 中文权威指南
#update 20120806
#邻居
#配置 cache02为其邻居,当 cache01(squid) 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
cache_peer cache02.test.com sibling 80 3130
cache_peer cache03.test.com sibling 80 3130
#cache01 的两个父节点,originserver 参数指明是源服务器,
#round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;
#squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了;
#那么 squid 会从剩余的 origin 服务器中抓取数据
cache_peer 10.0.100.75 parent 80 0 no-query originserver round-robin name=webServer1
cache_peer 10.0.100.76 parent 80 0 no-query originserver round-robin name=webServer2
cache_peer 10.0.100.70 parent 80 0 no-query originserver round-robin name=webServer3
#将 monitor.test.com 域的请求通过 RR 轮询方式转发到三个父节点中的一个
cache_peer_domain webServer3 monitor.test.com
cache_peer_domain webServer2 blog.test.com t.test.com www.test.com
cache_peer_domain webServer1 bbs.test.com forum.test.com www.test.com
#update 20120807
1 术语
通常把一组互相转发请求的 cache(或代理)叫做 cache 堆叠。把 cache 堆叠的成员叫做邻居或对等伙伴。
邻居 cache 有 2 种关系:父子或姐妹。从拓扑上看,父 cache 在堆叠里位于顶层,而姐妹 cache 位于同一层。
两者真正的不同在于,父 cache 能为子 cache 转发 cache 丢失,然而姐妹 cache 之间不允许转发 cache 丢失。
这意味着,在发送请求到姐妹 cache 前,发起者应该知道这是个 cache 命中。
类似于 ICP,HTCP 和 Cache Digests 之类的堆叠协议,能预知邻居的 cache 命中。然而 CARP 不能这样。
某些时候,cache 堆叠并非真正层次性的。例如,考虑 1 组 5 个姐妹 cache。因为它们没有父子关系,故而不存在上或下。
在这种情况下,你可以叫它 cache 结网,或甚至 cache 编队,而不是堆叠。
2 Squid 与邻居通信
cache_peer 指令定义邻居 cache,并告诉 squid 如何与它的邻居通信:
cache_peer hostname type http-port icp-port [options]
第 1 个参数 是邻居的主机名,或 IP 地址。可以安全的在这里使用主机名,因为 squid 会解析它们;
在 squid 运行期间,主机名对应的 IP 地址可能会改变,所以实际上 squid 会周期性的解析主机名;
邻居主机名必须唯一:不能在 2 个邻居 cache 上使用同样的主机名,即使它们有不同的端口。
第 2 个参数 指定邻居 cache 的类型。有 3 个选择:父亲,姐妹,或广播。父亲和姐妹关系容易理解。
第 3 个参数 是邻居 HTTP 端口号。它应该等同于邻居的 http_port 设置。总是应该指定 1个非零的 HTTP 端口号。
第 4 个参数 指定 ICP 或 HTCP 端口号。squid 默认使用 ICP 来查询其他 cache;
也就是说,squid发送 ICP 查询到邻居 cache 的指定端口。假如你增加了 htcp 选项,squid 就会发送 HTCP 查询到这个端口;
默认的 ICP 端口是 3130,默认的 HTCP 端口是 4827。假如增加了 htcp 选项,请记得改变它的端口号;
将端口号设为 0,会禁止 ICP 和 HTCP ,然而应该使用 no-query选项来禁止这些协议。
2.1 cache_peer 选项
cache_peer 指令有很多选项。在这里描述其中的一些,其他的参数在与之相关的协议的章节里有描述。
proxy-only 该选项指示 squid 不存储它接受自邻居的任何响应。如果你有 cache 集群,并且不希望资源存储在多个 cache 上,那么该选项有用。
weight=n 该选项指定给 ICP/HTCP。请见 10.6.2.1 章节。
ttl=n 该选项指定给广播 ICP。见 10.6.3 节。
no-query 该选项指定给 ICP/HTCP。见 10.6.2.1 节。
default 在缺少其他线索时,该选项指定邻居 cache 作为适当的选择;
正常情况下,squid 将 cache丢失转发给父 cache, cache 看起来有特定资源的缓存拷贝;
父有时候 squid 没有任何线索(例如使用 no-query 禁用了 ICP/HTCP)这时 squid 会寻找父 cache,并将其作为默认选择。
round-robin 该选项是简单的负载共享技术。仅仅当你指定了 2 个或多个父 cache 作为轮转时,它才有用;
squid 对每个父 cache 维持一个计数器。当需要转发 cache 丢失时,squid 选择计数器值最低的父 cache。
multicast-responder 该选项指定给广播 ICP。见 10.6.3 节。
closest-only 该选项指定给 ICP/HTCP。见 10.6.2.1 节。
no-digest 该选项指定给 cache digest,见 10.7 章。
no-netdb-exchange 该选项告诉 squid,不要请求邻居 cache 的 netdb 数据库(见 10.5 节)。
no-delay 该选项告诉 squid,忽略任何对邻居 cache 请求的延迟池设置。见附录 C 关于延迟池的更多信息。
login= credentials 该选项指示 squid 发送 HTTP 验证信息到邻居 cache。它有 3 个不同的格式:
login =user:password 这是最通用的形式。它导致 squid 在每个到邻居 cache 的请求里,增加相同的用户名和密码。用户无须填写任何验证信息。
login=PASS 将值设为 PASS,导致 squid 让用户的验证信息直接 pass 到邻居 cache。它仅仅工作在 HTTP基础的验证机制下。
squid 不会增加或修改任何验证信息。假如 squid 被配置成需要代理验证(例如使用 proxy_auth ACL) 邻居 cache 就必须使用同样,的用户名和密码数据库;
换句话说,应该只在被同一组织拥有和操作的一组 cache 中使用PASS 形式。该功能是危险的,因为 squid 不会从转发请求里移除验证信息。
login =* :password 使用该形式,squid 改变它转发的请求里的密码,但不改变用户名。它允许邻居 cache 来验证独立的用户,但不暴露其密码。
该形式比使用 PASS 危险少一些,但确实有一些隐私牵连。使用该功能需要额外小心。即使你不管隐私条目,该功能也可能对上级代理产生不良的副作用。
例如,我知道至少 1 个其他的 cache 产品,它仅仅查看持续连接里第一个请求的信用信息。它看起来(不正确的)假设在单个连接里的所有请求,都来自同一用户。
connect-timeout= n 该选项指定,在 squid 建立 TCP 连接到邻居 cache 时,等待的超时时间。若没有该选项,超时值就取自全局 connect_timeout 指令,它的默认值是 120 秒。使用低的超时值,squid 会迅速放弃到邻居 cache 的会话,并且试着发送请求到其他邻居 cache,或直接请求原始服务器。
digest-url= url 该选项指定给 cache digest。见 10.7 章。
allow-miss 该选项指示 squid 忽略 Cache-Control: only-if-cached 指令,该指令是针对发送给姐妹 cache的请求的。
仅在如下情况下使用它:邻居 cache 激活了icp_hit_stale 指令,并且没有使用miss_access 列表。
max-conn= n 该选项对 squid 打开到邻居 cache 的同时连接的数量进行限制。当抵达了该限制时,squid 从它的选择算法里排除掉该邻居 cache。
htcp 该选项指定邻居 cache 为 HTCP 服务器。换句话说,squid 发送 HTCP 查询,而不是 ICP 查询,到邻居 cache。
squid 不会在同一端口上接受 ICP 和 HTCP 查询。若你增加了该选项,不要忘了改变 icp-port 的值。HTCP 支持需要在运行./configure 时,使用--enable-htcp 选项。
carp-load-factor= f 该选项让邻居 cache(它必须是父 cache)
成为 CARP 的成员。对所有父 cache 的 f 值的总和,必须等于 1。CARP 支持需要在运行./configure 时,使用--enable-carp选项。
3 对邻居的请求限制
cache_peer_access 指令定义对邻居 cache 的访问列表,也就是说它决定哪个请求允许或不允许发送到邻居 cache。
cache_peer_domain 指令是 cache_peer_access 指令的早期形式。
相对于使用完整的访问控制特性,它仅使用 URI 里的域名。它常用于通过域名区分一组父 cache。
结束
更多请:
linux 相关 37275208
vmware 虚拟化相关 166682360