インスタンスの安定性とデータの一貫性を確保するには、グローバル分散キャッシュ機能を使用する場合、このトピックで説明されている制限に注意する必要があります。
制限事項
各子インスタンスは、次の要件を満たす必要があります。
インスタンスはクラシックモードでデプロイされています。
インスタンスはDRAMベースのインスタンスです。
インスタンスは標準またはクラスターアーキテクチャを使用します。
説明各子インスタンスの仕様が同じであることを確認してください。 子インスタンスの仕様を変更する場合は、他のすべての子インスタンスを同じ仕様に変更することを推奨します。 分散インスタンスの子インスタンスの仕様がすべて同じでない場合、パフォーマンスまたは容量の問題が発生する可能性があります。
分散インスタンスには最大3つの子インスタンスを含めることができ、子インスタンスを同じゾーンに配置することはできません。 最初の子インスタンスは、既存のインスタンスから変換できます。 2番目と3番目の子インスタンスは、新しく購入したインスタンスである必要があります。
分散インスタンスのすべての子インスタンスは、中国本土に存在するか、中国本土以外のリージョンに存在する必要があります。 中国本土のデータを中国本土以外のリージョンに同期する場合は、data Transmission Service (DTS) を使用します。 詳細については、「境界を越えてデータを同期するための権限の申請」をご参照ください。
分散インスタンスの子インスタンスには、次の制限があります。
インスタンスのゾーンを変更することはできません。 詳細については、「ゾーン間のインスタンスの移行」をご参照ください。
インスタンスのアーキテクチャを、たとえばクラスターアーキテクチャから標準アーキテクチャに変更することはできません。
クラスターインスタンスの設定を変更すると、シャードの仕様または数を調整できます。 詳細については、「」をご参照ください。クラシック (ローカルディスクベース) クラスターインスタンスの設定を変更できないのはなぜですか。
同期できるコマンドの制限
FLUSHDBまたはFLUSHALLコマンドは同期できません。
データをクリアするには、すべての子インスタンスでFLUSHALLコマンドを実行する必要があります。 それ以外の場合、データの不一致が発生します。
たとえば、インスタンスAからインスタンスBにデータを再同期するには、分散インスタンスからインスタンスBを削除し、インスタンスBでFLUSHALLコマンドを実行してから、インスタンスBを分散インスタンスに再接続する必要があります。
PubコマンドとSubコマンドは同期できません。 ドメイン間で通知メッセージを複製するには、Streamデータ構造を使用することを推奨します。
ターゲットインスタンスに同期されたRESTOREコマンドは、ターゲットインスタンスに指定されたキーと同じ名前のキーが含まれていない場合にのみ実行できます。
同期粒度の制限
データはインスタンスレベルで同期されます。 言い換えれば、各子インスタンスのデータは、全体として同期されなければならない。 グローバル分散キャッシュは、子インスタンスのデータの一部のみを別の子インスタンスに同期することはできません。
子インスタンスの一部のデータのみを同期する必要がある場合は、ビジネスロジックを変更できます。
データの一貫性に関する制限
ディザスタリカバリシナリオなど、1つの子インスタンスが書き込み可能なシナリオでは、最終的なデータはすべての子インスタンスで一貫しています。
アクティブなgeo冗長性シナリオなど、複数の子インスタンスが書き込み可能なシナリオでは、ビジネスシステムが複数の子インスタンスの同じキーを同時に、または短い間隔で変更しないようにします。 そうしないと、グローバル分散キャッシュは、キーの最終値が各子インスタンスで同じであることを保証できず、増分ストリーミングシナリオ中にデータが子インスタンスに蓄積される可能性があります。 次の表に、発生する可能性のあるデータの不一致の種類を示します。
説明グローバル分散キャッシュは、競合のないレプリケートデータ型 (CRDT) をサポートしていません。 ビジネスシステムでデータの一貫性を確保する必要があります。
不一致
イラスト
説明
値スワップ
子インスタンスAは、時点1.1でキーの値をvalue_Aに設定するSETコマンドを受け取り、時点1.2でその値をデータベースに書き込む。
子インスタンスBは、時点2.1で同じキーの値をvalue_Bに設定するSETコマンドを受け取り、時点2.2でその値をデータベースに書き込む。
時点3.1で、子インスタンスAは、キーの値がvalue_Aであるデータを子インスタンスBに同期させ、同じ時点で、子インスタンスBは、キーの値がvalue_Bであるデータを子インスタンスAに同期させる。
同期が完了すると、キーの値は2つの子インスタンスで交換されます。
アウトオブオーダーデータまたはデータ損失
子インスタンスAは、時点1.1でキーによって指定されたリストにvalue_AをプッシュするためのRPUSHコマンドを受け取り、時点1.2でその値をデータベースに書き込む。
子インスタンスBは、時点2.1で同じキーによって指定されたリストにvalue_BをプッシュするためのRPUSHコマンドを受け取り、時点2.2でデータベースに値を書き込む。
3.1の時点で、子インスタンスAは、value_Aがキーで指定されたリストにプッシュされたデータを子インスタンスBに同期させ、同時に、子インスタンスBは、value_Bがキーで指定されたリストにプッシュされたデータを子インスタンスAに同期させる。
同期が完了すると、リスト内の値は2つの子インスタンスのそれぞれで異なる順序になります。 コマンドの出力が、コマンドが実行されるキーの元の値に依存する場合、コマンドが子インスタンス間で同期された後、データが故障したり、データが失われたりする可能性があります。
説明LPUSH
、LPOP
、APPEND
、SORT (STORE)
、DEL
、HDEL
、INCR
、XADD
などの他のコマンドでも同じ問題が発生する可能性があります。
不一致型
子インスタンスAは、時点1.1でキーをハッシュ型の値に設定するコマンドを受け取り、時点1.2でその値をデータベースに書き込む。
子インスタンスBは、時点2.1で同じキーを文字列型の値に設定するコマンドを受け取り、時点2.2でその値をデータベースに書き込む。
時点3において、子インスタンスAおよび子インスタンスBは、互いにデータを同期する。 データ同期中に競合が発生します。
書き込み条件が満たされていない
子インスタンスAは、時点1.1でキーの値をvalue_Aに設定するためのSETNXコマンドを受け取り、時点1.2でその値をデータベースに書き込む。
子インスタンスBは、時点2.1で同じキーの値をvalue_Bに設定するためのSETNXコマンドを受け取り、時点2.2でその値をデータベースに書き込む。
時点3において、子インスタンスAおよび子インスタンスBは、互いにデータを同期する。 データ同期中に競合が発生します。
説明SET(NX | XX)
やHSETNX
などの他のコマンドでも同じ問題が発生する可能性があります。