• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Gordon.Ma

            近山則志高,臨水而聰慧
            隨筆 - 3, 文章 - 0, 評(píng)論 - 1, 引用 - 0
            數(shù)據(jù)加載中……

            2014年6月26日

            【轉(zhuǎn)載】一致性 hash 算法( consistent hashing )

            轉(zhuǎn)載地址: http://blog.csdn.net/sparkliang/article/details/5279393

            consistent hashing 算法早在 1997 年就在論文 Consistent hashing and random trees 中被提出,目前在cache 系統(tǒng)中應(yīng)用越來(lái)越廣泛;

            1 基本場(chǎng)景

            比如你有 N 個(gè) cache 服務(wù)器(后面簡(jiǎn)稱 cache ),那么如何將一個(gè)對(duì)象 object 映射到 N 個(gè) cache 上呢,你很可能會(huì)采用類似下面的通用方法計(jì)算 object  hash 值,然后均勻的映射到到 N 個(gè) cache 

            hash(object)%N

               一切都運(yùn)行正常,再考慮如下的兩種情況;

               1 一個(gè) cache 服務(wù)器 m down 掉了(在實(shí)際應(yīng)用中必須要考慮這種情況),這樣所有映射到 cache m 的對(duì)象都會(huì)失效,怎么辦,需要把 cache m  cache 中移除,這時(shí)候 cache  N-1 臺(tái),映射公式變成了 hash(object)%(N-1) 

               2 由于訪問(wèn)加重,需要添加 cache ,這時(shí)候 cache  N+1 臺(tái),映射公式變成了 hash(object)%(N+1) 

             2 意味著什么?這意味著突然之間幾乎所有的 cache 都失效了。對(duì)于服務(wù)器而言,這是一場(chǎng)災(zāi)難,洪水般的訪問(wèn)都會(huì)直接沖向后臺(tái)服務(wù)器;

            再來(lái)考慮第三個(gè)問(wèn)題,由于硬件能力越來(lái)越強(qiáng),你可能想讓后面添加的節(jié)點(diǎn)多做點(diǎn)活,顯然上面的 hash 算法也做不到。

              有什么方法可以改變這個(gè)狀況呢,這就是 consistent hashing...

            2 hash 算法和單調(diào)性

               Hash 算法的一個(gè)衡量指標(biāo)是單調(diào)性( Monotonicity ),定義如下:

              單調(diào)性是指如果已經(jīng)有一些內(nèi)容通過(guò)哈希分派到了相應(yīng)的緩沖中,又有新的緩沖加入到系統(tǒng)中。哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會(huì)被映射到舊的緩沖集合中的其他緩沖區(qū)。

            容易看到,上面的簡(jiǎn)單 hash 算法 hash(object)%N 難以滿足單調(diào)性要求。

            3 consistent hashing 算法的原理

            consistent hashing 是一種 hash 算法,簡(jiǎn)單的說(shuō),在移除 / 添加一個(gè) cache 時(shí),它能夠盡可能小的改變已存在 key 映射關(guān)系,盡可能的滿足單調(diào)性的要求。

            下面就來(lái)按照 5 個(gè)步驟簡(jiǎn)單講講 consistent hashing 算法的基本原理。

            3.1 環(huán)形hash 空間

            考慮通常的 hash 算法都是將 value 映射到一個(gè) 32 為的 key 值,也即是 0~2^32-1 次方的數(shù)值空間;我們可以將這個(gè)空間想象成一個(gè)首( 0 )尾( 2^32-1 )相接的圓環(huán),如下面圖 1 所示的那樣。

            circle space

             1 環(huán)形 hash 空間

            3.2 把對(duì)象映射到hash 空間

            接下來(lái)考慮 4 個(gè)對(duì)象 object1~object4 ,通過(guò) hash 函數(shù)計(jì)算出的 hash  key 在環(huán)上的分布如圖 2 所示。

            hash(object1) = key1;

            … …

            hash(object4) = key4;

            object

             2 4 個(gè)對(duì)象的 key 值分布

            3.3 把cache 映射到hash 空間

            Consistent hashing 的基本思想就是將對(duì)象和 cache 都映射到同一個(gè) hash 數(shù)值空間中,并且使用相同的 hash算法。

            假設(shè)當(dāng)前有 A,B  C  3 臺(tái) cache ,那么其映射結(jié)果將如圖 3 所示,他們?cè)?/span> hash 空間中,以對(duì)應(yīng)的 hash 值排列。

            hash(cache A) = key A;

            … …

            hash(cache C) = key C;

            cache

             3 cache 和對(duì)象的 key 值分布

             

            說(shuō)到這里,順便提一下 cache  hash 計(jì)算,一般的方法可以使用 cache 機(jī)器的 IP 地址或者機(jī)器名作為 hash輸入。

            3.4 把對(duì)象映射到cache

            現(xiàn)在 cache 和對(duì)象都已經(jīng)通過(guò)同一個(gè) hash 算法映射到 hash 數(shù)值空間中了,接下來(lái)要考慮的就是如何將對(duì)象映射到 cache 上面了。

            在這個(gè)環(huán)形空間中,如果沿著順時(shí)針?lè)较驈膶?duì)象的 key 值出發(fā),直到遇見(jiàn)一個(gè) cache ,那么就將該對(duì)象存儲(chǔ)在這個(gè) cache 上,因?yàn)閷?duì)象和 cache  hash 值是固定的,因此這個(gè) cache 必然是唯一和確定的。這樣不就找到了對(duì)象和 cache 的映射方法了嗎?!

            依然繼續(xù)上面的例子(參見(jiàn)圖 3 ),那么根據(jù)上面的方法,對(duì)象 object1 將被存儲(chǔ)到 cache A 上; object2 object3 對(duì)應(yīng)到 cache C  object4 對(duì)應(yīng)到 cache B 

            3.5 考察cache 的變動(dòng)

            前面講過(guò),通過(guò) hash 然后求余的方法帶來(lái)的最大問(wèn)題就在于不能滿足單調(diào)性,當(dāng) cache 有所變動(dòng)時(shí), cache會(huì)失效,進(jìn)而對(duì)后臺(tái)服務(wù)器造成巨大的沖擊,現(xiàn)在就來(lái)分析分析 consistent hashing 算法。

            3.5.1 移除 cache

            考慮假設(shè) cache B 掛掉了,根據(jù)上面講到的映射方法,這時(shí)受影響的將僅是那些沿 cache B 逆時(shí)針遍歷直到下一個(gè) cache  cache C )之間的對(duì)象,也即是本來(lái)映射到 cache B 上的那些對(duì)象。

            因此這里僅需要變動(dòng)對(duì)象 object4 ,將其重新映射到 cache C 上即可;參見(jiàn)圖 4 

            remove

             4 Cache B 被移除后的 cache 映射

            3.5.2 添加 cache

            再考慮添加一臺(tái)新的 cache D 的情況,假設(shè)在這個(gè)環(huán)形 hash 空間中, cache D 被映射在對(duì)象 object2 object3 之間。這時(shí)受影響的將僅是那些沿 cache D 逆時(shí)針遍歷直到下一個(gè) cache  cache B )之間的對(duì)象(它們是也本來(lái)映射到 cache C 上對(duì)象的一部分),將這些對(duì)象重新映射到 cache D 上即可。

             

            因此這里僅需要變動(dòng)對(duì)象 object2 ,將其重新映射到 cache D 上;參見(jiàn)圖 5 

            add

             5 添加 cache D 后的映射關(guān)系

            4 虛擬節(jié)點(diǎn)

            考量 Hash 算法的另一個(gè)指標(biāo)是平衡性 (Balance) ,定義如下:

            平衡性

              平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。

            hash 算法并不是保證絕對(duì)的平衡,如果 cache 較少的話,對(duì)象并不能被均勻的映射到 cache 上,比如在上面的例子中,僅部署 cache A  cache C 的情況下,在 4 個(gè)對(duì)象中, cache A 僅存儲(chǔ)了 object1 ,而 cache C 則存儲(chǔ)了object2  object3  object4 ;分布是很不均衡的。

            為了解決這種情況, consistent hashing 引入了“虛擬節(jié)點(diǎn)”的概念,它可以如下定義:

            “虛擬節(jié)點(diǎn)”( virtual node )是實(shí)際節(jié)點(diǎn)在 hash 空間的復(fù)制品( replica ),一實(shí)際個(gè)節(jié)點(diǎn)對(duì)應(yīng)了若干個(gè)“虛擬節(jié)點(diǎn)”,這個(gè)對(duì)應(yīng)個(gè)數(shù)也成為“復(fù)制個(gè)數(shù)”,“虛擬節(jié)點(diǎn)”在 hash 空間中以 hash 值排列。

            仍以僅部署 cache A  cache C 的情況為例,在圖 4 中我們已經(jīng)看到, cache 分布并不均勻。現(xiàn)在我們引入虛擬節(jié)點(diǎn),并設(shè)置“復(fù)制個(gè)數(shù)”為 2 ,這就意味著一共會(huì)存在 4 個(gè)“虛擬節(jié)點(diǎn)”, cache A1, cache A2 代表了cache A  cache C1, cache C2 代表了 cache C ;假設(shè)一種比較理想的情況,參見(jiàn)圖 6 

            virtual nodes

             6 引入“虛擬節(jié)點(diǎn)”后的映射關(guān)系

             

            此時(shí),對(duì)象到“虛擬節(jié)點(diǎn)”的映射關(guān)系為:

            objec1->cache A2  objec2->cache A1  objec3->cache C1  objec4->cache C2 

            因此對(duì)象 object1  object2 都被映射到了 cache A 上,而 object3  object4 映射到了 cache C 上;平衡性有了很大提高。

            引入“虛擬節(jié)點(diǎn)”后,映射關(guān)系就從 { 對(duì)象 -> 節(jié)點(diǎn) } 轉(zhuǎn)換到了 { 對(duì)象 -> 虛擬節(jié)點(diǎn) } 。查詢物體所在 cache 時(shí)的映射關(guān)系如圖 7 所示。

            map

             7 查詢對(duì)象所在 cache

             

            “虛擬節(jié)點(diǎn)”的 hash 計(jì)算可以采用對(duì)應(yīng)節(jié)點(diǎn)的 IP 地址加數(shù)字后綴的方式。例如假設(shè) cache A  IP 地址為202.168.14.241 

            引入“虛擬節(jié)點(diǎn)”前,計(jì)算 cache A  hash 值:

            Hash(“202.168.14.241”);

            引入“虛擬節(jié)點(diǎn)”后,計(jì)算“虛擬節(jié)”點(diǎn) cache A1  cache A2  hash 值:

            Hash(“202.168.14.241#1”);  // cache A1

            Hash(“202.168.14.241#2”);  // cache A2

            5 小結(jié)

            Consistent hashing 的基本原理就是這些,具體的分布性等理論分析應(yīng)該是很復(fù)雜的,不過(guò)一般也用不到。

            http://weblogs.java.net/blog/2007/11/27/consistent-hashing 上面有一個(gè) java 版本的例子,可以參考。

            http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx 轉(zhuǎn)載了一個(gè) PHP 版的實(shí)現(xiàn)代碼。

            http://www.codeproject.com/KB/recipes/lib-conhash.aspx C語(yǔ)言版本


             

            一些參考資料地址:

            http://portal.acm.org/citation.cfm?id=258660

            http://en.wikipedia.org/wiki/Consistent_hashing

            http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/

             http://weblogs.java.net/blog/2007/11/27/consistent-hashing

            http://tech.idv2.com/2008/07/24/memcached-004/

            http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx

            posted @ 2014-06-26 18:27 Gordooooon 閱讀(272) | 評(píng)論 (0)編輯 收藏

            2014年6月19日

            【轉(zhuǎn)載】Google Protocol Buffer 的使用和原理

                 摘要: 原文鏈接: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/簡(jiǎn)介什么是 Google Protocol Buffer? 假如您在網(wǎng)上搜索,應(yīng)該會(huì)得到類似這樣的文字介紹:Google Protocol Buffer( 簡(jiǎn)稱 Protobuf) 是 Google 公司內(nèi)部的混合語(yǔ)言數(shù)據(jù)標(biāo)準(zhǔn),目前已經(jīng)正在使用的有超過(guò) 48,162 種報(bào)文格式定義和...  閱讀全文

            posted @ 2014-06-19 18:06 Gordooooon 閱讀(256) | 評(píng)論 (0)編輯 收藏

            2012年5月22日

            C++關(guān)鍵字

            面試過(guò)程中,一些面試官對(duì)C++一些特殊關(guān)鍵字很關(guān)注;
            整理了一些比較有說(shuō)頭的關(guān)鍵字
            • explicit
            用來(lái)聲明構(gòu)造函數(shù),被聲明的構(gòu)造函數(shù)為顯示構(gòu)造函數(shù),不能在隱式轉(zhuǎn)換中使用。
            C++中一個(gè)參數(shù)的構(gòu)造函數(shù)或除第一個(gè)參數(shù)外均有默認(rèn)值的多參構(gòu)造函數(shù),有兩個(gè)作用:1、構(gòu)造對(duì)象;2、默認(rèn)且隱式的類型轉(zhuǎn)換操作符。
             1 class foo
             2 {
             3 public:
             4     explicit foo( int a )
             5         : _member( a )
             6     {}
             7 
             8     int _member;
             9 };
            10 
            11 int bar( const foo & f )
            12 {
            13     return f._member;
            14 }
            15 
            16 bar( 1 ); // 失敗, explicit禁止int到foo的隱式(implicit)類型轉(zhuǎn)換.
            17 
            18 bar( foo( 1 ) ); // 正確, 顯式調(diào)用explicit構(gòu)造函數(shù).
            19 
            20 bar( static_cast<foo>1 ) );  // 正確, 通過(guò)static_cast調(diào)用explicit構(gòu)造函數(shù).
            21 
            22 bar( foo( 1.0 ) );  // 正確, 顯式調(diào)用explicit構(gòu)造函數(shù), 參數(shù)自動(dòng)從浮點(diǎn)轉(zhuǎn)換成整型.

            • mutable
            用來(lái)聲明一個(gè)成員變量,被mutable聲明的成員變量,可以在被const修飾的成員函數(shù)中修改。
            mutable不可與const、static同時(shí)使用。
             1 class foo
             2 {
             3 public:
             4     foo()
             5         : _member(0)
             6     {}
             7 
             8     void ExChange( int a ) const
             9     {
            10         _member = a;
            11     }
            12 
            13     mutable int _member;
            14 }

            • volatile
            用以聲明一個(gè)變量,被volatile聲明的變量意味著有可能被某些編譯器未知的因素更改,因此編譯器不會(huì)對(duì)其做任何優(yōu)化操作。
            從而可以提供對(duì)特殊地址的穩(wěn)定訪問(wèn),多用于嵌入式編程中。
             1 void foo()
             2 {
             3     //volatile int nData = 1;
             4     int nData = 1;
             5 
             6     int nData_b = nData;
             7     printf("nData = %d\n",nData_b);
             8 
             9     // c++嵌入asm參見(jiàn):http://asm.sourceforge.net/articles/linasm.html
            10     asm("movl $2, -4(%ebp)\n\r"); // 修改變量地址內(nèi)容
            11 
            12     int nData_a = nData;
            13     printf("nData = %d\n",nData_a);
            14 }
            15 
            16 使用volatile輸出:
            17 nData = 1
            18 nData = 2
            19 
            20 不使用volatile輸出為:
            21 nData = 1
            22 nData = 1

            posted @ 2012-05-22 15:16 Gordooooon 閱讀(1452) | 評(píng)論 (1)編輯 收藏

            久久精品国产2020| 久久国产精品一区| 亚洲国产欧美国产综合久久| 欧美亚洲国产精品久久高清| 欧美黑人激情性久久| 伊人久久大香线焦综合四虎| 麻豆久久久9性大片| 99久久免费国产特黄| 一97日本道伊人久久综合影院| 日韩久久久久久中文人妻| 久久午夜综合久久| 国产婷婷成人久久Av免费高清| 久久av高潮av无码av喷吹| 久久久久久亚洲Av无码精品专口| 精品久久人人妻人人做精品| 国产V综合V亚洲欧美久久 | 国产成人无码精品久久久性色 | 久久久久久精品免费看SSS| 97久久精品无码一区二区天美| 色诱久久av| 国内精品伊人久久久久影院对白| 久久中文骚妇内射| 亚洲精品乱码久久久久66| 亚洲国产精品综合久久网络| 国产精品成人99久久久久91gav | 亚洲精品乱码久久久久66| 欧美亚洲国产精品久久| 伊人久久大香线蕉精品不卡| 99久久精品国产一区二区蜜芽| 国产精品久久自在自线观看| 日本道色综合久久影院| 精品久久久久久亚洲精品| 久久天堂AV综合合色蜜桃网| 久久久无码精品亚洲日韩蜜臀浪潮 | 99久久精品无码一区二区毛片| 精品久久久久久中文字幕人妻最新| 色综合久久中文字幕无码| 性高湖久久久久久久久| 精品久久久久久成人AV| 精品一区二区久久久久久久网站| 亚洲成人精品久久|