Nginx 高级篇(六)第三方模块的安装以及一致性哈希算法的应用
前沿:我们安装好的Nginx之后后边的工作当中难免需要安装其他的第三方的Nginx的模块,或者说之前编译安装Nginx的时候有些模块没有编译进去;咋办?
草!看我的learnku博客吧:博客:CentOS 下重新编译 nginx 添加模块
之前我们在Nginx高级篇(四)以及Nginx高级篇(五)里面讲到过 通过Nginx直接连接memcache或者redis 单前提是我们那时针对一台memcache缓存服务器 一台,就一台哎!也许能应对一般的流量冲击 要是超大流量冲击一台是不够用的 所以你得上mamcache集群化部署或者redis集群化部署 那就不是一台memcache或者redis的服务器了!
现在假设他妈的流量冲击相当大,大到一秒几万个请求,一台memcache服务器估计可能就撑不住啊,假设哈 假设咱们上三台memcache缓存服务器,那得公司有钱才行,要不假设吗!
这里有两个疑问?
1.假设用户请求过来了 第一步利用Nginx对memcache模块的支持 直接去请求memcache缓存服务器,你说我是请求1 还是 请求2 还是请求3?
2.假设用户没有通过缓存服务器获取到缓存数据返回404或者502或者504那么就得通过php-fpm去请求php服务区找DB数据库获取对应的id的记录返回给Nginx并且还要干一件事就是把这条数据写入到memcache当中去 那它应该往哪个memcache服务里面写呢?
针对第一个问题 如果我们不采用“一致性哈希算法”的话 只是配置了集群,那么在请求的时候会按照取模的算法去找对应的memcache服务,可能相同的请求这次去请求了memcache1第二次可能就请求到memcache2第三次呢可能有跑到memcache3上去了!但是有个问题就是我第一次请求的memcache1假设没有那么就会去找php去库里面查找然后插入到memcache缓存当中,如果我们在php当中也没用“一致性哈希算法”的话 有可能就插入到memcahe1 还有可能插入到memcache2里面去 这岂不就乱套了!乱七八糟!
是的,在集群为缓存的时候如果不使用“一致性哈希算法” 嘿嘿 就是这么个结果,乱七八糟!
怎么办呢?怎么办呢?怎么办呢?怎么办呢?
A.安装第三方模块 重新编译Nginx
wget https://github.com/replay/ngx_http_consistent_hash/archive/master.zip unzip master.zip
解压之后会得到一个ngx_http_consistent_hash-master的文件夹
我们需要重新编译Nginx并将第三方模块编译进Nginx当中去 这就用到了我们之前的文章了哈:
博客:CentOS 下重新编译 nginx 添加模块pkill -9 nignx //彻底杀死nginx cd /usr/local/src/nginx-1.16.1 make clean //清空之前的一些配置参数 ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_http_consistent_hash-master/ make && make install
编译完成之后重启Nginx就可以了!之前的nginx.conf里面的配置还是有滴哈!
B:配置memcache集群
nginx.conf当中配置如下:
upstream somestream {
#重点哈 获取$request_uri来作为memcache的key
consistent_hash $request_uri;
#重点哈 不同节点的memcache服务器
server 10.50.1.3:11211;
server 10.50.1.4:11211;
server 10.50.1.5:11211;
}
server {
listen 80;
server_name localhost;
location / {
default_type text/html;
#重点哈 这句话设置$request_uri作为memcache的key
set $memcached_key $request_uri;
#重点哈 去找上游的somestream发起请求
memcached_pass somestream;
#重点哈 如果为空回到fallback;
error_page 500 404 405 = @fallback;
#error_page 500 404 405 = /aa.php;直接去请求某个php文件也行哈!php里面直接$_SERVER['request_uri']就能获取到请求连接地址也是作为memcache的key来使用
}
location @fallback {
root /srv/www/whatever;
fastcgi_intercept_errors on;
error_page 404 = @404;
set $script $uri;
set $path_info "";
include /usr/local/nginx/conf/fastcgi_params;
fastcgi_param SCRIPT_FILENAME /srv/www/whatever/test.php;
fastcgi_param SCRIPT_NAME $script;
fastcgi_param REQUEST_URI $uri;
fastcgi_pass 127.0.0.1:9000;
}
}
c.PHP当中的配置:
首先你的PHP当中一定是安装了memcache的扩展的哈!
红线表示memcache的hash策略为consistent 也就是采用一致性哈希算法来实现
从起php-fpm即可!
php当中是如何处理的呢?
这样就实现了第一次请求找memcache1没找到 那么去请求php则php通过一致性哈希算法的规则 也会向memcache1服务器上的缓存当中写入数据!第二次相同的请求也会再去请求memcache1服务器上的缓存当中获取数据!保持了请求的memcache和php写入数据到的memcache 保持一致!这样就不会再出现乱七八糟的情况发生!
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: