天天看點

@cacheable 伺服器 不一緻_一緻性hash一、一緻性hash的概念二、普通hash的原理 三、一緻性hash的原理四、虛拟節點五、Nginx通過子產品實作一緻性hash

一、一緻性hash的概念

一緻哈希是一種特殊的雜湊演算法。在使用一緻雜湊演算法後,哈希表槽位數(大小)的改變平均隻需要對 K/n個關鍵字重新映射,其中K是關鍵字的數量, n是槽位數量。然而在傳統的哈希表中,添加或删除一個槽位的幾乎需要對所有關鍵字進行重新映射。

二、普通hash的原理

@cacheable 伺服器 不一緻_一緻性hash一、一緻性hash的概念二、普通hash的原理 三、一緻性hash的原理四、虛拟節點五、Nginx通過子產品實作一緻性hash

普通hash算法能夠均勻地将資料打散到這些節點上,使用的是Hash算法(MD5算法)實作的随機分布。但是當一個節點出現問題時,node數量發生了變化,item所對應node也會相應發生變化,改變的數量大概為99%,假設這是redis的緩存層,那麼在後端伺服器和資料庫之間設定的緩存層等同于在一段時間内失效。

如果繼續使用普通hash來部署結構,則隻能使用主從模式

@cacheable 伺服器 不一緻_一緻性hash一、一緻性hash的概念二、普通hash的原理 三、一緻性hash的原理四、虛拟節點五、Nginx通過子產品實作一緻性hash

三、一緻性hash的原理

一緻性Hash算法将整個哈希值空間組織成一個虛拟的圓環,将各個伺服器使用Hash進行一個哈希,可以對伺服器的IP或主機名等參數進行hash,确定每台機器在哈希環上的位置。

接下來把通路的請求定義到相應的圓環上,圓環順時針轉動找到的第一個node便是定位到的伺服器。如果前面的伺服器不可用,則會繼續向前尋找。增加node節點原理也類似。

@cacheable 伺服器 不一緻_一緻性hash一、一緻性hash的概念二、普通hash的原理 三、一緻性hash的原理四、虛拟節點五、Nginx通過子產品實作一緻性hash

四、虛拟節點

如果node節點太少時,可能會出現節點分布不均衡,此時肯定會有伺服器壓力大,其他伺服器壓力小的情況,為了避免這種情況,引入了虛拟節點的概念。

@cacheable 伺服器 不一緻_一緻性hash一、一緻性hash的概念二、普通hash的原理 三、一緻性hash的原理四、虛拟節點五、Nginx通過子產品實作一緻性hash

例如上面的情況,可以為每個節點加幾個虛拟節點,解決了伺服器請求傾斜的問題。

五、Nginx通過子產品實作一緻性hash

Nginx使用ngx_http_upstream_consistent_hash子產品來實作,需要重新進行編譯安裝。

檔案名:ngx_http_consistent_hash-master.zip

github下載下傳:https://github.com/replay/ngx_http_consistent_hash

 unzip ngx_http_consistent_hash-master#進入到nginx的源碼安裝目錄#隻需要加入之前的參數,可以nginx -v ./configure --"你之前的配置***"    --add-module=/home/guowenyan/ngx_http_consistent_hash-mastermake
           

注:不要使用make install

make完成之後進入nginx的objs目錄下可以看到新編譯nginx檔案

執行nginx -t;如果沒有報錯,則可以執行下面操作

service nginx stopcp /usr/bin/nginx /usr/bin/nginx_bakcp ./nginx /usr/bin/nginxservice nginx start
           

  注意路徑。。

示例nginx.conf配置

upstream hash {        consistent_hash $request_uri;        server 192.168.11.1:8080;        server 192.168.11.1:8080;        server 192.168.11.1:8080;}