Nginx 高階篇(六)第三方模組的安裝以及一致性雜湊演算法的應用

huxiaobai_001發表於2020-03-20

前沿:我們安裝好的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 協議》,轉載必須註明作者和本文連結

胡軍

相關文章