Redis Cluster の概要
Redis Cluster は、複数の Redis ノード間でのデータ共有を提供するアセンブリです。
Redis クラスターは、複数のキーを処理するコマンドをサポートしていません。複数のキーを処理するには、異なるノード間でデータを移動する必要があるため、Redis と同じパフォーマンスを達成できず、高負荷状態では予測不可能な状態が発生する可能性があります。エラー。
Redis クラスターはパーティショニングを通じてある程度の可用性を提供し、実際の環境でノードがダウンしているかアクセスできない場合でもコマンドの処理を続行します。Redis クラスターの利点:
データを異なるノードに自動的に分割します。
クラスター全体の一部のノードに障害が発生したり、到達不能になったりした場合でも、コマンドの処理を続行できます。
Redis クラスターのデータ シャーディング
Redis クラスターは一貫したハッシュを使用しませんが、ハッシュ スロットの概念を導入します。
Redis クラスターは 16384 個ありますハッシュ スロット。各キーは CRC16 によってチェックされ、どのスロットを配置するかを決定するためにモジュロ 16384 が使用されます。クラスタ内の各ノードは、ハッシュ スロットの一部を担当します。たとえば、現在のクラスタに 3 つのノードがある場合、次のようになります。
ノード A にはハッシュ スロット 0 ~ 5500 が含まれます。
ノード B にはハッシュ スロット 5501 ~ 11000 が含まれます。
ノード C にはハッシュ スロット 11001 ~ 16384 が含まれます。
この構造により、ノードの追加または削除が簡単になります。たとえば、新しいノード D を追加したい場合は、ノード A、B、C から D にいくつかのスロットを取得する必要があります。ノード A を削除したい場合は、 A のスロットをノード B と C に移動してから、クラスターからスロットのない A ノードを削除する必要があります。ハッシュ スロットをあるノードから別のノードに移動してもサービスは停止しないため、追加、削除に関係なく、またはノードのハッシュ スロットの数を変更しても、クラスターが使用できなくなることはありません。
Redis クラスターのマスター/スレーブ レプリケーション モデル
一部のノードに障害が発生した場合、またはほとんどのノードが通信できなくなった場合でもクラスターを引き続き使用できるようにします。クラスターはマスター/スレーブ レプリケーション モデルを使用し、各ノードには N-1 個のレプリカが存在します。
この例では、3 つのノードを持つクラスターの場合A、B、C にレプリケーション モデルがない場合、ノード B に障害が発生すると、クラスター全体が 5501 ~ 11000 の範囲のスロットが不足していると判断し、使用できなくなります。
ただし、スレーブを追加すると、クラスターの作成時 (または一定期間後) に、ノード A1、B1、C1 を各ノードに接続すると、クラスター全体が 3 つのマスター ノードと 3 つのスレーブ ノードで構成されます。このようにして、ノード B に障害が発生した後、クラスターはサービスを継続するための新しいマスター ノードとして B1 を選択すると、スロットが見つからないためにクラスター全体が使用できなくなることはありません。
ただし、B と B1 の両方に障害が発生すると、クラスターは使用できなくなります。
Redis の一貫性保証
Redis はデータの強力な一貫性を保証しません。これは、実際には、特定の条件下でクラスターが書き込み操作を失う可能性があることを意味します。
1 つ目の理由は、クラスターが非同期レプリケーションを使用しているためです。書き込み操作プロセス:
クライアントはマスター ノード B にコマンドを書き込みます。
マスター ノード B はクライアントに書き込みます。コマンド ステータスに応答します。 .
マスター ノードは、書き込み操作をスレーブ ノード B1、B2、および B3 にコピーします。
マスター ノードによるコマンドの複製は、コマンド応答が返された後に発生します。コマンド リクエストはレプリケーション操作が完了するまで待つ必要があるため、マスター ノードがコマンド リクエストを処理する速度が大幅に低下します。パフォーマンスと一貫性の間でトレードオフを行う必要があります。注: Redis Cluster は将来、同期書き込みメソッドを提供する可能性があります。 Redis クラスターがコマンドを失う可能性があるもう 1 つの状況は、クラスターにネットワーク パーティションがあり、クライアントが少なくとも 1 つのマスター ノードを含む少数のインスタンスから分離されている場合です。
たとえば、クラスターに 6 つのノード A、B、C、A1、B1、および C1 が含まれており、そのうち A、B、および C がマスター ノードであり、A1、B1、および C1 がマスター ノードであると仮定します。ノード A、B、C のスレーブとクライアント Z1。クラスタ内でネットワーク分割が発生したと仮定すると、クラスタは 2 つのパーティに分割される可能性があります。多数派にはノード A、C、A1、B1、および C1 が含まれます。小規模なパーティにはノード B とクライアントが含まれます。エンド Z1.
Z1 は引き続きマスター ノード B に書き込むことができます。ネットワークの分割が短時間発生した場合、クラスタは正常に動作し続けます。分割時間が発生した場合、クラスタは正常に動作し続けます。この長さは、ほとんどの当事者が B1 を新しいマスターとして選択するのに十分な長さです。そうすると、Z1 によって B に書き込まれたデータは失われます。
以上がRedisクラスターとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。