全球多活使用限制

更新时间:2025-03-03 03:22:29

为保障实例的稳定和数据一致性,在使用全球多活功能时,有一些使用约束需要您注意。

使用限制

  • 子实例需满足以下条件:

    • 部署模式为经典

    • 存储介质为内存型

    • 架构为标准架构或集群架构。

    说明

    请确保各子实例规格一致,如需进行变配,建议对所有子实例均进行相同变配。若各子实例的规格不一致,可能会出现性能或容量问题。

  • 一个分布式实例中最多可包含三个子实例,且各子实例不能位于同一可用区。第一个子实例支持从已创建的实例进行转换,第二、第三个子实例需新购。

  • 一个分布式实例中的子实例必须都在中国内地或都在其他地域,若您需要在中国内地地域与其他地域之间进行数据同步,请使用DTS数据同步功能,更多信息请参见申请跨境数据同步权限

  • 成为分布式实例的子实例后,存在如下限制:

    • 不支持变更实例所属的可用区。

    • 不支持变更实例架构,例如从集群架构变更为标准架构等。

    • 集群实例变配时,单次仅支持变配分片数或分片规格,更多信息请参见分布式集群实例变配方案

同步命令限制

  • FLUSHDBFLUSHALL命令不会被同步。

    • 如需清空数据:需对所有子实例执行FLUSHALL命令,否则会造成数据不一致。

    • 如需重新同步:例如以A实例为源,重新对B实例进行同步,您需要在分布式实例中移除B实例、对B实例执行FLUSHALL命令,再重新将B实例接入分布式实例中,接入后即可自动重新同步。

  • PubSub命令不会被同步,如需实现跨域通知的消息复制,建议通过Stream数据结构来实现。

  • 同步RESTORE命令时,如果目标子实例具备相同的Key,则不会被执行。

  • 数据逐出(Evict)和数据过期(Expire)产生的DEL命令不会被同步。

同步粒度限制

目前同步的粒度为实例级,即子实例的所有数据都会被同步,暂不支持同步子实例中的部分数据。

说明

如需同步部分数据,需要通过业务逻辑来实现。

数据一致性限制

  • 单写场景下(例如用作灾备场景),数据的一致性级别为最终数据一致。以下情况可能导致数据不一致:

    • 由于同步延迟等原因,对带过期时间(TTL)的Key进行操作可能会导致数据不一致。例如在子实例A上成功执行了EXPIRE命令完成续期,但同步到子实例B时数据已过期等。如果对数据一致性要求较高,则不建议在全球多活实例中设置过期时间。

    • 各子实例中数据逐出的Key是相互独立、随机选择的。请确保内存占用不超过实例规格,以避免触发数据逐出。

  • 多写场景下(例如用作多活场景),业务上应避免多个子实例在同一时刻或相近的时间修改同一个Key,否则可能造成数据不一致(即无法保障Key的最终一致性)或者数据堆积(在Streaming场景下严格递增产生的冲突)。

    说明

    全球多活暂不支持CRDT(Conflict-Free Replicated Data Type)约束,您需要从业务层面自行保障。

    不一致情况

    图示

    说明

    不一致情况

    图示

    说明

    Key续期失败

    image
    1. t1时刻,子实例 A 和 B都持有带过期时间的Key,该Key将于t3时刻过期。

    2. t2时刻,子实例A执行PEXPIREAT命令将该Key续期至t5时刻。

    3. t3时刻,由于网络延迟等原因,子实例B尚未收到来自子实例APEXPIREAT同步命令,此时子实例B中的Key因过期被删除。

    4. t4时刻,子实例B收到该Key的续期命令,但Key已被过期删除,故续期命令执行失败。此时,子实例A仍持有Key,子实例B中的Key已丢失。

    因过期时间导致命令执行结果不一致

    image

    SMOVE命令为例。

    1. t1时刻,子实例AB均持有Key1(将于t3时刻过期)、Key2(未设置过期时间)。

    2. t2时刻,子实例A执行SMOVE Key1 Key2 "foo"命令,将"foo"成员移动至Key2中。

    3. t3时刻,由于网络延迟等原因,子实例B尚未收到来自子实例A的同步命令。同时,子实例AB中的Key1因过期被删除。

    4. t4时刻,子实例B收到SMOVE命令,但由于Key1已被过期删除,SMOVE命令执行失败。此时子实例A中的Key2包含“foo”成员,但子实例B中的Key2不包含“foo”成员。

    数据随机逐出

    image
    1. t1时刻,子实例AB均持有Key1、Key2。

    2. t2时刻,子实例A内存占满,触发数据逐出,随机删除Key2。

    3. t3时刻,子实例B内存占满,触发数据逐出,随机删除Key1。

    由于默认数据逐出策略是volatile-lru,且数据逐出的删除操作不会同步,因此子实例AB数据不一致。

    多写-Value互换

    image

    多个子实例同时对同一个Key进行写操作,可能导致数据不一致。

    1. t1时刻,子实例A写入Key:ValA

    2. t2时刻,子实例B写入Key:ValB

    3. t3时刻,子实例A向子实例B同步数据(Key:valA),同时子实例B向子实例A同步数据(Key:valB)。

      两个子实例中Key对应的值发生了互换。

    多写-数据类型冲突

    image
    1. t1时刻,子实例A写入Key,为Hash数据类型。

    2. t2时刻,子实例B写入Key,为String数据类型。

    3. t3时刻同步命令时,会因数据类型冲突而导致失败。

    多写-写入条件不满足

    image
    1. t1时刻,子实例A写入SETNX Key ValA

    2. t2时刻,子实例B写入SETNX Key ValB

    3. t3时刻同步命令时,会因不满足写入条件而导致同步失败。

    说明

    HSETNX、SET[NX | XX]等命令也会造成类似问题。

    多写-乱序或丢失

    image
    1. t1时刻,子实例A写入RPUSH Key valA

    2. t2时刻,子实例B写入RPUSH Key valB

    3. t3时刻同步命令时,会导致数据乱序或丢失。

    说明

    LPUSH、APPEND、DEL、HDEL、INCR、XADD等系列命令也会造成类似问题。

  • 本页导读 (1)
  • 使用限制
  • 同步命令限制
  • 同步粒度限制
  • 数据一致性限制