Your SlideShare is downloading. ×
0
@nullpon / id:paulownia
コンシステント
ハッシュ法
consistent hashing
コンシステントハッシュ法
分散データベース/キャッシュの保存先を決定
するために開発されたハッシュテーブルのアル
ゴリズム
コンシステントハッシュ
のアルゴリズム
適当なハッシュ関数を用意
出力値が大小比較可能なハッシュ関数を用意
※ ここでは、入力値を0から127までの値に変換
する仮想のハッシュ関数 h で説明する
ノードのIDをハッシュ関数 h で変換
n1: h("n1") => 25
n2: h("n2") => 120
n3: h("n3") => 50
n4: h("n4") => 95
リング状に配置
データのIDをハッシュ関数 h で変換
a1: h("a1") => 64
a2: h("a2") => 115
a3: h("a3") => 75
a4: h("a4") => 8
a5: h("a5") => 100
a6: h("a6")...
リング状に配置
データの割り当て先ノードは以下の順に決定
データIDのハッシュ値と同じノード
データIDより大きいハッシュ値を持つノード
のなかで、ハッシュ値が最小のノード
ハッシュ値が最小のノード
ノードの追加と削除
ノードの追加
n4のデータの一部がn5へ移動
ノードの削除
n1のデータがn3へ移動
移動するデータ数の平均値
データ数/ノード数
仮想ノード
仮想ノードなしでは、負荷分散が不完全
偏ったリング
データが特定のノードに偏り
負荷分散にならない
ノードがダウン
落ちたノードの全データが一つ先のノードへ
移動
一つ先のノードの負荷が2倍
特定のノードに負荷が集中
ノードを追加
1つ先のノードからデータが移動
1つ先のノードの負荷しか減らない
負荷対策にならない
そこで仮想ノード
n1: h("n1"+0) => 25
n1: h("n1"+1) => 100
n1: h("n1"+2) => 90
n2: h("n2"+0) => 120
n2: h("n2"+1) => 45
n2: h("n2"+2) => 13
...
リング状に配置
ノード数が増えれば均等に分散する確率が高くなる
ノード4が追加された場合
複数のノードから均等にデータが
移動してくる可能性が高い
ノード1がダウンした場合
ノード1のデータが複数のノードへ
均等に分散することが期待できる
メリット・デメリット
メリット
データの割り当て先を自動で決定可能
データをクラスタに均等に分散できる
ノードが落ちた時、自動で再割り当て
再割り当てのコストが小さい
デメリット
全てのノードが現在のクラスタの状態を正確に
知ってなければならない。
クラスタ状態の共有コストがかかる
まとめ
コンシステントハッシュを用いると
プロセスが1つ2つ程度落ちても問題のない
クラスタを構成できる
負荷分散についてエンジニアが手を動かす
必要がない
大規模な分散環境でも運用が楽
(かもしれない)
Consistent hash
Consistent hash
Upcoming SlideShare
Loading in...5
×

Consistent hash

4,243

Published on

(in japanese)コンシステントハッシュ法の簡単な説明でうす。ネットでググって出てくる以上の内容はありません

Transcript of "Consistent hash"

  1. 1. @nullpon / id:paulownia コンシステント ハッシュ法 consistent hashing
  2. 2. コンシステントハッシュ法 分散データベース/キャッシュの保存先を決定 するために開発されたハッシュテーブルのアル ゴリズム
  3. 3. コンシステントハッシュ のアルゴリズム
  4. 4. 適当なハッシュ関数を用意 出力値が大小比較可能なハッシュ関数を用意 ※ ここでは、入力値を0から127までの値に変換 する仮想のハッシュ関数 h で説明する
  5. 5. ノードのIDをハッシュ関数 h で変換 n1: h("n1") => 25 n2: h("n2") => 120 n3: h("n3") => 50 n4: h("n4") => 95
  6. 6. リング状に配置
  7. 7. データのIDをハッシュ関数 h で変換 a1: h("a1") => 64 a2: h("a2") => 115 a3: h("a3") => 75 a4: h("a4") => 8 a5: h("a5") => 100 a6: h("a6") => 90 a7: h("a7") => 45 a8: h("a8") => 15
  8. 8. リング状に配置
  9. 9. データの割り当て先ノードは以下の順に決定 データIDのハッシュ値と同じノード データIDより大きいハッシュ値を持つノード のなかで、ハッシュ値が最小のノード ハッシュ値が最小のノード
  10. 10. ノードの追加と削除
  11. 11. ノードの追加
  12. 12. n4のデータの一部がn5へ移動
  13. 13. ノードの削除
  14. 14. n1のデータがn3へ移動
  15. 15. 移動するデータ数の平均値 データ数/ノード数
  16. 16. 仮想ノード
  17. 17. 仮想ノードなしでは、負荷分散が不完全
  18. 18. 偏ったリング データが特定のノードに偏り 負荷分散にならない
  19. 19. ノードがダウン 落ちたノードの全データが一つ先のノードへ 移動 一つ先のノードの負荷が2倍 特定のノードに負荷が集中
  20. 20. ノードを追加 1つ先のノードからデータが移動 1つ先のノードの負荷しか減らない 負荷対策にならない
  21. 21. そこで仮想ノード
  22. 22. n1: h("n1"+0) => 25 n1: h("n1"+1) => 100 n1: h("n1"+2) => 90 n2: h("n2"+0) => 120 n2: h("n2"+1) => 45 n2: h("n2"+2) => 13 … ハッシュ関数 h でノードID+αを変換
  23. 23. リング状に配置 ノード数が増えれば均等に分散する確率が高くなる
  24. 24. ノード4が追加された場合 複数のノードから均等にデータが 移動してくる可能性が高い
  25. 25. ノード1がダウンした場合 ノード1のデータが複数のノードへ 均等に分散することが期待できる
  26. 26. メリット・デメリット
  27. 27. メリット データの割り当て先を自動で決定可能 データをクラスタに均等に分散できる ノードが落ちた時、自動で再割り当て 再割り当てのコストが小さい
  28. 28. デメリット 全てのノードが現在のクラスタの状態を正確に 知ってなければならない。 クラスタ状態の共有コストがかかる
  29. 29. まとめ
  30. 30. コンシステントハッシュを用いると プロセスが1つ2つ程度落ちても問題のない クラスタを構成できる 負荷分散についてエンジニアが手を動かす 必要がない 大規模な分散環境でも運用が楽 (かもしれない)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×