コンテンツへスキップ
uencoder

分散にコンシステントハッシングを使う

コンシステントハッシングは、サーバーの追加・削除時に再割り当てを最小限に抑えてキーをサーバーへ分散します。CDN や分散キャッシュで使われます。

  1. 1

    コンシステントハッシングは、キーとサーバーの両方をリング(0〜2^32-1)にマッピングします。キーは、リング上で時計回りに最初に現れるサーバーに割り当てられます。サーバーの追加や削除時に再マッピングされるのは、そのサーバーのセグメント内のキーだけです。ほとんどのキーは同じサーバーに留まります。これによりデータ移動が最小化されます。すべてを再マッピングする剰余ハッシングとは異なります。

  2. 2
    ハッシュ計算ツール →

    SHA-256 でサーバー ID とキーをリングにハッシュします。ハッシュがリング上の位置を決めます(0〜2^256-1、32 ビットリングなら mod 2^32)。キーのサーバーを見つけるには、キーをハッシュし、時計回りに次のサーバーを探します。より良い分布のために、仮想ノード(サーバーあたり 150〜200)を使ってください。

  3. 3
    SHA-3 / Keccak ハッシュ計算 →

    コンシステントハッシングには SHA-3-256 を使います。ハッシュ関数は高速で一様分布であるべきです。SHA-3 または SHA-256 が良い選択です。重要な性質:サーバーの追加/削除はキーの 1/n だけに影響します(n はサーバー数)。hash(key) % n のようにすべてのキーに影響するわけではありません。

よくある質問

仮想ノードとは何ですか?
各物理サーバーは、リング上の複数の位置(仮想ノード)にマッピングされます。これにより負荷分散が改善します。サーバーあたり 150 個の仮想ノードがあれば、サーバー容量が不均一でも負荷は約 10% 以内に収まります。仮想ノードがないと、サーバーの負荷はリング上の位置に依存し、偏ることがあります。
コンシステントハッシングはどこで使われていますか?
CDN(Akamai、Cloudflare)でのエッジサーバーへのリクエストルーティング、分散キャッシュ(Memcached、Redis Cluster)でのキー分散、データベース(Cassandra、DynamoDB)でのパーティション分散、ロードバランサーなどです。トポロジー変更時の再分散を最小限に抑えてサーバー間でデータを分散させる必要があるシステムすべてに当てはまります。

このタスクを解決するワークフロー

コンテンツのハッシュと Base64 エンコード
入力のハッシュを計算し、コンパクトな転送のためにハッシュダイジェストを Base64 としてエンコードする。
パイプライン
テキストのハッシュと整合性検証
入力テキストのハッシュを計算し、期待されるハッシュと比較して整合性を検証する。
パイプライン
テキストのハッシュと CRC32 チェックサム検証
データ整合性検証のために、暗号学的 SHA-256 ハッシュと CRC32 チェックサムの両方を計算する。
パイプライン
MD5 ハッシュ後に Base58 エンコード
MD5 ハッシュを計算し、コンパクトな表現のために Base58 としてエンコードする。
パイプライン
マルチハッシュ速度比較
入力をハッシュし、複数のハッシュアルゴリズムをベンチマークして速度と出力を比較する。
パイプライン
パスワード生成とハッシュ
ランダムパスワードを生成し、安全な保存のためにハッシュする。
パイプライン
SHA3-256 ハッシュと CRC32 チェックサム
SHA3-256 ハッシュを計算し、二重整合性検証のために CRC32 チェックサムを計算する。
パイプライン
SHA-512 ハッシュ後に Hex エンコード
SHA-512 ハッシュを計算し、可読性のために Hex としてエンコードする。
パイプライン
テキスト反転とハッシュ
テキストを反転し、その後反転結果の SHA-256 ハッシュを計算する。
パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。
パイプライン

関連ツール