亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

什么是一致性Hash算法?

feng409 / 3075人閱讀

摘要:五一致性算法的容錯(cuò)性和可擴(kuò)展性現(xiàn)假設(shè)不幸宕機(jī),可以看到此時(shí)對(duì)象不會(huì)受到影響,只有對(duì)象被重定位到。綜上所述,一致性算法對(duì)于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯(cuò)性和可擴(kuò)展性。

最近有小伙伴跑過來問什么是Hash一致性算法,說面試的時(shí)候被問到了,因?yàn)椴涣私?,所以就沒有回答上,問我有沒有相應(yīng)的學(xué)習(xí)資料推薦,當(dāng)時(shí)上班,沒時(shí)間回復(fù),晚上回去了就忘了這件事,今天突然看到這個(gè),加班為大家整理一下什么是Hash一致性算法,希望對(duì)大家有幫助!文末送書,長按抽獎(jiǎng)助手小程序即可參與,祝君好運(yùn)!

經(jīng)常閱讀我文章的小伙伴應(yīng)該都很熟悉我寫文章的套路,上來就是先要問一句為什么?也就是為什么要有Hash一致性算法?就像以前介紹為什么要有Spring一樣,首先會(huì)以歷史的角度或者項(xiàng)目發(fā)展的角度來分析,今天的分享還是一樣的套路,先從歷史的角度來一步步分析,探討一下到底什么是Hash一致性算法!

一、Redis集群的使用
我們?cè)谑褂肦edis的時(shí)候,為了保證Redis的高可用,提高Redis的讀寫性能,最簡單的方式我們會(huì)做主從復(fù)制,組成Master-Master或者M(jìn)aster-Slave的形式,或者搭建Redis集群,進(jìn)行數(shù)據(jù)的讀寫分離,類似于數(shù)據(jù)庫的主從復(fù)制和讀寫分離。如下所示:??

同樣類似于數(shù)據(jù)庫,當(dāng)單表數(shù)據(jù)大于500W的時(shí)候需要對(duì)其進(jìn)行分庫分表,當(dāng)數(shù)據(jù)量很大的時(shí)候(標(biāo)準(zhǔn)可能不一樣,要看Redis服務(wù)器容量)我們同樣可以對(duì)Redis進(jìn)行類似的操作,就是分庫分表。

假設(shè),我們有一個(gè)社交網(wǎng)站,需要使用Redis存儲(chǔ)圖片資源,存儲(chǔ)的格式為鍵值對(duì),key值為圖片名稱,value為該圖片所在文件服務(wù)器的路徑,我們需要根據(jù)文件名查找該文件所在文件服務(wù)器上的路徑,數(shù)據(jù)量大概有2000W左右,按照我們約定的規(guī)則進(jìn)行分庫,規(guī)則就是隨機(jī)分配,我們可以部署8臺(tái)緩存服務(wù)器,每臺(tái)服務(wù)器大概含有500W條數(shù)據(jù),并且進(jìn)行主從復(fù)制,示意圖如下:

由于規(guī)則是隨機(jī)的,所有我們的一條數(shù)據(jù)都有可能存儲(chǔ)在任何一組Redis中,例如上圖我們用戶查找一張名稱為”a.png”的圖片,由于規(guī)則是隨機(jī)的,我們不確定具體是在哪一個(gè)Redis服務(wù)器上的,因此我們需要進(jìn)行1、2、3、4,4次查詢才能夠查詢到(也就是遍歷了所有的Redis服務(wù)器),這顯然不是我們想要的結(jié)果,有了解過的小伙伴可能會(huì)想到,隨機(jī)的規(guī)則不行,可以使用類似于數(shù)據(jù)庫中的分庫分表規(guī)則:按照Hash值、取模、按照類別、按照某一個(gè)字段值等等常見的規(guī)則就可以出來了!好,按照我們的主題,我們就使用Hash的方式。

二、為Redis集群使用Hash
可想而知,如果我們使用Hash的方式,每一張圖片在進(jìn)行分庫的時(shí)候都可以定位到特定的服務(wù)器,示意圖如下:

上圖中,假設(shè)我們查找的是”a.png”,由于有4臺(tái)服務(wù)器(排除從庫),因此公式為hash(a.png) % 4 = 2?,可知定位到了第2號(hào)服務(wù)器,這樣的話就不會(huì)遍歷所有的服務(wù)器,大大提升了性能!

三、使用Hash的問題
上述的方式雖然提升了性能,我們不再需要對(duì)整個(gè)Redis服務(wù)器進(jìn)行遍歷!但是,使用上述Hash算法進(jìn)行緩存時(shí),會(huì)出現(xiàn)一些缺陷,主要體現(xiàn)在服務(wù)器數(shù)量變動(dòng)的時(shí)候,所有緩存的位置都要發(fā)生改變!

試想一下,如果4臺(tái)緩存服務(wù)器已經(jīng)不能滿足我們的緩存需求,那么我們應(yīng)該怎么做呢?很簡單,多增加幾臺(tái)緩存服務(wù)器不就行了!假設(shè):我們?cè)黾恿艘慌_(tái)緩存服務(wù)器,那么緩存服務(wù)器的數(shù)量就由4臺(tái)變成了5臺(tái)。那么原本hash(a.png) % 4 = 2?的公式就變成了hash(a.png) % 5 = ??, 可想而知這個(gè)結(jié)果肯定不是2的,這種情況帶來的結(jié)果就是當(dāng)服務(wù)器數(shù)量變動(dòng)時(shí),所有緩存的位置都要發(fā)生改變!換句話說,當(dāng)服務(wù)器數(shù)量發(fā)生改變時(shí),所有緩存在一定時(shí)間內(nèi)是失效的,當(dāng)應(yīng)用無法從緩存中獲取數(shù)據(jù)時(shí),則會(huì)向后端數(shù)據(jù)庫請(qǐng)求數(shù)據(jù)(還記得上一篇的《緩存雪崩》嗎?)!

同樣的,假設(shè)4臺(tái)緩存中突然有一臺(tái)緩存服務(wù)器出現(xiàn)了故障,無法進(jìn)行緩存,那么我們則需要將故障機(jī)器移除,但是如果移除了一臺(tái)緩存服務(wù)器,那么緩存服務(wù)器數(shù)量從4臺(tái)變?yōu)?臺(tái),也是會(huì)出現(xiàn)上述的問題!

所以,我們應(yīng)該想辦法不讓這種情況發(fā)生,但是由于上述Hash算法本身的緣故,使用取模法進(jìn)行緩存時(shí),這種情況是無法避免的,為了解決這些問題,Hash一致性算法(一致性Hash算法)誕生了!

四、一致性Hash算法的神秘面紗
一致性Hash算法也是使用取模的方法,只是,剛才描述的取模法是對(duì)服務(wù)器的數(shù)量進(jìn)行取模,而一致性Hash算法是對(duì)2^32取模,什么意思呢?簡單來說,一致性Hash算法將整個(gè)哈希值空間組織成一個(gè)虛擬的圓環(huán),如假設(shè)某哈希函數(shù)H的值空間為0-2^32-1(即哈希值是一個(gè)32位無符號(hào)整形),整個(gè)哈希環(huán)如下:??

整個(gè)空間按順時(shí)針方向組織,圓環(huán)的正上方的點(diǎn)代表0,0點(diǎn)右側(cè)的第一個(gè)點(diǎn)代表1,以此類推,2、3、4、5、6……直到2^32-1,也就是說0點(diǎn)左側(cè)的第一個(gè)點(diǎn)代表2^32-1, 0和2^32-1在零點(diǎn)中方向重合,我們把這個(gè)由2^32個(gè)點(diǎn)組成的圓環(huán)稱為Hash環(huán)。

下一步將各個(gè)服務(wù)器使用Hash進(jìn)行一個(gè)哈希,具體可以選擇服務(wù)器的IP或主機(jī)名作為關(guān)鍵字進(jìn)行哈希,這樣每臺(tái)機(jī)器就能確定其在哈希環(huán)上的位置,這里假設(shè)將上文中四臺(tái)服務(wù)器使用IP地址哈希后在環(huán)空間的位置如下:??

接下來使用如下算法定位數(shù)據(jù)訪問到相應(yīng)服務(wù)器:將數(shù)據(jù)key使用相同的函數(shù)Hash計(jì)算出哈希值,并確定此數(shù)據(jù)在環(huán)上的位置,從此位置沿環(huán)順時(shí)針“行走”,第一臺(tái)遇到的服務(wù)器就是其應(yīng)該定位到的服務(wù)器!

例如我們有Object A、Object B、Object C、Object D四個(gè)數(shù)據(jù)對(duì)象,經(jīng)過哈希計(jì)算后,在環(huán)空間上的位置如下:?

根據(jù)一致性Hash算法,數(shù)據(jù)A會(huì)被定為到Node A上,B被定為到Node B上,C被定為到Node C上,D被定為到Node D上。

五、一致性Hash算法的容錯(cuò)性和可擴(kuò)展性
現(xiàn)假設(shè)Node C不幸宕機(jī),可以看到此時(shí)對(duì)象A、B、D不會(huì)受到影響,只有C對(duì)象被重定位到Node D。一般的,在一致性Hash算法中,如果一臺(tái)服務(wù)器不可用,則受影響的數(shù)據(jù)僅僅是此服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即沿著逆時(shí)針方向行走遇到的第一臺(tái)服務(wù)器)之間數(shù)據(jù),其它不會(huì)受到影響,如下所示:

下面考慮另外一種情況,如果在系統(tǒng)中增加一臺(tái)服務(wù)器Node X,如下圖所示:

此時(shí)對(duì)象Object A、B、D不受影響,只有對(duì)象C需要重定位到新的Node X !一般的,在一致性Hash算法中,如果增加一臺(tái)服務(wù)器,則受影響的數(shù)據(jù)僅僅是新服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即沿著逆時(shí)針方向行走遇到的第一臺(tái)服務(wù)器)之間數(shù)據(jù),其它數(shù)據(jù)也不會(huì)受到影響。

綜上所述,一致性Hash算法對(duì)于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯(cuò)性和可擴(kuò)展性。

六、Hash環(huán)的數(shù)據(jù)傾斜問題
一致性Hash算法在服務(wù)節(jié)點(diǎn)太少時(shí),容易因?yàn)楣?jié)點(diǎn)分部不均勻而造成數(shù)據(jù)傾斜(被緩存的對(duì)象大部分集中緩存在某一臺(tái)服務(wù)器上)問題,例如系統(tǒng)中只有兩臺(tái)服務(wù)器,其環(huán)分布如下:?

此時(shí)必然造成大量數(shù)據(jù)集中到Node A上,而只有極少量會(huì)定位到Node B上。為了解決這種數(shù)據(jù)傾斜問題,一致性Hash算法引入了虛擬節(jié)點(diǎn)機(jī)制,即對(duì)每一個(gè)服務(wù)節(jié)點(diǎn)計(jì)算多個(gè)哈希,每個(gè)計(jì)算結(jié)果位置都放置一個(gè)此服務(wù)節(jié)點(diǎn),稱為虛擬節(jié)點(diǎn)。具體做法可以在服務(wù)器IP或主機(jī)名的后面增加編號(hào)來實(shí)現(xiàn)。

例如上面的情況,可以為每臺(tái)服務(wù)器計(jì)算三個(gè)虛擬節(jié)點(diǎn),于是可以分別計(jì)算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六個(gè)虛擬節(jié)點(diǎn):?

同時(shí)數(shù)據(jù)定位算法不變,只是多了一步虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三個(gè)虛擬節(jié)點(diǎn)的數(shù)據(jù)均定位到Node A上。這樣就解決了服務(wù)節(jié)點(diǎn)少時(shí)數(shù)據(jù)傾斜的問題。在實(shí)際應(yīng)用中,通常將虛擬節(jié)點(diǎn)數(shù)設(shè)置為32甚至更大,因此即使很少的服務(wù)節(jié)點(diǎn)也能做到相對(duì)均勻的數(shù)據(jù)分布。

七、總結(jié)
上文中,我們一步步分析了什么是一致性Hash算法,主要是考慮到分布式系統(tǒng)每個(gè)節(jié)點(diǎn)都有可能失效,并且新的節(jié)點(diǎn)很可能動(dòng)態(tài)的增加進(jìn)來的情況,如何保證當(dāng)系統(tǒng)的節(jié)點(diǎn)數(shù)目發(fā)生變化的時(shí)候,我們的系統(tǒng)仍然能夠?qū)ν馓峁┝己玫姆?wù),這是值得考慮的!

PHP代碼實(shí)現(xiàn)案例:

$hostsMap = ["img1.findme.wang", "img2.findme.wang", "img3.findme.wang"];
$hashRing = [];
 
function getImgSrc($imgName){
    global $hostsMap;
    global $hashRing;
    //將節(jié)點(diǎn)映射到hash環(huán)上面
    if (empty($hashRing)) {
        foreach($hostsMap as $h) {
            $hostKey = fmod(crc32($h) , pow(2,32));
            $hostKey = abs($hostKey);
            $hashRing[$hostKey] = $h;
        }
        //從小到大排序,便于查找
        ksort($hashRing);
    }
 
    //計(jì)算圖片hash
    $imgKey = fmod(crc32($imgName) , pow(2,32));
    $imgKey = abs($imgKey);
    foreach($hashRing as $hostKey => $h) {
        if ($imgKey < $hostKey) {
            return "http://" . $h . "/" . $imgName;
        }
    }
    return "http://" . current($hashRing) . "/" . $imgName;
}
 
var_dump(getImgSrc("logo1.png"));
var_dump(getImgSrc("logo2.png"));
var_dump(getImgSrc("logo3.png"));

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30931.html

相關(guān)文章

  • 致性Hash

    摘要:當(dāng)時(shí)十分興奮,立即去找了關(guān)于一致性協(xié)議的文章來看。到了今天再去回想,發(fā)現(xiàn)對(duì)一致性協(xié)議的概念已經(jīng)模糊不清了。一致性算法一致性哈希算法在年由麻省理工學(xué)院的等人在解決分布式中提出的,設(shè)計(jì)目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)問題,初衷和十分類似。 序 第一次知道一致性Hash協(xié)議是在方騰飛的技術(shù)文章實(shí)戰(zhàn)解析-論三年內(nèi)快速成長為一名技術(shù)專家里看到的。 問:對(duì)于三十歲的程度員,如果還想再深入做技術(shù),有什么...

    spacewander 評(píng)論0 收藏0
  • 通過PHP實(shí)現(xiàn)致性哈希算法

    摘要:通過虛擬節(jié)點(diǎn)優(yōu)化一致性算法為了提高一致性算法的平衡性,我們首先能夠想到的是,增加節(jié)點(diǎn)數(shù),但是機(jī)器畢竟是需要經(jīng)費(fèi)啊,不是說增就能隨意增,那就增加虛擬節(jié)點(diǎn),這樣就沒毛病了。 一、案例分析(1)問題概述 假設(shè)我們的圖片數(shù)據(jù)均勻的分配在三臺(tái)服務(wù)(分別標(biāo)注為服務(wù)器A,服務(wù)器B、服務(wù)器C)上面,現(xiàn)在我們要從里面取圖片,服務(wù)端在拿到這個(gè)請(qǐng)求后,怎么會(huì)指定,這張圖片是存在服務(wù)器A、服務(wù)器B,還是服務(wù)器...

    tulayang 評(píng)論0 收藏0
  • memcached分布式原理與實(shí)現(xiàn)

    摘要:哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會(huì)被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實(shí)現(xiàn) 標(biāo)簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個(gè)分布式,開源的數(shù)據(jù)存儲(chǔ)引擎。memcach...

    Ververica 評(píng)論0 收藏0
  • memcached分布式原理與實(shí)現(xiàn)

    摘要:哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會(huì)被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實(shí)現(xiàn) 標(biāo)簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個(gè)分布式,開源的數(shù)據(jù)存儲(chǔ)引擎。memcach...

    LiuRhoRamen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

feng409

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<