涓嬮潰榪欑瘒鏂囩珷鍐欑殑闈炲父濂斤紝緇撳悎memcached鐨?鐗圭偣鍒╃敤Consistent hasning 綆楁硶錛屽彲浠ユ墦閫犱竴涓潪甯稿畬澶囩殑鍒嗗竷寮忕紦瀛樻湇鍔″櫒銆?/p>
姝e絎?嬈′腑浠嬬粛鐨勯偅鏍鳳紝 memcached铏界劧縐頒負(fù)“鍒嗗竷寮?#8221;緙撳瓨鏈嶅姟鍣紝浣嗘湇鍔″櫒绔茍娌℃湁“鍒嗗竷寮?#8221;鍔熻兘銆?鏈嶅姟鍣ㄧ浠呭寘鎷?絎?嬈°?絎?嬈?鍓嶅潅浠嬬粛鐨勫唴瀛樺瓨鍌ㄥ姛鑳斤紝鍏跺疄鐜伴潪甯哥畝鍗曘?鑷充簬memcached鐨勫垎甯冨紡錛屽垯鏄畬鍏ㄧ敱瀹㈡埛绔▼搴忓簱瀹炵幇鐨勩?榪欑鍒嗗竷寮忔槸memcached鐨勬渶澶х壒鐐廣?/p>
榪欓噷澶氭浣跨敤浜?#8220;鍒嗗竷寮?#8221;榪欎釜璇嶏紝浣嗗茍鏈仛璇︾粏瑙i噴銆?鐜板湪寮濮嬬畝鍗曞湴浠嬬粛涓涓嬪叾鍘熺悊錛屽悇涓鎴風(fēng)鐨勫疄鐜板熀鏈浉鍚屻?/p>
涓嬮潰鍋囪memcached鏈嶅姟鍣ㄦ湁node1锝瀗ode3涓夊彴錛?搴旂敤紼嬪簭瑕佷繚瀛橀敭鍚嶄負(fù)“tokyo”“kanagawa”“chiba”“saitama”“gunma” 鐨勬暟鎹?/p>
鍥? 鍒嗗竷寮忕畝浠嬶細(xì)鍑嗗
棣栧厛鍚憁emcached涓坊鍔?#8220;tokyo”銆傚皢“tokyo”浼犵粰瀹㈡埛绔▼搴忓簱鍚庯紝 瀹㈡埛绔疄鐜扮殑綆楁硶灝變細(xì)鏍規(guī)嵁“閿?#8221;鏉ュ喅瀹氫繚瀛樻暟鎹殑memcached鏈嶅姟鍣ㄣ?鏈嶅姟鍣ㄩ夊畾鍚庯紝鍗沖懡浠ゅ畠淇濆瓨“tokyo”鍙?qiáng)鍏跺箋?/p>
鍥? 鍒嗗竷寮忕畝浠嬶細(xì)娣誨姞鏃?/p>
鍚屾牱錛?#8220;kanagawa”“chiba”“saitama”“gunma”閮芥槸鍏堥夋嫨鏈嶅姟鍣ㄥ啀淇濆瓨銆?/p>
鎺ヤ笅鏉ヨ幏鍙栦繚瀛樼殑鏁版嵁銆傝幏鍙栨椂涔熻灝嗚鑾峰彇鐨勯敭“tokyo”浼犻掔粰鍑芥暟搴撱?鍑芥暟搴撻氳繃涓庢暟鎹繚瀛樻椂鐩稿悓鐨勭畻娉曪紝鏍規(guī)嵁“閿?#8221;閫夋嫨鏈嶅姟鍣ㄣ?浣跨敤鐨勭畻娉曠浉鍚岋紝灝辮兘閫変腑涓庝繚瀛樻椂鐩稿悓鐨勬湇鍔″櫒錛岀劧鍚庡彂閫乬et鍛戒護(hù)銆?鍙鏁版嵁娌℃湁鍥犱負(fù)鏌愪簺鍘熷洜琚垹闄わ紝灝辮兘鑾峰緱淇濆瓨鐨勫箋?/p>
鍥? 鍒嗗竷寮忕畝浠嬶細(xì)鑾峰彇鏃?/p>
榪欐牱錛屽皢涓嶅悓鐨勯敭淇濆瓨鍒頒笉鍚岀殑鏈嶅姟鍣ㄤ笂錛屽氨瀹炵幇浜唌emcached鐨勫垎甯冨紡銆?memcached鏈嶅姟鍣ㄥ澶氬悗錛岄敭灝變細(xì)鍒嗘暎錛屽嵆浣夸竴鍙癿emcached鏈嶅姟鍣ㄥ彂鐢熸晠闅?鏃犳硶榪炴帴錛屼篃涓嶄細(xì)褰卞搷鍏朵粬鐨勭紦瀛橈紝緋葷粺渚濈劧鑳界戶緇繍琛屻?/p>
鎺ヤ笅鏉ヤ粙緇?a style="color: rgb(51,102,153); text-decoration: none" >絎?嬈?/a> 涓彁鍒扮殑Perl瀹㈡埛绔嚱鏁板簱Cache::Memcached瀹炵幇鐨勫垎甯冨紡鏂規(guī)硶銆?/p>
Perl鐨刴emcached瀹㈡埛绔嚱鏁板簱Cache::Memcached鏄?memcached鐨勪綔鑰匓rad Fitzpatrick鐨勪綔鍝侊紝鍙互璇存槸鍘熻鐨勫嚱鏁板簱浜嗐?/p>
璇ュ嚱鏁板簱瀹炵幇浜嗗垎甯冨紡鍔熻兘錛屾槸memcached鏍囧噯鐨勫垎甯冨紡鏂規(guī)硶銆?/p>
Cache::Memcached鐨勫垎甯冨紡鏂規(guī)硶綆鍗曟潵璇達(dá)紝灝辨槸“鏍規(guī)嵁鏈嶅姟鍣ㄥ彴鏁扮殑浣欐暟榪涜鍒嗘暎”銆?姹傚緱閿殑鏁存暟鍝堝笇鍊鹼紝鍐嶉櫎浠ユ湇鍔″櫒鍙版暟錛屾牴鎹叾浣欐暟鏉ラ夋嫨鏈嶅姟鍣ㄣ?/p>
涓嬮潰灝咰ache::Memcached綆鍖栨垚浠ヤ笅鐨凱erl鑴氭湰鏉ヨ繘琛岃鏄庛?/p>
Cache::Memcached鍦ㄦ眰鍝堝笇鍊兼椂浣跨敤浜咰RC銆?/p>
棣栧厛姹傚緱瀛楃涓茬殑CRC鍊鹼紝鏍規(guī)嵁璇ュ奸櫎浠ユ湇鍔″櫒鑺傜偣鏁扮洰寰楀埌鐨勪綑鏁板喅瀹氭湇鍔″櫒銆?涓婇潰鐨勪唬鐮佹墽琛屽悗杈撳叆浠ヤ笅緇撴灉錛?/p>
tokyo => node2
kanagawa => node3
chiba => node2
saitama => node1
gunma => node1
鏍規(guī)嵁璇ョ粨鏋滐紝“tokyo”鍒嗘暎鍒皀ode2錛?#8220;kanagawa”鍒嗘暎鍒皀ode3絳夈?澶氳涓鍙ワ紝褰撻夋嫨鐨勬湇鍔″櫒鏃犳硶榪炴帴鏃訛紝Cache::Memcached浼?xì)灏啒q炴帴嬈℃暟 娣誨姞鍒伴敭涔嬪悗錛屽啀嬈¤綆楀搱甯屽煎茍灝濊瘯榪炴帴銆傝繖涓姩浣滅О涓簉ehash銆?涓嶅笇鏈況ehash鏃跺彲浠ュ湪鐢熸垚Cache::Memcached瀵硅薄鏃舵寚瀹?#8220;rehash => 0”閫夐」銆?/p>
浣欐暟璁$畻鐨勬柟娉曠畝鍗曪紝鏁版嵁鐨勫垎鏁fт篃鐩稿綋浼樼錛屼絾涔熸湁鍏剁己鐐廣?閭e氨鏄綋娣誨姞鎴栫Щ闄ゆ湇鍔″櫒鏃訛紝緙撳瓨閲嶇粍鐨勪唬浠風(fēng)浉褰撳法澶с?娣誨姞鏈嶅姟鍣ㄥ悗錛屼綑鏁板氨浼?xì)漶旂敓宸ㄥ彉锛寴q欐牱灝辨棤娉曡幏鍙栦笌淇濆瓨鏃剁浉鍚岀殑鏈嶅姟鍣紝 浠庤屽獎(jiǎng)鍝嶇紦瀛樼殑鍛戒腑鐜囥傜敤Perl鍐欐浠g爜鏉ラ獙璇佸叾浠d環(huán)銆?/p>
榪欐Perl鑴氭湰婕旂ず浜嗗皢“a”鍒?#8220;z”鐨勯敭淇濆瓨鍒癿emcached騫惰闂殑鎯呭喌銆?灝嗗叾淇濆瓨涓簃od.pl騫舵墽琛屻?/p>
棣栧厛錛屽綋鏈嶅姟鍣ㄥ彧鏈変笁鍙版椂錛?/p>
緇撴灉濡備笂錛宯ode1淇濆瓨a銆乧銆乨銆乪……錛宯ode2淇濆瓨g銆乮銆乲……錛?姣忓彴鏈嶅姟鍣ㄩ兘淇濆瓨浜?涓埌10涓暟鎹?/p>
鎺ヤ笅鏉ュ鍔犱竴鍙癿emcached鏈嶅姟鍣ㄣ?/p>
娣誨姞浜唍ode4銆傚彲瑙侊紝鍙湁d銆乮銆乲銆乸銆乺銆亂鍛戒腑浜嗐傚儚榪欐牱錛屾坊鍔犺妭鐐瑰悗 閿垎鏁e埌鐨勬湇鍔″櫒浼?xì)鍙戠敓宸ㄥぇ鍙樺寲銆?6涓敭涓彧鏈夊叚涓湪璁塊棶鍘熸潵鐨勬湇鍔″櫒錛?鍏朵粬鐨勫叏閮界Щ鍒頒簡鍏朵粬鏈嶅姟鍣ㄣ傚懡涓巼闄嶄綆鍒?3%銆傚湪Web搴旂敤紼嬪簭涓嬌鐢╩emcached鏃訛紝 鍦ㄦ坊鍔爉emcached鏈嶅姟鍣ㄧ殑鐬棿緙撳瓨鏁堢巼浼?xì)澶q呭害涓嬮檷錛岃礋杞戒細(xì)闆嗕腑鍒版暟鎹簱鏈嶅姟鍣ㄤ笂錛?鏈夊彲鑳戒細(xì)鍙戠敓鏃犳硶鎻愪緵姝e父鏈嶅姟鐨勬儏鍐點(diǎn)?/p>
mixi鐨刉eb搴旂敤紼嬪簭榪愮敤涓篃鏈夎繖涓棶棰橈紝瀵艱嚧鏃犳硶娣誨姞memcached鏈嶅姟鍣ㄣ?浣嗙敱浜庝嬌鐢ㄤ簡鏂扮殑鍒嗗竷寮忔柟娉曪紝鐜板湪鍙互杞昏屾槗涓懼湴娣誨姞memcached鏈嶅姟鍣ㄤ簡銆?榪欑鍒嗗竷寮忔柟娉曠О涓?Consistent Hashing銆?/p>
鍏充簬Consistent Hashing鐨勬濇兂錛宮ixi鏍紡浼?xì)绀剧殑寮鍙慴log絳夎澶氬湴鏂歸兘浠嬬粛榪囷紝 榪欓噷鍙畝鍗曞湴璇存槑涓涓嬨?/p>
Consistent Hashing濡備笅鎵紺猴細(xì)棣栧厛姹傚嚭memcached鏈嶅姟鍣紙鑺傜偣錛夌殑鍝堝笇鍊鹼紝 騫跺皢鍏墮厤緗埌0锝?32鐨勫渾錛坈ontinuum錛変笂銆?鐒跺悗鐢ㄥ悓鏍風(fēng)殑鏂規(guī)硶姹傚嚭瀛樺偍鏁版嵁鐨勯敭鐨勫搱甯屽鹼紝騫舵槧灝勫埌鍦嗕笂銆?鐒跺悗浠庢暟鎹槧灝勫埌鐨勪綅緗紑濮嬮『鏃墮拡鏌ユ壘錛屽皢鏁版嵁淇濆瓨鍒版壘鍒扮殑絎竴涓湇鍔″櫒涓娿?濡傛灉瓚呰繃232浠嶇劧鎵句笉鍒版湇鍔″櫒錛屽氨浼?xì)淇濆瓨鍒敖W竴鍙癿emcached鏈嶅姟鍣ㄤ笂銆?/p>
鍥? Consistent Hashing錛氬熀鏈師鐞?/p>
浠庝笂鍥劇殑鐘舵佷腑娣誨姞涓鍙癿emcached鏈嶅姟鍣ㄣ備綑鏁板垎甯冨紡綆楁硶鐢變簬淇濆瓨閿殑鏈嶅姟鍣ㄤ細(xì)鍙戠敓宸ㄥぇ鍙樺寲 鑰屽獎(jiǎng)鍝嶇紦瀛樼殑鍛戒腑鐜囷紝浣咰onsistent Hashing涓紝鍙湁鍦╟ontinuum涓婂鍔犳湇鍔″櫒鐨勫湴鐐歸嗘椂閽堟柟鍚戠殑 絎竴鍙版湇鍔″櫒涓婄殑閿細(xì)鍙楀埌褰卞搷銆?/p>
鍥? Consistent Hashing錛氭坊鍔犳湇鍔″櫒
鍥犳錛孋onsistent Hashing鏈澶ч檺搴﹀湴鎶戝埗浜嗛敭鐨勯噸鏂板垎甯冦?鑰屼笖錛屾湁鐨凜onsistent Hashing鐨勫疄鐜版柟娉曡繕閲囩敤浜嗚櫄鎷熻妭鐐圭殑鎬濇兂銆?浣跨敤涓鑸殑hash鍑芥暟鐨勮瘽錛屾湇鍔″櫒鐨勬槧灝勫湴鐐圭殑鍒嗗竷闈炲父涓嶅潎鍖銆?鍥犳錛屼嬌鐢ㄨ櫄鎷熻妭鐐圭殑鎬濇兂錛屼負(fù)姣忎釜鐗╃悊鑺傜偣錛堟湇鍔″櫒錛?鍦╟ontinuum涓婂垎閰?00锝?00涓偣銆傝繖鏍峰氨鑳芥姂鍒跺垎甯冧笉鍧囧寑錛?鏈澶ч檺搴﹀湴鍑忓皬鏈嶅姟鍣ㄥ鍑忔椂鐨勭紦瀛橀噸鏂板垎甯冦?/p>
閫氳繃涓嬫枃涓粙緇嶇殑浣跨敤Consistent Hashing綆楁硶鐨刴emcached瀹㈡埛绔嚱鏁板簱榪涜嫻嬭瘯鐨勭粨鏋滄槸錛?鐢辨湇鍔″櫒鍙版暟錛坣錛夊拰澧炲姞鐨勬湇鍔″櫒鍙版暟錛坢錛夎綆楀鍔犳湇鍔″櫒鍚庣殑鍛戒腑鐜囪綆楀叕寮忓涓嬶細(xì)
(1 - n/(n+m)) * 100
鏈繛杞戒腑澶氭浠嬬粛鐨凜ache::Memcached铏界劧涓嶆敮鎸丆onsistent Hashing錛?浣嗗凡鏈夊嚑涓鎴風(fēng)鍑芥暟搴撴敮鎸佷簡榪欑鏂扮殑鍒嗗竷寮忕畻娉曘?絎竴涓敮鎸丆onsistent Hashing鍜岃櫄鎷熻妭鐐圭殑memcached瀹㈡埛绔嚱鏁板簱鏄?鍚嶄負(fù)libketama鐨凱HP搴擄紝鐢眑ast.fm寮鍙戙?/p>
鑷充簬Perl瀹㈡埛绔紝榪炶澆鐨勭1嬈?涓粙緇嶈繃鐨凜ache::Memcached::Fast鍜孋ache::Memcached::libmemcached鏀寔 Consistent Hashing銆?/p>
涓よ呯殑鎺ュ彛閮戒笌Cache::Memcached鍑犱箮鐩稿悓錛屽鏋滄鍦ㄤ嬌鐢–ache::Memcached錛?閭d箞灝卞彲浠ユ柟渚垮湴鏇挎崲榪囨潵銆侰ache::Memcached::Fast閲嶆柊瀹炵幇浜唋ibketama錛?浣跨敤Consistent Hashing鍒涘緩瀵硅薄鏃跺彲浠ユ寚瀹歬etama_points閫夐」銆?/p>
my $memcached = Cache::Memcached::Fast->new({
servers => ["192.168.0.1:11211","192.168.0.2:11211"],
ketama_points => 150
});
鍙﹀錛孋ache::Memcached::libmemcached 鏄竴涓嬌鐢ㄤ簡Brain Aker寮鍙戠殑C鍑芥暟搴搇ibmemcached鐨凱erl妯″潡銆?libmemcached鏈韓鏀寔鍑犵鍒嗗竷寮忕畻娉曪紝涔熸敮鎸丆onsistent Hashing錛?鍏禤erl緇戝畾涔熸敮鎸丆onsistent Hashing銆?/p>
鏈浠嬬粛浜唌emcached鐨勫垎甯冨紡綆楁硶錛屼富瑕佹湁memcached鐨勫垎甯冨紡鏄敱瀹㈡埛绔嚱鏁板簱瀹炵幇錛?浠ュ強(qiáng)楂樻晥鐜囧湴鍒嗘暎鏁版嵁鐨凜onsistent Hashing綆楁硶銆備笅嬈″皢浠嬬粛mixi鍦╩emcached搴旂敤鏂歸潰鐨勪竴浜涚粡楠岋紝 鍜岀浉鍏崇殑鍏煎搴旂敤紼嬪簭銆?/p>