分布式快取布置方案

2021-07-31 05:50:08 字數 2862 閱讀 1282

有時我們僅布置一台快取機器(如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的處理速度顯然不在同乙個數量級,從減輕資料庫的壓力和提高系統的響應速度兩個角度來考慮,因而都會在資料庫之前加一層快取。由於單機的記憶體資源和承載能力有限,因而可以採用多台伺服器來用作快取,使得多台快取伺服器形同一台,並且不會...