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 协议》,转载必须注明作者和本文链接
胡军