Memcache分布式方案

分布式和集群區(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步,如下:

  1. 將一個(gè)32位整數(shù)(即0 - 2^32-1)想象成一個(gè)環(huán)瓢阴,將0作為圓環(huán)的頭畅蹂, 2^32-1作為圓環(huán)的尾,假想把它連起來(lái)組成一個(gè)環(huán)荣恐,如圖1所示:
  2. 通過(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所示:


01.png
  1. 把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所示:


2.png
  1. 把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上。

  2. 添加服務(wù)器
    假如現(xiàn)在需要添加一臺(tái)服務(wù)器server4,用之前的方法得出server4的位置在key1和key4之間双泪,這時(shí)受影響的是server4逆時(shí)針到server1之間的數(shù)據(jù)持搜,把這些數(shù)據(jù)映射到server4上,這里僅需要變動(dòng)Key1焙矛,映射到server4上即可葫盼,如圖4:

  3. 移除服務(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分布算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逾滥,一起剝皮案震驚了整個(gè)濱河市峰档,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寨昙,老刑警劉巖讥巡,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舔哪,居然都是意外死亡欢顷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)捉蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抬驴,“玉大人,你說(shuō)我怎么就攤上這事缆巧≡蹙簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盅蝗,是天一觀的道長(zhǎng)鳖链。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么芙委? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任逞敷,我火速辦了婚禮,結(jié)果婚禮上灌侣,老公的妹妹穿的比我還像新娘推捐。我一直安慰自己,他們只是感情好侧啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布牛柒。 她就那樣靜靜地躺著,像睡著了一般痊乾。 火紅的嫁衣襯著肌膚如雪皮壁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天哪审,我揣著相機(jī)與錄音蛾魄,去河邊找鬼。 笑死湿滓,一個(gè)胖子當(dāng)著我的面吹牛滴须,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叽奥,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扔水,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了朝氓?” 一聲冷哼從身側(cè)響起魔市,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膀篮,沒(méi)想到半個(gè)月后嘹狞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體岂膳,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誓竿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谈截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筷屡。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖簸喂,靈堂內(nèi)的尸體忽然破棺而出毙死,到底是詐尸還是另有隱情,我是刑警寧澤喻鳄,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布扼倘,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏再菊。R本人自食惡果不足惜爪喘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纠拔。 院中可真熱鬧秉剑,春花似錦、人聲如沸稠诲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臀叙。三九已至略水,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匹耕,已是汗流浹背聚请。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稳其,地道東北人驶赏。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像既鞠,于是被迫代替她去往敵國(guó)和親煤傍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容