您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
nginx-第3方模块编译及一致性哈希应用
发布时间:2017-11-23 12:30:02编辑:雪饮阅读()
安装nginx的第三方哈希算法模块:
解压ngx_http_consistent_hash-master.zip
unzip ngx_http_consistent_hash-master.zip
给nginx添加第三方模块(不用make clean)
./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_http_consistent_hash-master/
编译之后关闭当前nginx进程,然后再make && make install
添加memcached服务器组并将nginx连接至该服务器组:
添加memcached上游服务器组,并将nginx连接的memcached转连该服务器组
memcached服务器组:
upstream mcserver {
server 192.168.101.108:11211;
server 192.168.101.108:11212;
server 192.168.101.108:11213;
}
nginx直接连接至memcached服务器组:
location / {
set $memcached_key "$uri";
memcached_pass mcserver;
error_page 404 /callback.php;
}
测试nginx连接至mc服务器组后对mc服务器组中成员的读写情况:
然后依次启动3台不同端口的memcached服务
./bin/memcached -u nobody -vv -p 11211
./bin/memcached -u nobody -vv -p 11212
./bin/memcached -u nobody -vv -p 11213
然后访问url如http://192.168.101.108/user4.html,经过实验发现数据只有偶尔能请求到,其余都是要请求到数据库,这是因为回调中每次都写入到了11211端口中,而请求时默认是根据mc服务器组中的成员与key利用取模算法来计算应该向哪台mc中请求。这样以来就会导致大多数情况都要到数据库中取值。
为mc服务器组添加get所用的哈希算法:
添加哈希算法,这样就可以通过哈希算法来查询了。
upstream mcserver {
consistent_hash $request_uri;
server 192.168.101.108:11211;
server 192.168.101.108:11212;
server 192.168.101.108:11213;
}
$request_uri:用来接收nginx发送过来的uri
重启3个mc服务器以及nginx配置重载。
再次测试,发现这次请求mc的概率非常高,这是因为哈希算法正好计算到11211中了,并且回调中每次都写入的也是11211.但也不排除 某些特殊的key会从mc中永远获取不到,因为某些特殊的key可能导致哈希计算到非11211的mc服务器中了,而回调默认是写到11211中的。
将回调的php脚本中默认向11211mc服务器写数据改为向mc服务器组写数据:
$mem->addServer('192.168.101.108',11211);
$mem->addServer('192.168.101.108',11212);
$mem->addServer('192.168.101.108',11213);
这次测试发现”/user1.html”每次都从数据库中取,观察才发现每次都写入到了11213的mc中了,这也是因为php向mc服务器组写数据也是默认用key和mc服务器组成员进行取模的算法的原因。
为php配置向mc服务器组写入数据时的算法为nginx所用的哈希算法:
php.ini中添加上面所用的哈希算法
extension=/usr/local/fastphp/lib/php/extensions/no-debug-non-zts-20100525/memcache.so
memcache.hash_strategy=consistent
再次实验发现成功了,get时和add时算法一致。
关键字词:nginx,哈希,一致性,模块,编译