详解nginx的url与hash给squid提速(3)
时间:2011-03-03 14:47来源: 作者: 点击:
次
java代码(随手写未测试): public static long getSimpleHash(String data) { long key = 0; char[] chars = data.toCharArray(); for (int i=0; i key *= 31; key = (int) chars[i]; } return key; } 然后对生成
java代码(随手写未测试):
public static long getSimpleHash(String data) { long key = 0; char[] chars = data.toCharArray(); for (int i=0; i key *= 31; key = (int) chars[i]; } return key; }
然后对生成的key和upstream里的服务器数量做一次求余计算,得到服务器号。
提供hash算法的目的如前所述,是便于后端服务器迅速找到内容对应的squid服务器。
在ngx_http_upstream_hash_module模块里有一个hash_again的标签,可以解决squid意外死机的问题。不过,如果使用了该标签,那么后端的计算对应服务器的方法就会出现错误。可以使用的办法为,提供一台备份的squid服务器,假如有squid死机,那么在nginx里设置error_page 404和502到这台备份服务器,后端刷新缓存时亦要同时刷备份服务器。
另外一种实现url hash的方法:
使用NginxHttpUpstreamRequestHashModule的方式,增加或减少机器时所引起的hash全部错乱的问题还是很令人担心,所以经过一段时间细致思考,觉得由自己手工制定并实现url hash规则,然后利用nginx的location标签或if语法来实现来得更为灵活,可操作性和可用性会大大加强。不过配置就稍显复杂了,也需要程序方面的支持。
使用这种环境,主要需要考虑链接形式,链接形式不能够是/xxx.jsp?id=1这样的带有?的,否则处理起来会很复杂,需要使用rewrite将这种形式的url变化成/1/1.html,其中加一级目录的目的是可以利用到location标签。如果是纯静态页或图片,一般都会有自成的目录规则。
首先我们制定一个链接的划分规则,这个规则有点区别于文件目录的划分规则,它本身并不需要考虑文件夹内文件数目的多少,制定这个规则的目的是容纳足够多的服务器!一般来说,如果id是字符型的,只需要分出26个字母 10个数字,能够容纳36台cache服务器,这已经很足够了。如果是数字型的id,那就拿数字id0,就可以支持100台cache,已经足够夸张。一般说来,,支持10台服务器应该就足够了,配置也容易一点。
有了这个目录规则,就可以通过nginx的语法来书写配置了。
首先制定一堆upstream,如果是偶数,理论能够分得更均衡。
(责任编辑:admin) |
织梦二维码生成器
------分隔线----------------------------