分散にコンシステントハッシングを使う
コンシステントハッシングは、サーバーの追加・削除時に再割り当てを最小限に抑えてキーをサーバーへ分散します。CDN や分散キャッシュで使われます。
- 1
コンシステントハッシングは、キーとサーバーの両方をリング(0〜2^32-1)にマッピングします。キーは、リング上で時計回りに最初に現れるサーバーに割り当てられます。サーバーの追加や削除時に再マッピングされるのは、そのサーバーのセグメント内のキーだけです。ほとんどのキーは同じサーバーに留まります。これによりデータ移動が最小化されます。すべてを再マッピングする剰余ハッシングとは異なります。
- 2 ハッシュ計算ツール →
SHA-256 でサーバー ID とキーをリングにハッシュします。ハッシュがリング上の位置を決めます(0〜2^256-1、32 ビットリングなら mod 2^32)。キーのサーバーを見つけるには、キーをハッシュし、時計回りに次のサーバーを探します。より良い分布のために、仮想ノード(サーバーあたり 150〜200)を使ってください。
- 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 ハッシュを計算する。 パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。 パイプライン