有時我們僅布置一台快取機器(如mencached,redis)是不夠的,因此需要分布式快取。
那麼問題來了,當我們布置了多台機器,我們如何確定乙個資料應該儲存在哪一台機器上?或者說,我們怎麼知道我們要查詢的資料分布在哪一台機器上?
通常有以下兩種方式:
普通hash分布
一致性hash分布
下面以php為例
普通hash分布很簡單,就是將快取資料的key進行hash運算,直接對映到一台機器上。例如使用以下hash演算法:
function
mhash
($key)
return
$hash & 0x7fffffff;
}
hash演算法計算出來的結果是乙個整數,假設我們現在有2臺機器,直接將hash得到的結果除以2取餘數,可以得到0或者1,直接對應我們的2臺機器。
$server_list = [
'192.168.3.100',
'192.168.3.101',
];$server = $server_list[mhash($key)%2];
得到伺服器ip,就可以進行訪問資料的操作了。
當伺服器數量會發生變化時,普通hash演算法就不可用了。因為hash得到值要除以伺服器數量取餘數來確定資料存放哪一台,如果伺服器數量改變了,最終得到的伺服器會不同,就無法精確的訪問資料了。
而一致性hash就解決了這個問題,它的原理如下:
我們可以想象現在有乙個逆時針的環,然後把多台機器的ip都進行hash運算,最終分布在這個環上,如下圖所示的server1,server2,server3(按順序分布):
同時將我們要儲存的資料的key也進行hash運算,得出的結果也分布在這個環上,如圖中所示的k1~k4。
那麼我們就可以把k1和k2的資料存到server2中,k3存到server3中,k4存到server1中。這樣我們就找到了資料的歸屬伺服器。
當新增伺服器時,假設增加了server5伺服器,如下圖:
那麼我們就將k1搬到server5,k2還是在server2中,其他資料維持不變。這就是一致性hash。
減少一台伺服器時,原理和增加伺服器是一樣的。
注意,上圖中所示的server的hash值在環上是按順序排列的,這樣我們才能根據大小來找到對應關係。
<?php
/** * created by phpstorm.
* user: zhoujun
* date: 2017/4/26
* time: 20:43
*/function
mhash
($key)
return
$hash & 0x7fffffff;
}class
serverhash
}/**
*@param $key
* 查詢這個key所對應的伺服器ip
*/function
lookup
($key)
foreach ($this->server_list as
$pos => $ip)
}return end($this->server_list);
}}$server = new serverhash();
$server->addserver('192.168.3.100');
echo
'k1所在伺服器:'.$server->lookup('k1').php_eol;
echo
'k2所在伺服器:'.$server->lookup('k2').php_eol;
$server->addserver('192.168.3.101');
echo
'k1所在伺服器:'.$server->lookup('k1').php_eol;
echo
'k2所在伺服器:'.$server->lookup('k2').php_eol;
echo
'k3所在伺服器:'.$server->lookup('k3').php_eol;
echo
'k4所在伺服器:'.$server->lookup('k4').php_eol;
$server->addserver('192.168.3.102');
echo
'k5所在伺服器:'.$server->lookup('k5').php_eol;
echo
'k6所在伺服器:'.$server->lookup('k6').php_eol;
執行結果如下:
k1所在伺服器:192
.168
.3.100
k2所在伺服器:192
.168
.3.100
k1所在伺服器:192
.168
.3.101
k2所在伺服器:192
.168
.3.100
k3所在伺服器:192
.168
.3.100
k4所在伺服器:192
.168
.3.101
k5所在伺服器:192
.168
.3.102
k6所在伺服器:192
.168
.3.102
分布式快取
分布式快取 原則來說跟應用伺服器分布式應該是一樣,但快取是有狀態的。怎麼樣提高命中?1.最原始的演算法 那就是key hash取模,取到伺服器ip。在大量伺服器伸縮行有問題,加入一台伺服器就有可能讓所有的快取都失效。如 key hash 後是100,取10膜是0,取11膜 1,101 取10膜是1,...
分布式快取
網際網路發展的同時,也引領者相關技術的發展與變革,比如集群 高併發 負載均衡 高可用 海量資料的處理 系統安全 分布式快取等各方面的相關技術。簡單談一下分布式快取技術。2 三層架構 1 web層 表現層 主要對使用者資料接收,以及資料處理完成後返回,為客戶端提 用程式的訪問 2 應用層 對業務的處理...
分布式快取
分布式快取 1 什麼是分布式快取?在高併發的環境下,大量的i o處理與cpu的處理速度顯然不在同乙個數量級,從減輕資料庫的壓力和提高系統的響應速度兩個角度來考慮,因而都會在資料庫之前加一層快取。由於單機的記憶體資源和承載能力有限,因而可以採用多台伺服器來用作快取,使得多台快取伺服器形同一台,並且不會...