グローバル分散キャッシュ 機能を使用する場合は、インスタンスの安定性とデータの整合性を確保するために、このトピックで説明されている制限事項に注意する必要があります。
使用上の注意
各サブインスタンスは、DRAM ベースのインスタンスである必要があります。
各サブインスタンスの仕様が同じであることを確認してください。 サブインスタンスの仕様を変更する場合は、他のすべてのサブインスタンスも同じ仕様に変更することをお勧めします。 分散インスタンス内のサブインスタンスの仕様がすべて同じでない場合、パフォーマンスまたは容量の問題が発生する可能性があります。
分散インスタンスには最大 3 つのサブインスタンスを含めることができ、サブインスタンスを同じゾーンに配置することはできません。 最初のサブインスタンスは、既存のインスタンスから変換できます。 2 番目と 3 番目のサブインスタンスは、新しく購入したインスタンスである必要があります。
分散インスタンスのすべてのサブインスタンスは、中国本土にあるか、中国本土以外のリージョンにある必要があります。 中国本土から中国本土以外のリージョンにデータを同期する場合は、Data Transmission Service ( DTS ) を使用します。 詳細については、「国境を越えたデータの同期のための権限を申請する」をご参照ください。
分散インスタンスのサブインスタンスには、次の制限があります。
インスタンスのゾーンを変更することはできません。
インスタンスのアーキテクチャ ( クラスタアーキテクチャから標準アーキテクチャなど ) を変更することはできません。
クラスタインスタンスの構成を変更する場合、シャードの仕様またはシャードの数を調整できます。 詳細については、「クラシック ( ローカルディスクベース ) クラスタインスタンスの構成を変更できないのはなぜですか?」をご参照ください。
同期可能なコマンドの制限
FLUSHDB または FLUSHALL コマンドは同期できません。
データをクリアするには、すべてのサブインスタンスで FLUSHALL コマンドを実行する必要があります。 そうしないと、データの不整合が発生します。
データを再同期するには ( インスタンス A からインスタンス B など ) 、分散インスタンスからインスタンス B を削除し、インスタンス B で FLUSHALL コマンドを実行してから、インスタンス B を分散インスタンスに再接続する必要があります。
Pub および Sub コマンドは同期できません。 ドメイン間で通知メッセージを複製するには、Stream データ構造を使用することをお勧めします。
宛先インスタンスに同期される RESTORE コマンドは、宛先インスタンスに指定されたものと同じ名前のキーが含まれていない場合にのみ実行できます。
データエビクションと有効期限によって生成された DEL コマンドは同期されません。
同期粒度の制限
データはインスタンスレベルで同期されます。 つまり、各サブインスタンスのデータは全体として同期する必要があります。 グローバル分散キャッシュは、サブインスタンスの一部のデータのみを別のサブインスタンスに同期することはできません。
サブインスタンスの一部のデータのみを同期する場合は、ビジネスロジックを変更できます。
データ整合性の制限
ディザスタリカバリシナリオなど、1 つのサブインスタンスが書き込み可能であるシナリオでは、最終データはすべてのサブインスタンスで一致している必要があります。 データの不整合は、次の状況で発生する可能性があります。
指定された Time To Live ( TTL ) を持つキーに対して実行された操作は、同期遅延などの理由により、データの不整合を引き起こす可能性があります。 たとえば、EXPIRE コマンドがサブインスタンス A で正常に実行されてキーが更新されますが、サブインスタンス B に同期されるときにデータの有効期限が切れています。 高いデータ整合性が必要な場合は、グローバル分散キャッシュインスタンスに TTL を指定しないことをお勧めします。
各サブインスタンスのデータエビクションのキーは独立しており、ランダムに選択されます。 データエビクションがトリガーされないように、メモリ使用量がインスタンスの仕様を超えないようにしてください。
アクティブ地理的冗長性シナリオなど、複数のサブインスタンスが書き込み可能であるシナリオでは、業務システムが複数のサブインスタンスで同じキーを同時に、または短い間隔で変更しないようにしてください。 そうしないと、グローバル分散キャッシュは各サブインスタンスでキーの最終値が同じであることを保証できず、厳密な単調性のために競合が発生する可能性のあるストリーミングシナリオでは、サブインスタンスにデータが蓄積される可能性があります。 次の表に、発生する可能性のあるデータの不整合の種類を示します。
説明グローバル分散キャッシュ は、競合のない複製データ型 ( CRDT ) をサポートしていません。 業務システムでデータの整合性を確保する必要があります。
不整合
図
説明
キーの更新に失敗しました
時点 1 では、サブインスタンス A と B は、指定された TTL を持つキーを保持しています。 キーは時点 3 で期限切れになります。
時点 2 で、サブインスタンス A は PEXPIREAT コマンドを実行して、キーを時点 5 に更新します。
時点 3 で、サブインスタンス B は、ネットワーク遅延が原因で、サブインスタンス A から PEXPIREAT 同期コマンドを受信しません。 同時に、サブインスタンス B のキーは有効期限が切れたために削除されます。
時点 4 で、サブインスタンス B はキーの拡張コマンドを受信しますが、キーは有効期限が切れたために削除されます。 そのため、拡張コマンドは実行に失敗します。 この場合、サブインスタンス A は引き続きキーを保持し、サブインスタンス B のキーは失われます。
TTL によるコマンド実行結果の不整合
次の例では、SMOVE コマンドを使用しています。
時点 1 では、サブインスタンス A と B は Key1 と Key2 を保持しています。 Key1 は時点 3 で期限切れになり、Key2 は TTL が構成されていません。
時点 2 で、サブインスタンス A は
SMOVE Key1 Key2 "foo"コマンドを実行して、"foo" メンバーを Key2 に移動します。時点 3 で、サブインスタンス B は、ネットワーク遅延などの理由により、サブインスタンス A から同期コマンドを受信しません。 同時に、サブインスタンス A と B の Key1 は有効期限が切れたために削除されます。
時点 4 で、サブインスタンス B は SMOVE コマンドを受信しますが、Key1 は有効期限が切れたために削除されているため、SMOVE コマンドは実行に失敗します。 この場合、サブインスタンス A の Key2 には "foo" メンバーが含まれていますが、サブインスタンス B の Key2 には "foo" メンバーが含まれていません。
ランダムデータエビクション
時点 1 では、サブインスタンス A と B は Key1 と Key2 を保持しています。
時点 2 で、サブインスタンス A のメモリが使い果たされ、データエビクションがトリガーされ、Key2 がランダムに削除されます。
時点 3 で、サブインスタンス B のメモリが使い果たされ、データエビクションがトリガーされ、Key1 がランダムに削除されます。
デフォルトのデータエビクションポリシーは volatile-lru であり、データエビクション中の削除操作は同期されません。 そのため、サブインスタンス A と B のデータは一致しません。
複数のサブインスタンスへのデータ書き込み - 値のスワップ
キーが複数のサブインスタンスに同時に書き込まれた場合、データが不整合になる可能性があります。
時点 1 で、
Key:valAがサブインスタンス A に書き込まれます。時点 2 で、
Key:valBがサブインスタンス B に書き込まれます。時点 3 で、サブインスタンス A は
Key:valAをサブインスタンス B に同期します。 同時に、サブインスタンス B はKey:valBをサブインスタンス A に同期します。同期が完了すると、2 つのサブインスタンス間でキーの値がスワップされます。
複数のサブインスタンスへのデータ書き込み - データ型の不整合
時点 1 で、Hash データ型の
Keyがサブインスタンス A に書き込まれます。時点 2 で、String データ型の
Keyがサブインスタンス B に書き込まれます。時点 3 で同期コマンドが実行されると、データ型の競合が原因でエラーが発生します。
複数のサブインスタンスへのデータ書き込み - 書き込み条件が満たされない
時点 1 で、
SETNX Key valAがサブインスタンス A に書き込まれます。時点 2 で、
SETNX Key valBがサブインスタンス B に書き込まれます。時点 3 で同期コマンドが実行されると、書き込み条件が満たされないため、エラーが発生します。
説明HSETNX や SET[NX | XX] などのコマンドも同様の問題を引き起こします。
複数のサブインスタンスへのデータ書き込み - データの順序が正しくない、またはデータが失われる
時点 1 で、
RPUSH Key valAがサブインスタンス A に書き込まれます。時点 2 で、
RPUSH Key valBがサブインスタンス B に書き込まれます。時点 3 で同期コマンドが実行されると、データの順序が正しくなくなったり、データが失われたりします。
説明LPUSH、APPEND、DEL、HDEL、INCR、XADD などのコマンドも同様の問題を引き起こします。