1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一致性哈希及其在Greenplum中的應(yīng)用

        共 4353字,需瀏覽 9分鐘

         ·

        2021-04-23 21:10

        點擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)
        回復(fù)”資源“獲取更多資源
        前言

        一致性哈希(consistent hashing)是分布式系統(tǒng)中非常重要的算法,在平滑擴(kuò)縮容、動態(tài)負(fù)載均衡等方向有大量應(yīng)用。相對于傳統(tǒng)的線性(取模)哈希算法,一致性哈希可以保證在分布式哈希表中的桶數(shù)量發(fā)生變化時,受到影響需要重新映射的key盡量少。本文先簡要復(fù)習(xí)下經(jīng)典的割環(huán)一致性哈希方案,然后介紹它的變種——跳躍一致性哈希(jump consistent hash)。

        割環(huán)一致性哈希

        一致性哈希的概念最初在1997年由David Karger等大佬提出,原始論文見Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web,起初是為了解決網(wǎng)絡(luò)中的熱點問題,后來發(fā)展成分布式系統(tǒng)中通用的算法。為了與此后出現(xiàn)的其他一致性哈希算法相區(qū)別,一般將這個經(jīng)典方法稱為“割環(huán)法”。該算法能夠滿足論文中提出的兩大目標(biāo),即平衡性(balance)和單調(diào)性(monotonicity)。

        顧名思義,割環(huán)法將整個哈??臻g組織成一個首尾相接的圓環(huán),一般設(shè)為[0, 232 - 1]。以分布式K-V存儲為例,哈希桶即為存儲節(jié)點。將節(jié)點N的編號或IP等按哈希函數(shù)hash(N)映射在環(huán)上,再將數(shù)據(jù)的key按同樣的哈希函數(shù)hash(k)映射在環(huán)上,數(shù)據(jù)就會存儲在環(huán)上以順時針方向遍歷找到的第一個節(jié)點。當(dāng)節(jié)點擴(kuò)容或縮容時,仍然按照順時針原則,將受到影響的區(qū)間內(nèi)的數(shù)據(jù)重新分布到相鄰的節(jié)點上去,達(dá)到增量更新的目的,即滿足單調(diào)性。以下3張圖能夠簡單地說明。

        雖然哈希函數(shù)的結(jié)果是均勻的,但節(jié)點映射在環(huán)上可能不均勻,節(jié)點數(shù)越少,數(shù)據(jù)傾斜的可能性就越大。解決此問題的方法是將物理節(jié)點虛擬成多個影子節(jié)點,數(shù)據(jù)經(jīng)過哈希后按順時針原則落到影子節(jié)點指向的物理節(jié)點上。如果我們想要人為干預(yù)各節(jié)點上數(shù)據(jù)量的權(quán)重,還可以指定不同的影子節(jié)點數(shù)量。如下圖所示,影子節(jié)點數(shù)量為3:2:2:1。

        虛擬節(jié)點擴(kuò)縮容時的數(shù)據(jù)遷移方法與僅采用物理節(jié)點相同,因此調(diào)整權(quán)重值也會觸發(fā)數(shù)據(jù)遷移。

        對于有N個桶和K個鍵的一致性哈希方案,其時間復(fù)雜度是:

        • 添加、刪除節(jié)點——O(K / N + logN);

        • 添加、刪除key——O(logN)。

        其中,O(K / N)是數(shù)據(jù)重分布操作的平均代價,O(log N)則是在環(huán)上進(jìn)行二分查找定位哈希桶的代價。

        最后有一個小問題:節(jié)點擴(kuò)縮容以及節(jié)點宕機(jī)時如何保證系統(tǒng)仍然可用呢?有兩種直接的思路:

        • 中繼——如果在某個節(jié)點上查不到所需的數(shù)據(jù),就把請求轉(zhuǎn)發(fā)給該節(jié)點的順時針方向下一個節(jié)點進(jìn)行處理。

        • 雙寫——每次寫入數(shù)據(jù)時,都另外寫一份到目標(biāo)節(jié)點的順時針方向下一個節(jié)點。

        割環(huán)法已經(jīng)能夠滿足一般分布式系統(tǒng)中的多數(shù)需求,Cassandra、Memcached等著名的存儲系統(tǒng)都用到了它(注意Redis Cluster并沒有)。下面介紹思想更加精妙,效率也更高的跳躍一致性哈希(jump consistent hash)方法。

        跳躍一致性哈希

        這個算法比較年輕,在2014年由Google的大佬John Lamping和Eric Veach提出,原始論文見A Fast, Minimal Memory, Consistent Hash Algorithm。它的實現(xiàn)非常簡潔,僅有5行代碼,如下。

        int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) {
        int64_t b = 1, j = 0?
        while (j < num_buckets) {
        b = j?
        key = key * 2862933555777941757ULL + 1?
        j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1))?
        }
        return b?
        }

        看官可能還無法理解為什么能這樣實現(xiàn),接下來重走一遍論文的推導(dǎo)思路。

        假設(shè)最終要求的滿足平衡性和單調(diào)性的哈希函數(shù)是ch(k, n)(k為數(shù)據(jù)的鍵,n為哈希桶的數(shù)量),有如下簡單的遞推關(guān)系:

        • 當(dāng)n = 1時,所有key都要映射到同一個桶中,即ch(k, 1) = 0;

        • 當(dāng)n = 2時,為保證均勻性,需有K / 2個key分別映射到兩個桶中(K是key的總數(shù)量),故K / 2個key需要重新映射;

        • ......

        • 當(dāng)桶數(shù)量由n變?yōu)閚 + 1時,有K / (n + 1)個key需要重新映射。

        那么該如何決定哪些key被重新映射到新的桶中呢?答案是采用線性同余法(LCG)生成的偽隨機(jī)數(shù)決定。上文中的magic number 2862933555777941757就是線性同余法的乘數(shù)a。

        以k作為種子生成一個偽隨機(jī)數(shù)序列,可以保證對于確定的k,ch(k, n)的結(jié)果也是確定的,進(jìn)而使用條件rand < 1 / (j + 1)即可保證哈希桶由j個變?yōu)閖 + 1個時,有1 / (j + 1)比例的數(shù)據(jù)會重新映射。

        此時ch()函數(shù)的邏輯如下,時間復(fù)雜度顯然為O(n)。

        int ch(int key, int num_buckets) {
        random.seed(key)?
        int b = 0? // This will track ch(key, j+1).
        for (int j = 1? j < num_buckets? j++) {
        if (random.next() < 1.0 / (j + 1)) b = j?
        }
        return b?
        }

        這個復(fù)雜度比割環(huán)法還要高,如何優(yōu)化?容易想到,rand < 1 / (j + 1)的概率肯定是相對小的,也就是說隨著j的增大,發(fā)生重分布的key的比例越來越小,j可以不必逐次自增,而是跳躍前進(jìn),這也就是算法名稱中"jump"一詞的由來。

        觀察上面的代碼,b表示k最后一跳的目的哈希桶的編號,即滿足條件:

        ch(k, b + 1) ≠ ch(k, b) && ch(k, b + 1) = b

        假設(shè)k連續(xù)不跳變,直到增加到j(luò) + 1個桶才發(fā)生跳變,可知此概率為:

        [(b + 1)/(b + 2)] * [(b + 2)/(b + 3)] * ... * [(j - 1)/j] = (b + 1) / j

        或者表示為:

        P[j ≥ i] = P[ch(k, i) = ch(k, b + 1)] = (b + 1) / i

        圖示如下。

        那么,j最多可以直接跳到哪里才不至于漏掉原有的循環(huán)過程呢?容易得知,要滿足rand < (b + 1) / j,需要j < (b + 1) / rand,將其向下取整即可。改進(jìn)后的ch()函數(shù)如下。

        int ch(int k, int n) {
        random.seed(k);
        int b = -1, j = 0;
        while (j < n) {
        b = j;
        r = random.next();
        j = floor((b+1) / r);
        }
        return b;
        }

        將random替換為具體的LCG,就是本節(jié)開頭的算法了。

        分析時間復(fù)雜度:對于任意一個k,在哈希桶數(shù)從1增加到n的過程中,發(fā)生跳躍的期望次數(shù)是1 / 2 + ... + 1 / i + ... + 1 / n。根據(jù)歐拉常數(shù)的定義,調(diào)和級數(shù)與自然對數(shù)的差值的極限會收斂到一個小數(shù),因此跳躍一致性哈希算法的復(fù)雜度是O(ln n),比割環(huán)法更優(yōu)。

        根據(jù)論文給出的實驗數(shù)據(jù),跳躍一致性哈希產(chǎn)生的分布的標(biāo)準(zhǔn)差遠(yuǎn)遠(yuǎn)比割環(huán)法小,也就是非常均勻。

        隨著桶數(shù)量的增加,跳躍一致性哈希算法的執(zhí)行時間增長也不明顯。

        另外,它不需要額外的數(shù)據(jù)結(jié)構(gòu),內(nèi)存占用極小(即論文標(biāo)題中所說的minimal memory)。

        但是,它相對于割環(huán)法而言有個非常大的缺點,即只能在哈希桶序列的尾部添加和刪除桶,而不能在中間增刪。顯而易見,如果在中間增刪桶,由于桶的標(biāo)號是按自然順序來的,因此會導(dǎo)致后方所有桶的標(biāo)號發(fā)生變化,不再滿足一致性哈希的基本性質(zhì)。

        仍然考慮節(jié)點擴(kuò)縮容以及節(jié)點宕機(jī)時如何保證系統(tǒng)仍然可用的問題。

        • 中繼——如果在尾部的哈希桶j + 1中查不到所需的數(shù)據(jù),就把請求轉(zhuǎn)發(fā)給ch(k, j)桶,即它的上一跳節(jié)點。

        • 雙寫——每次寫入數(shù)據(jù)時,如果寫入的是尾部的哈希桶j + 1,就另外寫一份到ch(k, j);如果寫入的是非尾部的哈希桶i,就另外寫一份到i + 1。這樣,不管是哪個節(jié)點失敗,數(shù)據(jù)都不會丟失。

        Greenplum中的應(yīng)用

        Greenplum提供了一個為集群擴(kuò)容的工具gpexpand。在GP v5中,執(zhí)行g(shù)pexpand時需要將所有哈希分布改為隨機(jī)分布,按照新的集群規(guī)模重新根據(jù)hash key計算哈希值,再將數(shù)據(jù)重新均衡到各個segment節(jié)點上,相當(dāng)于進(jìn)行了一次完全的shuffle,如下圖所示。

        這種方式的缺點顯而易見:集群在擴(kuò)容期間處于不可用狀態(tài),數(shù)據(jù)交換量巨大。并且在數(shù)據(jù)由隨機(jī)分布轉(zhuǎn)為新的哈希分布之前,無法利用數(shù)據(jù)的本地性信息做查詢優(yōu)化,拖累性能。

        在GP v6中,通過將跳躍一致性哈希引入gpexpand,實現(xiàn)了完全在線、高性能的集群擴(kuò)容方式。如下圖所示,將集群由3節(jié)點擴(kuò)容到4節(jié)點,只有1/4的數(shù)據(jù)需要重分布。

        GP v6的跳躍一致性哈希實現(xiàn)與Google原版完全相同。

        另外,如何保證那些沒有重分布完畢的表被正確地查詢呢?GP v6在catalog表gp_distribution_policy里加入了一個新的字段numsegments,表示一張表的數(shù)據(jù)分布在前numsegments個節(jié)點上。因此,就算擴(kuò)容的過程中有事務(wù)正在運行,只要numsegments沒有改變,就仍然只在原有節(jié)點上執(zhí)行查詢。

        最后,可以通過全局配置gp_use_legacy_hashops設(shè)定是否改回舊版的取模哈希方式,默認(rèn)當(dāng)然為false。


        一萬五千字詳解HTTP協(xié)議

        Spark如何協(xié)調(diào)來完成整個Job的運行詳解

        最新Hive/Hadoop高頻面試點小集合

        歡迎點贊+收藏+轉(zhuǎn)發(fā)朋友圈素質(zhì)三連

        文章不錯?點個【在看】吧! 
        瀏覽 28
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            婷婷丁香五月在线| 91视频免费在线观看| 大香焦草久| 久久免费视频网站| 一本色道久久综合无码| 97狠狠| 日韩精品成人| 无码精品人妻一区二区| 亚洲AA视频| 精品孕妇孕交无码专区| 麻豆免费视频| 健身房被教练3p喷水了| 高清无码小视频| 蜜桃91精品入口| 欧美色图在线播放| 老司机精品在线观看| 三级片无码在线| 美女自慰网站免费| 黄色片视频网站| 老太奶性BBwBBw侧所| 国产69精品久久| 91无码在线视频| 中文字幕乱码中文字乱码影响大吗| 中文字幕在线观看第一页| 亚洲一级无码视频| 少妇推油呻吟白浆啪啪成人片| 天堂成人网| 久久视频一二| 俺也来最新色视频| 亚洲天堂欧美| 成年人在线观看视频| 久久秘成人久久无码| 淫色淫香综合网| 大香蕉国产精品| 国产a片视频| 天天爱综合| 性v天堂| 影音先锋色资源站| 日韩一级黄色毛片| 丁香五月在线视频| 51成人精品午夜福利| 国产AA片| 亚洲V| 激情小视频在线观看| 免费黄片视频在线观看| 久久91| 亚洲AV无码久久久| 亚洲无码AV一区二区三区| 国产激情免费| 狠狠躁日日躁夜夜躁A片男男视频| 波多野吉衣毛片| 一区二区三区无码视频| 99成人在线视频| 99久久久国产精品无码| 亚洲第一狼人综合网| 一个人看的www日本高清视频| 丁香五月激情网| 内射学生妹J亅| 亚洲久久在线| 亚洲小电影| 成人性爱视频免费观看| 不卡无码在线观看| 日本特黄一级| 先锋资源在线视频| 男女拍拍拍| 色婷在线| 天天看天天射| 天堂成人网站| 欧美a级视频| 久久久久久亚洲精品| 精品成人久久| 亚洲A∨| 欧美成人一级片| 山东wBBBB搡wBBBB| 亚洲区在线播放| 黄片视频在线免费观看| 久久网一区| 日韩在线视频91| 蜜臀激情| 大香蕉婷婷五月天| 色欲国产精品欧美在线密| 精品国产va久久久久久久| 影音先锋成人AV| 人人干人人操人人| 成人黄片网站| 亚洲无码69| 操美女逼逼| www天天日| 成人三级片在线| 91在线观看免费视频| 亚洲视频在线免费播放| 欧美综合视频在线观看| 欧美人操逼视频| 亚洲色影院| 蜜臀久久久99久久久久久久| 一区二区高清无码| 日本爱爱网址| 日韩综合网| 成人午夜在线观看| 自慰喷水流白浆中文字幕| 日皮视频在线免费观看| 婷婷丁香五月激情一区综合网 | 人人妻人人草| 黄色一级大片在线免费看产| 亚洲精品午夜福利| www.199麻豆在线观看网站| 国产三级片视频| 小明成人免费视频| 国产精品不卡| 超碰免费91| 亚洲精品国产精品乱玛不99| 在线免费看黄色视频| 免费无码| 国产午夜精品电影| 日本黄色大片网站| 东方AV在线观看| 好逼天天有| 五月天黄色电影| 黄色一级视频网站| 国产精品91久久久| 精品免费国产一区二区三区四区| 久久五月天视频| 亚洲口爆| 无码av免费| 日本天堂Tv视频在线观看| 五月丁香婷婷综合网| 一级黄色影院| 国产女人18毛片水真多18精品| 艹逼视频| 亚欧无码| 亚洲五月天婷婷| 美女AV网站| 中文字幕人妻日韩在线| 国产一区二三区| 丁香婷婷男人天堂| 欧美v| 亚洲人人18XXX—20HD| 东京热精品| 91天堂在线| 黄色视频免费在线看| 亚洲日韩第一页| 欧美群交videotv群交| 欧美精品A级片| 18毛片| 婷婷色视频| 4444操| 中文字幕在线日亚洲9| 五月婷婷成人| 一区二区免费| 特逼视频| 91爱搞在线| 97人妻精品黄网站| 一区二区三区免费看| 少妇人妻AV| 亚洲人内射片又| 操逼在线免费观看| 1插菊花网| 天天操天天谢| 亚洲无码AV电影| 日韩欧美国产精品综合嫩V| 四川妇搡BBBB搡BBBB| 波多野结衣av无码| 777.av| 欧美一区二区三区四| 亚洲综合激情五月久久| 国产91在线亚洲| 日韩日批| 久久久电影| 广东BBW搡BBBB搡| 91麻豆精品视频| 国产伦精品一区二区三区妓女下载 | 日本少妇激情视频| 狠狠网| 黄色AV网| 青青草视频免费| 国产精品麻豆视频| 国产福利91精品一区二区三区| 高清成人无码| 91日韩高清| 蜜桃影视| 婷婷五月天激情小说| 蜜臀久久99精品久久久兰草影视| 九九香蕉网| 竹菊影视一区二区三区| 18禁91| 成人电影一区二区| 国产麻豆一区二区三区| 人人爽网站| 国产精品久久777777是什么意思| 欧美一级婬片AAAA毛片| 精品9999| 99三级片| 精品福利一区二区三区| 一级A片在线观看| 国产在线拍偷自揄拍无码一区二区| 人人天天爽| 日本一区二区三区四区在线观看| 国产骚逼| 精品偷拍视频| 最新国产视频| 在线观看视频你懂的| 天堂中文8资源在线8| 国产高清做爱免费在线视频| 无码免费在线视频| 亚洲免费观看高清完整版在va线| 亚洲有码中文字幕| 狠狠搞狠狠操| 日韩影音| 国内精品一区二区| 四虎成人视频| 青青青国产| 尤物网站在线播放| 在线免费观看av网站| 日本人妻中文字幕| 中文字幕精品在线视频| TheAV精尽人亡av| 人妻体体内射精一区二区| 久久手机电影| 一级爱爱| 亚洲国产中文字幕| 亚洲制服在线观看| 41ts午夜福利| 91精彩视频在线观看| 成人黄色AV网站| 三级av网站| 无码专区在线看v| 精品视频在线播放| 久久久久免费视频| 日韩欧美小视频| 精品视频第一页| 粗长哭叫打桩H体育生| 四房五月婷婷| 免费黄色大片网站| 亚洲一区二区三区在线++中国| 77777色婷婷| 麻豆免费视频| 日韩肏逼| 啪啪毛片| 黄色在线视频网站| 视频一区二区三| 少妇搡BBBB搡BBB搡HD(| 97人妻精品一区二区三区免| 青娱乐在线精品| 精品成人无码一区二区三区| 啪啪视频国产| 无码人妻日本| AV免费激情影院| 神马午夜福利| 韩日一级片| 日本A片在线观看| 亚洲热在线观看| 亚洲在线无码视频| 人妻天天操| 河南熟妇搡BBBB搡BBBB| 日本电影一区二区三区| 大鸡巴操B视频| 成人精品二区| 国产欧美日韩综合精品| 亚日韩在线| 西西www444无码大胆| 激情五月天小说网| 先锋影音资源站av每日资源在线| 无码中文字幕高清| 国产激情艹逼| 中文字幕福利电影| 日本免费高清视频在线观看一区 | 久久偷看各类wc女厕嘘嘘偷窃 | 91亚洲电影| 猛操美女| 在线免费无码| 97人人操| 久久香蕉网| 国产美女自拍| www.zaixianshipin| 亚洲AV无码第一区二区三区蜜桃| 欧美城综合在线观看网| 少妇BBBBBB| 亚洲国产成人va| 日韩不卡高清在线观看视频| 美女毛片网站| 性爱xxxxx| 亚洲少妇性爱视频| av天堂中文| 中文字幕免费无码| 亚洲欧美天堂| 一级特黄妇女高潮AA片免费播放| 国产高潮白浆喷| 三上悠亚无码破解69XXX| 在线观看成年人视频| 水蜜桃在线观看视频| 久久午夜无码鲁丝片| 天堂在线免费视频| 亚洲激情综合| 一见钟情的韩国电影| 天天日天天干麻豆| 国产高清精品无码| 无码中文综合成熟精品AV电影| 人成在线观看| 亚洲精品18禁| 日韩人妻码一区二区三区|