如何提高squid的命中率呢,使用nginx中url hash是用于提高squid命中率的一种架构算法,一般现行的架构通常是使用dns轮询或lvs等将访问量负载均衡到数台squid,这样做可以使squid的访问量做到了均衡,但是忽略了一个重要方面--数据量。
这种架构下,每台squid的数据量虽然是一致的,但通常都是满载,并且存在数据重复缓存的情况。
在新的架构下,使用nginx架载于squid之前,如果squid机器有4台,那么在这4台机器上装上nginx,nginx使用80端口,而squid改为3128端口或其他端口。nginx的效率非常高,消耗内存也 然后,在nginx上配置url hash,使访问量根据url均衡分布到各台squid,根据url分流之后,每一个url就会只存在于一台squid中,每台squid的数据都会完全不同。 我们有4台机器,每台2G内存的话,原先极有可能因为数据大量重复,内存使用率仍然为2G,而现在我们经过数据均衡分布,8G内存可以达到充分利用。 是否会存在访问不均的情况呢?是有可能的,但是根据大数原理,访问量基本可以保持一致,只要不存在单一的特别夸张的热点。
假如squid是利用squidclient来刷新数据的话,新的架构提供了更高效的方法:在后端服务器中模拟url hash的算法来找到内容所在的squid,然后对此服务器刷新内容即可。在旧的架构中 具体配置如下:
安装第三方模块:ngx_http_upstream_hash_module
复制代码 代码示例:http://wiki.codemongers.com/NginxHttpUpstreamRequestHashModule?action=AttachFile&do=get&target=nginx_upstream_hash-0.2.tar.gz
配置:
复制代码 代码示例:upstream backend {
复制代码 代码示例:#define ngx_hash(key, c) ((u_int) key * 31 c)
return key;
java代码(随手写未测试):
复制代码 代码示例:public static long getSimpleHash(String data) 提供hash算法的目的如前所述,是便于后端服务器迅速找到内容对应的squid服务器。 在ngx_http_upstream_hash_module模块里有一个hash_again的标签,可以解决squid意外死机的问题。
如果使用了该标签,那么后端的计算对应服务器的方法就会出现错误。
|