Redis パーティショニング
パーティショニングとは、データを複数のRedisインスタンスに分割するプロセスのことであり、各インスタンスはkeyのサブセットのみを保持します。
パーティショニングの利点
- 複数台のコンピュータのメモリの合計を利用することで、より大きなデータベースを構築できます。
- マルチコアと複数台のコンピュータにより、計算能力を拡張できます。また、複数台のコンピュータとネットワークアダプタにより、ネットワーク帯域幅を拡張できます。
パーティショニングの欠点
Redisのいくつかの機能は、パーティショニングの面ではあまりうまく機能しません:
- 複数のkeyに関連する操作は、通常サポートされていません。例えば、2つのsetが異なるRedisインスタンスにマッピングされている場合、これら2つのsetに対して交差操作を実行することはできません。
- 複数のkeyに関連するRedisトランザクションは使用できません。
- パーティショニングを使用する場合、データ処理は比較的複雑になります。例えば、複数のrdb/aofファイルを処理し、複数のインスタンスとホストから永続化ファイルをバックアップする必要があります。
- 容量の追加や削除も比較的複雑です。Redisクラスタのほとんどは、実行時にノードを追加・削除する透過的なデータバランシング機能をサポートしていますが、クライアント側パーティショニングやプロキシなどの他のシステムはこの機能をサポートしていません。ただし、preshardingと呼ばれる技術はこれに役立ちます。
パーティショニングの種類
Redisには2種類のパーティショニングがあります。4つのRedisインスタンスR0、R1、R2、R3と、user:1、user:2のようなユーザーを表す複数のkeyがあるとします。特定のkeyに対して、そのkeyをどのインスタンスに格納するかを選択する方法は複数あります。つまり、あるkeyをあるRedisサービスにマッピングするための異なるシステムがあるということです。
範囲パーティショニング
最も簡単なパーティショニング方法は範囲パーティショニングです。これは、一定範囲のオブジェクトを特定のRedisインスタンスにマッピングします。
例えば、IDが0から10000までのユーザーはインスタンスR0に保存され、IDが10001から20000までのユーザーはR1に保存され、以下同様です。
この方法は実現可能で、実際にも使用されていますが、欠点は、範囲からインスタンスへのマッピングテーブルが必要なことです。このテーブルを管理し、さらにさまざまなオブジェクトのマッピングテーブルも必要となるため、通常はRedisにとって良い方法とは言えません。
ハッシュパーティショニング
もう1つのパーティショニング方法はハッシュパーティショニングです。これは任意のkeyに適用でき、object_name: という形式である必要もありません。
- ハッシュ関数を使用してkeyを数値に変換します。例えば、crc32ハッシュ関数を使用します。key foobarに対してcrc32(foobar)を実行すると、93024922のような整数が出力されます。
- この整数に対して剰余演算を行い、0〜3の間の数値に変換すると、この整数を4つのRedisインスタンスのいずれかにマッピングできます。93024922 % 4 = 2、つまりkey foobarはR2インスタンスに格納されるべきです。注意:剰余演算は除算の余りを求める操作であり、通常は多くのプログラミング言語で%演算子を使用して実装されます。