青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Gordon.Ma

近山則志高,臨水而聰慧
隨筆 - 3, 文章 - 0, 評論 - 1, 引用 - 0
數據加載中……

2014年6月26日

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

載地址: http://blog.csdn.net/sparkliang/article/details/5279393

consistent hashing 算法早在 1997 年就在論文 Consistent hashing and random trees 中被提出,目前在cache 系統中應用越來越廣泛;

1 基本場景

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

hash(object)%N

   一切都運行正常,再考慮如下的兩種情況;

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

   2 由于訪問加重,需要添加 cache ,這時候 cache  N+1 臺,映射公式變成了 hash(object)%(N+1) 

 2 意味著什么?這意味著突然之間幾乎所有的 cache 都失效了。對于服務器而言,這是一場災難,洪水般的訪問都會直接沖向后臺服務器;

再來考慮第三個問題,由于硬件能力越來越強,你可能想讓后面添加的節點多做點活,顯然上面的 hash 算法也做不到。

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

2 hash 算法和單調性

   Hash 算法的一個衡量指標是單調性( Monotonicity ),定義如下:

  單調性是指如果已經有一些內容通過哈希分派到了相應的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區。

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

3 consistent hashing 算法的原理

consistent hashing 是一種 hash 算法,簡單的說,在移除 / 添加一個 cache 時,它能夠盡可能小的改變已存在 key 映射關系,盡可能的滿足單調性的要求。

下面就來按照 5 個步驟簡單講講 consistent hashing 算法的基本原理。

3.1 環形hash 空間

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

circle space

 1 環形 hash 空間

3.2 把對象映射到hash 空間

接下來考慮 4 個對象 object1~object4 ,通過 hash 函數計算出的 hash  key 在環上的分布如圖 2 所示。

hash(object1) = key1;

… …

hash(object4) = key4;

object

 2 4 個對象的 key 值分布

3.3 把cache 映射到hash 空間

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

假設當前有 A,B  C  3  cache ,那么其映射結果將如圖 3 所示,他們在 hash 空間中,以對應的 hash 值排列。

hash(cache A) = key A;

… …

hash(cache C) = key C;

cache

 3 cache 和對象的 key 值分布

 

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

3.4 把對象映射到cache

現在 cache 和對象都已經通過同一個 hash 算法映射到 hash 數值空間中了,接下來要考慮的就是如何將對象映射到 cache 上面了。

在這個環形空間中,如果沿著順時針方向從對象的 key 值出發,直到遇見一個 cache ,那么就將該對象存儲在這個 cache 上,因為對象和 cache  hash 值是固定的,因此這個 cache 必然是唯一和確定的。這樣不就找到了對象和 cache 的映射方法了嗎?!

依然繼續上面的例子(參見圖 3 ),那么根據上面的方法,對象 object1 將被存儲到 cache A 上; object2 object3 對應到 cache C  object4 對應到 cache B 

3.5 考察cache 的變動

前面講過,通過 hash 然后求余的方法帶來的最大問題就在于不能滿足單調性,當 cache 有所變動時, cache會失效,進而對后臺服務器造成巨大的沖擊,現在就來分析分析 consistent hashing 算法。

3.5.1 移除 cache

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

因此這里僅需要變動對象 object4 ,將其重新映射到 cache C 上即可;參見圖 4 

remove

 4 Cache B 被移除后的 cache 映射

3.5.2 添加 cache

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

 

因此這里僅需要變動對象 object2 ,將其重新映射到 cache D 上;參見圖 5 

add

 5 添加 cache D 后的映射關系

4 虛擬節點

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

平衡性

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

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

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

“虛擬節點”( virtual node )是實際節點在 hash 空間的復制品( replica ),一實際個節點對應了若干個“虛擬節點”,這個對應個數也成為“復制個數”,“虛擬節點”在 hash 空間中以 hash 值排列。

仍以僅部署 cache A  cache C 的情況為例,在圖 4 中我們已經看到, cache 分布并不均勻。現在我們引入虛擬節點,并設置“復制個數”為 2 ,這就意味著一共會存在 4 個“虛擬節點”, cache A1, cache A2 代表了cache A  cache C1, cache C2 代表了 cache C ;假設一種比較理想的情況,參見圖 6 

virtual nodes

 6 引入“虛擬節點”后的映射關系

 

此時,對象到“虛擬節點”的映射關系為:

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

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

引入“虛擬節點”后,映射關系就從 { 對象 -> 節點 } 轉換到了 { 對象 -> 虛擬節點 } 。查詢物體所在 cache 時的映射關系如圖 7 所示。

map

 7 查詢對象所在 cache

 

“虛擬節點”的 hash 計算可以采用對應節點的 IP 地址加數字后綴的方式。例如假設 cache A  IP 地址為202.168.14.241 

引入“虛擬節點”前,計算 cache A  hash 值:

Hash(“202.168.14.241”);

引入“虛擬節點”后,計算“虛擬節”點 cache A1  cache A2  hash 值:

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

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

5 小結

Consistent hashing 的基本原理就是這些,具體的分布性等理論分析應該是很復雜的,不過一般也用不到。

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

http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx 轉載了一個 PHP 版的實現代碼。

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


 

一些參考資料地址:

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 閱讀(273) | 評論 (0)編輯 收藏

2014年6月19日

【轉載】Google Protocol Buffer 的使用和原理

     摘要: 原文鏈接: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/簡介什么是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹:Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準,目前已經正在使用的有超過 48,162 種報文格式定義和...  閱讀全文

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

2012年5月22日

C++關鍵字

面試過程中,一些面試官對C++一些特殊關鍵字很關注;
整理了一些比較有說頭的關鍵字
  • explicit
用來聲明構造函數,被聲明的構造函數為顯示構造函數,不能在隱式轉換中使用。
C++中一個參數的構造函數或除第一個參數外均有默認值的多參構造函數,有兩個作用:1、構造對象;2、默認且隱式的類型轉換操作符。
 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)類型轉換.
17 
18 bar( foo( 1 ) ); // 正確, 顯式調用explicit構造函數.
19 
20 bar( static_cast<foo>1 ) );  // 正確, 通過static_cast調用explicit構造函數.
21 
22 bar( foo( 1.0 ) );  // 正確, 顯式調用explicit構造函數, 參數自動從浮點轉換成整型.

  • mutable
用來聲明一個成員變量,被mutable聲明的成員變量,可以在被const修飾的成員函數中修改。
mutable不可與const、static同時使用。
 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
用以聲明一個變量,被volatile聲明的變量意味著有可能被某些編譯器未知的因素更改,因此編譯器不會對其做任何優化操作。
從而可以提供對特殊地址的穩定訪問,多用于嵌入式編程中。
 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參見:http://asm.sourceforge.net/articles/linasm.html
10     asm("movl $2, -4(%ebp)\n\r"); // 修改變量地址內容
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 閱讀(1458) | 評論 (1)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品s色| 亚洲第一页中文字幕| 国产精品热久久久久夜色精品三区| 久久一区精品| 久久免费视频网站| 免费日本视频一区| 欧美日韩精品久久久| 国产精品久久二区二区| 国产色爱av资源综合区| 国产在线观看91精品一区| 在线观看中文字幕亚洲| 亚洲美女91| 羞羞答答国产精品www一本| 久久久中精品2020中文| 亚洲第一视频| 亚洲免费在线精品一区| 乱码第一页成人| 国产精品白丝jk黑袜喷水| 国产一区清纯| 一本色道久久综合亚洲91| 久久精品国产精品 | 亚洲激情电影在线| 日韩午夜免费视频| 久久久99免费视频| 日韩视频精品在线| 久久在线免费观看视频| 国产精品久久久久国产a级| 在线成人中文字幕| 性欧美videos另类喷潮| 亚洲国产精品成人久久综合一区| 亚洲图片你懂的| 久久综合九色综合欧美狠狠| 欧美日韩高清在线观看| 狠狠综合久久av一区二区老牛| 99视频+国产日韩欧美| 久久青草久久| 午夜精品三级视频福利| 欧美色图五月天| 最新日韩av| 欧美成人激情在线| 亚洲欧美中文字幕| 欧美午夜一区二区福利视频| 亚洲毛片播放| 亚洲国产激情| 美女露胸一区二区三区| 国产有码在线一区二区视频| 午夜精品一区二区三区在线播放 | 亚洲午夜精品福利| 欧美黄色一区二区| 久久久另类综合| 国产亚洲女人久久久久毛片| 亚洲影院色在线观看免费| 亚洲激情视频| 欧美大胆a视频| 亚洲欧洲在线播放| 亚洲欧洲三级电影| 欧美国产乱视频| 亚洲精品一区在线| 亚洲美女色禁图| 国产精品爱久久久久久久| 亚洲一区二区精品视频| 一卡二卡3卡四卡高清精品视频| 欧美日韩999| 亚洲自拍偷拍麻豆| 亚洲图片欧洲图片av| 国产精品视频免费在线观看| 亚洲欧美在线aaa| 亚洲欧美日韩国产另类专区| 国产区精品在线观看| 久久久欧美一区二区| 美国成人毛片| 一级日韩一区在线观看| 亚洲视频在线观看| 国产一区视频在线看| 欧美国产在线观看| 欧美理论电影在线播放| 亚洲免费视频成人| 欧美一区二区三区的| 1024成人网色www| 亚洲精品久久久久久一区二区| 欧美日韩精品系列| 西西人体一区二区| 欧美一区二区三区男人的天堂 | 亚洲天堂免费观看| 亚洲一区制服诱惑| 在线观看欧美| 日韩视频免费观看| 国产区精品视频| 欧美国产在线观看| 国产精品国产精品国产专区不蜜| 欧美一区二区三区日韩| 久久夜精品va视频免费观看| 一区二区三区免费在线观看| 午夜精品一区二区三区四区| 亚洲国产精品www| 亚洲一区二区三区激情| 亚洲国产人成综合网站| 亚洲性感激情| 亚洲另类视频| 欧美一区二区三区四区在线观看地址| 亚洲高清一二三区| 亚洲午夜女主播在线直播| 一区二区亚洲| 中文欧美在线视频| 亚洲国产乱码最新视频| 亚洲无限乱码一二三四麻| 有坂深雪在线一区| 亚洲影视九九影院在线观看| 日韩一区二区精品视频| 久久夜精品va视频免费观看| 久久黄色网页| 国产精品视频网| 一区二区三区www| 99re6热在线精品视频播放速度| 久久99在线观看| 午夜精品一区二区三区在线播放| 欧美精品亚洲| 亚洲大黄网站| 在线观看成人av| 久久av资源网| 欧美一区二区三区在线| 欧美色一级片| 亚洲免费成人av| 夜夜嗨av一区二区三区中文字幕 | 久久久午夜精品| 欧美一区观看| 国产精品毛片| 亚洲午夜女主播在线直播| 一区二区三区.www| 欧美精品不卡| 亚洲人成欧美中文字幕| 亚洲国产va精品久久久不卡综合| 欧美在线二区| 久久久亚洲影院你懂的| 韩日精品在线| 99精品久久久| 久久精品国产91精品亚洲| 日韩一区二区免费高清| 欧美一区二区黄| 欧美吻胸吃奶大尺度电影| 亚洲激情小视频| 日韩视频在线一区二区| 欧美高清你懂得| 亚洲欧洲视频在线| 亚洲婷婷综合久久一本伊一区| 欧美精品在线播放| 日韩午夜精品视频| 亚洲欧美精品在线观看| 国产精品一区在线观看| 午夜视黄欧洲亚洲| 免费久久精品视频| 亚洲精品美女| 欧美日韩喷水| 亚洲欧美在线网| 牛牛影视久久网| 一区二区三区毛片| 国产日产精品一区二区三区四区的观看方式 | 国产一区二区看久久| 久久激情综合网| 欧美黄污视频| 亚洲欧美综合国产精品一区| 狠狠色香婷婷久久亚洲精品| 免费成人性网站| 夜夜嗨av一区二区三区网页| 欧美专区在线观看| 亚洲国产视频直播| 国产精品超碰97尤物18| 久久狠狠久久综合桃花| 亚洲国产欧美在线| 性欧美8khd高清极品| 亚洲电影中文字幕| 欧美性猛交一区二区三区精品| 欧美一级在线亚洲天堂| 亚洲福利视频网站| 欧美一区二区啪啪| a4yy欧美一区二区三区| 国产一区二区久久久| 欧美伦理91i| 久久久久久久国产| 亚洲欧美不卡| 91久久视频| 米奇777超碰欧美日韩亚洲| 亚洲欧美经典视频| 亚洲精品国偷自产在线99热| 国产欧美精品日韩区二区麻豆天美 | 亚洲一区国产一区| 今天的高清视频免费播放成人| 欧美日韩免费观看一区=区三区| 久久国产精品黑丝| 亚洲小说春色综合另类电影| 亚洲福利视频网| 久久亚洲美女| 欧美一二区视频| 亚洲午夜久久久久久久久电影院| 在线看片日韩| 黄色成人在线网址| 国产亚洲一区二区在线观看 | 91久久综合| 欧美电影在线播放| 美女网站在线免费欧美精品|