パーティショニングは、各インスタンスにすべてのキーのサブセットのみが含まれるように、データを複数の Redis インスタンスに分割するプロセスです。この記事の最初の部分ではシャーディングの概念を紹介し、次の部分では Redis シャーディングのオプションを示します。
シャーディングでできること
Redis のシャーディングには 2 つの主な目標があります:
1. 使用を許可する 多くのコンピューターには、メモリを組み合わせて大規模なデータベースをサポートします。シャーディングを使用しない場合、1 台のマシンがサポートできるメモリ量が制限されます。
2. コンピューティング能力を複数のコアまたは複数のサーバーに拡張したり、ネットワーク帯域幅を複数のサーバーまたは複数のネットワーク アダプターに拡張したりできます。
シャーディングの基本
シャーディングにはさまざまな基準があります。 4 つの Redis インスタンス R0、R1、R2、R3 と、user:1、user:2 などのユーザーを表す多数のキーがあるとします。どのインスタンスに保存する特定のキーを選択するかについては、さまざまな方法を見つけることができます。 。言い換えれば、キーを特定の Redis サーバーにマップするにはさまざまな方法があります。
シャーディングを実行する最も簡単な方法の 1 つは範囲パーティショニングです。これは、オブジェクトの範囲を指定された Redis インスタンスにマッピングすることでシャーディングを完了します。たとえば、ユーザーがインスタンス R0 に ID 0 から ID 10000 に入力し、ユーザーがインスタンス R1 に ID 10001 から ID 20000 に入力する、などと想定できます。
このアプローチは機能し、実際に実際に使用されていますが、範囲をインスタンスにマップするテーブルが必要であるという欠点があります。このテーブルは管理する必要があり、さまざまな種類のオブジェクトにテーブルが必要であるため、範囲シャーディングは代替シャーディングよりも効率がはるかに低いため、Redis では推奨されないことがよくあります。
範囲シャーディングの代替手段は、ハッシュ パーティショニングです。このモードはどのキーでも機能し、キーが object_name: の形式である必要はなく、次のように簡単です:
1. ハッシュ関数 (例: crc32 ハッシュ関数) を使用して変換しますキー名を数値に変換します。たとえば、キーが foobar の場合、crc32(foobar) は 93024922 のようなものを出力します。
2.このデータをモジュロして 0 から 3 までの数値に変換し、この数値を 4 つの Redis インスタンスの 1 つにマッピングできるようにします。 93024922 モジュロ 4 は 2 に等しいため、キー foobar は R2 インスタンスに保存される必要があることがわかります。注: モジュロ演算は除算演算の余りを返します。これは多くのプログラミング言語では常に % 演算子として実装されます。
これら 2 つの例からわかるように、シャーディングには他にも多くの方法があります。ハッシュ シャーディングの高度な形式はコンシステント ハッシュと呼ばれ、一部の Redis クライアントとブローカーによって実装されます。
シャーディングのさまざまな実装
シャーディングは、ソフトウェア スタックのさまざまな部分で実行できます。
1. クライアント側のパーティショニングとは、クライアントが指定されたキーの書き込みと読み取りを行う正しいノードを直接選択することを意味します。多くの Redis クライアントはクライアント側シャーディングを実装しています。
2. プロキシ支援パーティショニングとは、クライアントが Redis インスタンスにリクエストを直接送信するのではなく、Redis プロトコルを理解できるプロキシにリクエストを送信することを意味します。プロキシは、構成されたシャーディング モードに従ってリクエストが正しい Redis インスタンスに確実に転送され、クライアントに応答を返します。 Redis および Memcached のプロキシである Twemproxy は、プロキシ支援シャーディングを実装します。
3. クエリ ルーティングとは、クエリをランダムなインスタンスに送信でき、このインスタンスによってクエリが正しいノードに確実に転送されることを意味します。 Redis Cluster は、クライアントの助けを借りてハイブリッド形式のクエリ ルーティングを実装します (リクエストはある Redis インスタンスから別の Redis インスタンスに直接転送されませんが、クライアントは正しいノードへのリダイレクトを受け取ります)。
#シャーディングの欠点
Redis の一部の機能はシャーディングとうまく連携できません: 1. 複数のキーを伴う操作通常はサポートされていません。たとえば、2 つの異なる Redis インスタンスにマップされたキーに対して交差を実行することはできません (実際には交差を実行する方法はありますが、直接実行することはできません)。 2. 複数のキーを含むトランザクションは使用できません。 3. シャーディングの粒度が重要であるため、大規模な順序セットなどのデータ セットをシャーディングするために大きなキーを使用することはできません。 4. シャーディングを使用すると、複数の RDB/AOF ファイルを処理する必要があるなど、データ処理がより複雑になります。データをバックアップする場合、複数のインスタンスやホストから永続ファイルを集約する必要があります。 5. 容量の追加と削除も複雑です。たとえば、Redis Cluster には実行時にノードを動的に追加および削除してデータの透過的な再バランスをサポートする機能がありますが、クライアント側のシャーディングやプロキシなどの他の方法はこの機能をサポートしていません。ただし、この時点で役立つプリシャーディングと呼ばれるテクノロジーがあります。データ ストレージまたはキャッシュ
Redis シャーディングは、Redis がデータ ストレージとして使用されるかキャッシュとして使用されるかにかかわらず、概念的には同じですが、データとして使用される場合には重要な制限があります。保管に関しては。 Redis がデータ ストアとして使用される場合、特定のキーは常に同じ Redis インスタンスにマップされます。 Redis をキャッシュとして使用する場合、あるノードが使用できずに別のノードが使用されても大きな問題にはなりません。キーとインスタンスのマッピングを希望に応じて変更することで、システムの可用性 (つまり、システムの機能) が向上します。私たちの質問に答えてください)。
一貫性のあるハッシュの実装では、特定のキーの優先ノードが使用できない場合に、他のノードに切り替えることができます。同様に、新しいノードを追加すると、一部のデータがこの新しいノードに保存され始めます。
ここでの主な概念は次のとおりです:
1. Redis をキャッシュとして使用する場合、コンシステント ハッシュを使用してスケールアップおよびスケールダウンを簡単に実現できます。
2. Redis をストレージとして使用する場合は、固定のキーとノードのマッピングを使用するため、ノードの数は固定する必要があり、変更できません。それ以外の場合、ノードを追加または削除するときは、ノード間のキーの再調整をサポートするシステムが必要です。現在、これを実行できるのは Redis Cluster だけですが、Redis Cluster はまだベータ段階にあり、運用環境での使用はまだ検討されていません。
プレシャーディング
シャーディングに問題があることはすでにわかっています。Redis をキャッシュとして使用しない限り、ノードの追加と削除は行われません。やり方は難しいですが、固定キーとインスタンス マッピングを使用する方がはるかに簡単です。
ただし、データ ストレージのニーズは常に変化している可能性があります。現在は 10 個の Redis ノード (インスタンス) で生活できますが、明日は 50 個のノードが必要になる可能性があります。
Redis はメモリ使用量が比較的小さく、軽量であるため (アイドル状態のインスタンスは 1 MB のメモリのみを使用します)、簡単な解決策は、最初から多数のインスタンスを起動することです。 1 台のサーバーだけで開始した場合でも、初日に分散世界に住むことを決定し、シャーディングを使用して 1 台のサーバーで複数の Redis インスタンスを実行できます。
最初から多数のインスタンスを選択できます。たとえば、32 または 64 のインスタンスはほとんどのユーザーを満足させ、将来の拡張に十分な余地を提供します。
これにより、データ ストレージの拡大が必要になり、さらに多くの Redis サーバーが必要になった場合に、インスタンスをあるサーバーから別のサーバーに移動するだけで済みます。最初のサーバーを追加するときは、Redis インスタンスの半分を最初のサーバーから 2 番目のサーバーに移動する必要があります。
Redis レプリケーションを使用すると、ダウンタイムをほとんどまたはまったく発生させずにデータを移動できます:
1. 新しいサーバーで空のインスタンスを開始します。
2. データを移動し、新しいインスタンスをソース インスタンスのスレーブ サービスとして設定します。
3. クライアントを停止します。
4. 移動されたインスタンスのサーバー IP アドレス構成を更新します。
5. 新しいサーバー上のスレーブ ノードに SLAVEOF NO ONE コマンドを送信します。
6.新しく更新された構成でクライアントを起動します。
7. 最後に、古いサーバーで使用されなくなったインスタンスを閉じます。
Redis シャーディングの実装
Redis クラスターは、自動シャーディングと高可用性を実現するための推奨される方法です。まだ完全には実稼働環境では利用できませんが、ベータ段階に入っています。
Redis Cluster が利用可能になり、Redis Cluster をサポートするクライアントが利用可能になると、Redis Cluster は Redis シャーディングの事実上の標準になります。
Redis クラスターは、クエリ ルーティングとクライアント シャーディングのハイブリッド モデルです。
Twemproxy は Twitter によって開発されたプロキシで、Memcached ASCII および Redis プロトコルをサポートします。これはシングルスレッドで C で書かれており、非常に高速に実行されます。これは、Apache 2.0 ライセンスに基づいてライセンス供与されたオープン ソース プロジェクトです。
Twemproxy は、複数の Redis インスタンスにわたる自動シャーディングをサポートし、ノードが使用できない場合のオプションのノード除外サポートをサポートします (これにより、インスタンスへのキーのマッピングが変更されるため、Redis をキャッシュとしてのみ使用する必要があります。この機能のみを使用してください)。 。
複数のプロキシを起動し、接続を受け入れる最初のプロキシにクライアントを接続させることができるため、これは単一障害点ではありません。
Twemproxy の代替手段は、一貫性のあるハッシュまたは他の同様のアルゴリズムを通じてクライアント側のシャーディングを実装するクライアントを使用することです。 redis-rb や Predis など、コンシステント ハッシュをサポートする Redis クライアントがいくつかあります。
redis についてさらに詳しく知りたい場合は、redis データベース チュートリアル 列に注目してください。
以上がRedisシャーディングの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。