22-哈希算法(下):哈希算法在分布式系統(tǒng)中有哪些應(yīng)用泛豪?

接下來三種哈希算法的應(yīng)用都跟分布式系統(tǒng)有關(guān)。接下來就看一下哈希算法是如何解決這些分布式問題的侦鹏。

應(yīng)用五:負(fù)載均衡

負(fù)載均衡算法有很多诡曙,比如輪詢、隨機(jī)略水、加權(quán)輪詢等价卤。那如何才能實(shí)現(xiàn)一個(gè)會話粘滯(session sticky)的負(fù)載均衡算法呢?也就是說渊涝,我們需要在同一個(gè)客戶端上慎璧,在一次會話中的所有請求都路由到同一個(gè)服務(wù)器上。

借助哈希算法驶赏,這些問題都可以非常完美地解決炸卑。我們可以通過哈希算法既鞠,對客戶端 IP 地址或者會話 ID 計(jì)算哈希值煤傍,將取得的哈希值與服務(wù)器列表的大小進(jìn)行取模運(yùn)算,最終得到的值就是應(yīng)該被路由到的服務(wù)器編號嘱蛋。 這樣蚯姆,我們就可以把同一個(gè) IP 過來的所有請求五续,都路由到同一個(gè)后端服務(wù)器上。

應(yīng)用六:數(shù)據(jù)分片

哈希算法用于數(shù)據(jù)分片龄恋,這里有兩個(gè)例子疙驾。

1. 如何統(tǒng)計(jì)“搜索關(guān)鍵詞”出現(xiàn)的次數(shù)?

假如我們有 1T 的日志文件郭毕,這里面記錄了用戶的搜索關(guān)鍵詞它碎,我們想要快速統(tǒng)計(jì)出每個(gè)關(guān)鍵詞被搜索的次數(shù),該怎么做呢显押?

這個(gè)問題有兩個(gè)難點(diǎn)扳肛,第一個(gè)是搜索日志很大,沒辦法放到一臺機(jī)器的內(nèi)存中乘碑。第二個(gè)難點(diǎn)是挖息,如果只用一臺機(jī)器來處理這么巨大的數(shù)據(jù),處理時(shí)間會很長兽肤。

針對這兩個(gè)難點(diǎn)套腹,我們可以先對數(shù)據(jù)進(jìn)行分片,然后采用多臺機(jī)器處理的方法资铡,來提高處理速度电禀。具體的思路是這樣的:為了提高處理的速度,我們用 n 臺機(jī)器并行處理笤休。我們從搜索記錄的日志文件中鞭呕,依次讀出每個(gè)搜索關(guān)鍵詞,并且通過哈希函數(shù)計(jì)算哈希值宛官,然后再跟 n 取模葫松,最終得到的值,就是應(yīng)該被分配到的機(jī)器編號底洗。這樣同一個(gè)搜索關(guān)鍵詞會被分配到同一個(gè)機(jī)器上腋么。每個(gè)機(jī)器會分別計(jì)算關(guān)鍵詞出現(xiàn)的次數(shù),最后合并起來就是最終的結(jié)果亥揖。

實(shí)際上珊擂,這里的處理過程也是 MapReduce 的基本設(shè)計(jì)思想。

2. 如何快速判斷圖片是否在圖庫中费变?

假設(shè)現(xiàn)在我們的圖庫中有 1 億張圖片摧扇,很顯然,在單臺機(jī)器上構(gòu)建散列表是行不通的挚歧。因?yàn)閱闻_機(jī)器的內(nèi)存有限扛稽,而 1 億張圖片構(gòu)建散列表顯然遠(yuǎn)遠(yuǎn)超過了單臺機(jī)器的內(nèi)存上限。

我們同樣可以對數(shù)據(jù)進(jìn)行分片滑负,然后采用多機(jī)處理在张。我們準(zhǔn)備 n 臺機(jī)器用含,讓每臺機(jī)器只維護(hù)某一部分圖片對應(yīng)的散列表。我們每次從圖庫中讀取一個(gè)圖片帮匾,計(jì)算唯一標(biāo)識啄骇,然后與機(jī)器個(gè)數(shù) n 求余取模,得到的值就對應(yīng)要分配的機(jī)器編號瘟斜,然后將這個(gè)圖片的唯一標(biāo)識和圖片路徑發(fā)往對應(yīng)的機(jī)器構(gòu)建散列表缸夹。

當(dāng)我們要判斷一個(gè)圖片是否在圖庫中的時(shí)候,我們通過同樣的哈希算法螺句,計(jì)算這個(gè)圖片的唯一標(biāo)識明未,然后與機(jī)器個(gè)數(shù) n 求余取模。假設(shè)得到的值是 k壹蔓,那就去編號 k 的機(jī)器構(gòu)建的散列表中查找趟妥。

實(shí)際上,針對這種海量數(shù)據(jù)的處理問題佣蓉,我們都可以采用多機(jī)分布式處理披摄。借助這種分片的思路,可以突破單機(jī)內(nèi)存勇凭、CPU 等資源的限制疚膊。

應(yīng)用七:分布式存儲

現(xiàn)在互聯(lián)網(wǎng)面對的都是海量的數(shù)據(jù)、海量的用戶虾标。我們?yōu)榱颂岣邤?shù)據(jù)的讀取寓盗、寫入能力,一般都采用分布式的方式來存儲數(shù)據(jù)璧函,比如分布式緩存傀蚌。我們有海量的數(shù)據(jù)需要緩存,所以一個(gè)緩存機(jī)器肯定是不夠的蘸吓。于是善炫,我們就需要將數(shù)據(jù)分布在多臺機(jī)器上。

該如何決定將哪個(gè)數(shù)據(jù)放到哪個(gè)機(jī)器上呢库继?我們可以借用前面數(shù)據(jù)分片的思想箩艺,即通過哈希算法對數(shù)據(jù)取哈希值,然后對機(jī)器個(gè)數(shù)取模宪萄,這個(gè)最終值就是應(yīng)該存儲的緩存機(jī)器編號艺谆。

但是,如果數(shù)據(jù)增多拜英,原來的 10 個(gè)機(jī)器已經(jīng)無法承受了静汤,我們就需要擴(kuò)容了,比如擴(kuò)到 11 個(gè)機(jī)器,這時(shí)候麻煩就來了撒妈。因?yàn)榛峙@里并不是簡單地加個(gè)機(jī)器就可以了排监。

原來的數(shù)據(jù)是通過與 10 來取模的狰右。比如 13 這個(gè)數(shù)據(jù),存儲在編號為 3 這臺機(jī)器上舆床。但是新加了一臺機(jī)器中棋蚌,我們對數(shù)據(jù)按照 11 取模,原來 13 這個(gè)數(shù)據(jù)就被分配到 2 號這臺機(jī)器上了挨队。

因此谷暮,所有的數(shù)據(jù)都要重新計(jì)算哈希值,然后重新搬移到正確的機(jī)器上盛垦。這樣就相當(dāng)于湿弦,緩存中的數(shù)據(jù)一下子就都失效了。所有的數(shù)據(jù)請求都會穿透緩存腾夯,直接去請求數(shù)據(jù)庫颊埃。這樣就可能發(fā)生雪崩效應(yīng),壓垮數(shù)據(jù)庫蝶俱。

所以班利,我們需要一種方法,使得在新加入一個(gè)機(jī)器后榨呆,并不需要做大量的數(shù)據(jù)搬移罗标。這時(shí)候,一致性哈希算法就要登場了积蜻。

假設(shè)我們有 k 個(gè)機(jī)器闯割,數(shù)據(jù)的哈希值的范圍是 [0, MAX]。我們將整個(gè)范圍劃分成 m 個(gè)小區(qū)間(m 遠(yuǎn)大于 k)竿拆,每個(gè)機(jī)器負(fù)責(zé) m/k 個(gè)小區(qū)間纽谒。當(dāng)有新機(jī)器加入的時(shí)候,我們就將某幾個(gè)小區(qū)間的數(shù)據(jù)如输,從原來的機(jī)器中搬移到新的機(jī)器中鼓黔。這樣,既不用全部重新哈希不见、搬移數(shù)據(jù)澳化,也保持了各個(gè)機(jī)器上數(shù)據(jù)數(shù)量的均衡。

除了我們上面講到的分布式緩存稳吮,實(shí)際上缎谷,一致性哈希算法的應(yīng)用非常廣泛,在很多分布式存儲系統(tǒng)中灶似,都可以見到一致性哈希算法的影子列林。

解答開篇 & 內(nèi)容小結(jié)

在負(fù)載均衡應(yīng)用中瑞你,利用哈希算法替代映射表,可以實(shí)現(xiàn)一個(gè)會話粘滯的負(fù)載均衡策略希痴。

在數(shù)據(jù)分片應(yīng)用中者甲,通過哈希算法對處理的海量數(shù)據(jù)進(jìn)行分片,多機(jī)分布式處理砌创,可以突破單機(jī)資源的限制虏缸。

在分布式存儲應(yīng)用中,利用一致性哈希算法嫩实,可以解決緩存等分布式系統(tǒng)的擴(kuò)容刽辙、縮容導(dǎo)致數(shù)據(jù)大量搬移的難題。

課后思考

這兩節(jié)總共講了七個(gè)哈希算法的應(yīng)用甲献。實(shí)際上宰缤,講的也只是冰山一角,哈希算法還有很多其他的應(yīng)用晃洒,比如網(wǎng)絡(luò)協(xié)議中的 CRC 校驗(yàn)慨灭、Git commit id 等等。除了這些锥累,你還能想到其他用到哈希算法的地方嗎缘挑?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桶略,隨后出現(xiàn)的幾起案子语淘,更是在濱河造成了極大的恐慌,老刑警劉巖际歼,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶翻,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹅心,警方通過查閱死者的電腦和手機(jī)吕粗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旭愧,“玉大人颅筋,你說我怎么就攤上這事∈淇荩” “怎么了议泵?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桃熄。 經(jīng)常有香客問我先口,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任碉京,我火速辦了婚禮厢汹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谐宙。我一直安慰自己烫葬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布卧惜。 她就那樣靜靜地躺著厘灼,像睡著了一般夹纫。 火紅的嫁衣襯著肌膚如雪咽瓷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天舰讹,我揣著相機(jī)與錄音茅姜,去河邊找鬼。 笑死月匣,一個(gè)胖子當(dāng)著我的面吹牛钻洒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锄开,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼素标,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萍悴?” 一聲冷哼從身側(cè)響起头遭,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癣诱,沒想到半個(gè)月后计维,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撕予,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年鲫惶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实抡。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欠母,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吆寨,到底是詐尸還是另有隱情赏淌,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布鸟废,位于F島的核電站猜敢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缩擂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一鼠冕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胯盯,春花似錦懈费、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉趣,卻和暖如春泞边,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疗杉。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工阵谚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烟具。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓梢什,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朝聋。 傳聞我的和親對象是個(gè)殘疾皇子嗡午,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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