Nginx 高级篇(六)第三方模块的安装以及一致性哈希算法的应用

前沿:我们安装好的Nginx之后后边的工作当中难免需要安装其他的第三方的Nginx的模块,或者说之前编译安装Nginx的时候有些模块没有编译进去;咋办?
草!看我的learnku博客吧:博客:CentOS 下重新编译 nginx 添加模块

之前我们在Nginx高级篇(四)以及Nginx高级篇(五)里面讲到过 通过Nginx直接连接memcache或者redis 单前提是我们那时针对一台memcache缓存服务器 一台,就一台哎!也许能应对一般的流量冲击 要是超大流量冲击一台是不够用的 所以你得上mamcache集群化部署或者redis集群化部署 那就不是一台memcache或者redis的服务器了!
Nginx高级篇(六)第三方模块的安装以及一致性哈希算法的应用

现在假设他妈的流量冲击相当大,大到一秒几万个请求,一台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 也就是采用一致性哈希算法来实现
Nginx高级篇(六)第三方模块的安装以及一致性哈希算法的应用
从起php-fpm即可!
php当中是如何处理的呢?
Nginx高级篇(六)第三方模块的安装以及一致性哈希算法的应用
Nginx高级篇(六)第三方模块的安装以及一致性哈希算法的应用

这样就实现了第一次请求找memcache1没找到 那么去请求php则php通过一致性哈希算法的规则 也会向memcache1服务器上的缓存当中写入数据!第二次相同的请求也会再去请求memcache1服务器上的缓存当中获取数据!保持了请求的memcache和php写入数据到的memcache 保持一致!这样就不会再出现乱七八糟的情况发生!

本作品采用《CC 协议》,转载必须注明作者和本文链接
胡军
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!