分布式和集群區(qū)別
分布式:分布式處理是將不同地點(diǎn)的蹋偏,或具有不同功能的,或擁有不同數(shù)據(jù)的多臺(tái)計(jì)算機(jī)通過(guò)通信網(wǎng)絡(luò)連接起來(lái),在控制系統(tǒng)的統(tǒng)一管理控制下拣挪,協(xié)調(diào)地完成大規(guī)模信息處理任務(wù)的計(jì)算機(jī)系統(tǒng)佛吓。簡(jiǎn)單地說(shuō)宵晚,分布式處理就是多臺(tái)相連的計(jì)算機(jī)各自承擔(dān)同一工作任務(wù)的不同部分,在人的控制下维雇,同時(shí)運(yùn)行淤刃,共同完成同一件任務(wù)。
集群:是一組相互獨(dú)立的吱型、通過(guò)高速網(wǎng)絡(luò)互聯(lián)的計(jì)算機(jī)逸贾,它們構(gòu)成了一個(gè)組,并以單一系統(tǒng)的模式加以管理津滞。一個(gè)客戶(hù)與集群相互作用時(shí)铝侵,集群像是一個(gè)獨(dú)立的服務(wù)器。簡(jiǎn)單的說(shuō)触徐,集群就是幾臺(tái)計(jì)算機(jī)同時(shí)部署同一個(gè)任務(wù)哟沫。
有時(shí)候一臺(tái)memcached服務(wù)器不能滿(mǎn)足我們的要求,需要布置多臺(tái)服務(wù)器锌介,但是有個(gè)問(wèn)題嗜诀,怎么確定一個(gè)數(shù)據(jù)應(yīng)該保存到哪臺(tái)服務(wù)器上邊呢?
??memcached 盡管是“分布式”緩存服務(wù)器孔祸,但服務(wù)器端并沒(méi)有分布式功能隆敢,memcached 不會(huì)互相通信以共享信息,那么崔慧,怎樣進(jìn)行分布式呢拂蝎?這完全取決于客戶(hù)端的實(shí)現(xiàn)。有兩種方案惶室,一種是普通Hash分布温自,另一種是一致性Hash分布玄货。
一、普通Hash分布
??普通Hash函數(shù)相對(duì)簡(jiǎn)單悼泌,Hash函數(shù)如下:
function mHash($key){
$md5 = substr(md5($key), 0, 8);
$seed = 31;
$hash = 0;
for($i=0; $i<8; $i++){
$hash = $hash*seed + ord($md5[$i]);
$i++;
}
return $hash & 0x7FFFFFFF;
}
??首先通過(guò)md5把key處理成一個(gè)32位的字符串松捉,取其前8個(gè)字符。在經(jīng)過(guò)Hash算法處理成一個(gè)整數(shù)并返回馆里,然后映射到其中的一臺(tái)Memcached服務(wù)器隘世。
??假如配置兩臺(tái)Memcache服務(wù)器,可以使用下面代碼映射:
<?php
$servers = [
['host'=>'192.168.1.12', 'port'=>11211],
['host'=>'192.168.1.21', 'port'=>11211],
];
$key = 'setKeys';
$value = 'setValues';
$sc = $servers[mHash[$key] % 2];
$memcached = new Memcached($sc);
$memcache->set($key, $value);
??通過(guò)Hash函數(shù)把key轉(zhuǎn)化成整數(shù)后鸠踪,利用這個(gè)整數(shù)與Memcached服務(wù)器數(shù)量取模丙者,這樣得到的是其中一臺(tái)服務(wù)器的配置,利用這個(gè)配置連接Memcache服務(wù)器营密,這樣就完成了分布式布置械媒。
二、一致性Hash分布
??在普通服務(wù)器數(shù)量不改變的時(shí)候评汰,普通Hash分布可以很好的運(yùn)作纷捞。當(dāng)服務(wù)器數(shù)量發(fā)生改變時(shí),問(wèn)題就出來(lái)了键俱,假如增加一臺(tái)服務(wù)器后,同一個(gè)key經(jīng)過(guò)hash之后世分,與服務(wù)器取模后的結(jié)果跟沒(méi)增加之前不一樣编振,這樣就導(dǎo)致了之前保存的數(shù)據(jù)丟失,為了把丟失的數(shù)據(jù)減到最少臭埋,可以采用一致性Hash分布算法解決踪央。
??一致性Hash算法分為6步,如下:
- 將一個(gè)32位整數(shù)(即0 - 2^32-1)想象成一個(gè)環(huán)瓢阴,將0作為圓環(huán)的頭畅蹂, 2^32-1作為圓環(huán)的尾,假想把它連起來(lái)組成一個(gè)環(huán)荣恐,如圖1所示:
- 通過(guò)Hash函數(shù)把key處理成整數(shù)液斜。
例如把4個(gè)key通過(guò)Hash函數(shù)處理成整數(shù):
$key1 = mHash('key1');
$key2 = mHash('key2');
$key3 = mHash('key3');
$key4 = mHash('key4');
把key處理成整數(shù)后,就可以在環(huán)中找到一個(gè)位置與之對(duì)應(yīng)叠穆,如圖2所示:
- 把Memcached群映射到環(huán)上少漆,使用Hash函數(shù)處理服務(wù)器IP地址。
加入有三臺(tái)memcached服務(wù)器ip為192.168.1.1, 192.168.1.4硼被, 192.168.1.5示损。
$server1 = mHash('192.168.1.1');
$server2 = mHash('192.168.1.4');
$server3 = mHash('192.168.1.5');
把服務(wù)器映射到環(huán)上,經(jīng)過(guò)上面幾個(gè)步驟嚷硫,我們把數(shù)據(jù)Key和服務(wù)器都映射到同一個(gè)環(huán)上检访,如圖3所示:
把key映射到服務(wù)器上始鱼,沿著圓環(huán)順時(shí)針?lè)较虻膋ey出發(fā),直到遇到第一個(gè)服務(wù)器位置脆贵,把key對(duì)應(yīng)的數(shù)據(jù)保存在這個(gè)服務(wù)器上医清,key1,key4保存到server3上丹禀,key3保存到server2上状勤,key2保存到server1上。
添加服務(wù)器
假如現(xiàn)在需要添加一臺(tái)服務(wù)器server4,用之前的方法得出server4的位置在key1和key4之間双泪,這時(shí)受影響的是server4逆時(shí)針到server1之間的數(shù)據(jù)持搜,把這些數(shù)據(jù)映射到server4上,這里僅需要變動(dòng)Key1焙矛,映射到server4上即可葫盼,如圖4:移除服務(wù)器
假如現(xiàn)在有一臺(tái)服務(wù)器server2故障了,依照上述方法村斟,順時(shí)針映射贫导,受影響的是server2逆時(shí)針到server3之間的數(shù)據(jù),也就是key3,這里需要把key3順時(shí)針映射到下一個(gè)服務(wù)器蟆盹,也就是server1上孩灯。
后續(xù)我會(huì)用PHP實(shí)現(xiàn)一致性Hash分布算法。