为保障实例的稳定和数据一致性,在使用全球多活功能时,有一些使用约束需要您注意。
使用限制
子实例需满足以下条件:
部署模式为经典。
存储介质为内存型。
架构为标准架构或集群架构。
请确保各子实例规格一致,如需进行变配,建议对所有子实例均进行相同变配。若各子实例的规格不一致,可能会出现性能或容量问题。
一个分布式实例中最多可包含三个子实例,且各子实例不能位于同一可用区。第一个子实例支持从已创建的实例进行转换,第二、第三个子实例需新购。
一个分布式实例中的子实例必须都在中国内地或都在其他地域,若您需要在中国内地地域与其他地域之间进行数据同步,请使用DTS数据同步功能,更多信息请参见申请跨境数据同步权限。
成为分布式实例的子实例后,存在如下限制:
不支持变更实例所属的可用区。
不支持变更实例架构,例如从集群架构变更为标准架构等。
集群实例变配时,单次仅支持变配分片数或分片规格,更多信息请参见分布式集群实例变配方案。
同步命令限制
FLUSHDB或FLUSHALL命令不会被同步。
如需清空数据:需对所有子实例执行FLUSHALL命令,否则会造成数据不一致。
如需重新同步:例如以A实例为源,重新对B实例进行同步,您需要在分布式实例中移除B实例、对B实例执行FLUSHALL命令,再重新将B实例接入分布式实例中,接入后即可自动重新同步。
Pub和Sub命令不会被同步,如需实现跨域通知的消息复制,建议通过Stream数据结构来实现。
同步RESTORE命令时,如果目标子实例具备相同的Key,则不会被执行。
数据逐出(Evict)和数据过期(Expire)产生的DEL命令不会被同步。
同步粒度限制
目前同步的粒度为实例级,即子实例的所有数据都会被同步,暂不支持同步子实例中的部分数据。
如需同步部分数据,需要通过业务逻辑来实现。
数据一致性限制
单写场景下(例如用作灾备场景),数据的一致性级别为最终数据一致。以下情况可能导致数据不一致:
由于同步延迟等原因,对带过期时间(TTL)的Key进行操作可能会导致数据不一致。例如在子实例A上成功执行了EXPIRE命令完成续期,但同步到子实例B时数据已过期等。如果对数据一致性要求较高,则不建议在全球多活实例中设置过期时间。
各子实例中数据逐出的Key是相互独立、随机选择的。请确保内存占用不超过实例规格,以避免触发数据逐出。
多写场景下(例如用作多活场景),业务上应避免多个子实例在同一时刻或相近的时间修改同一个Key,否则可能造成数据不一致(即无法保障Key的最终一致性)或者数据堆积(在Streaming场景下严格递增产生的冲突)。
全球多活暂不支持CRDT(Conflict-Free Replicated Data Type)约束,您需要从业务层面自行保障。
不一致情况
图示
说明
不一致情况
图示
说明
Key续期失败
在t1时刻,子实例 A 和 B都持有带过期时间的Key,该Key将于t3时刻过期。
在t2时刻,子实例A执行PEXPIREAT命令将该Key续期至t5时刻。
在t3时刻,由于网络延迟等原因,子实例B尚未收到来自子实例A的PEXPIREAT同步命令,此时子实例B中的Key因过期被删除。
在t4时刻,子实例B收到该Key的续期命令,但Key已被过期删除,故续期命令执行失败。此时,子实例A仍持有Key,子实例B中的Key已丢失。
因过期时间导致命令执行结果不一致
以SMOVE命令为例。
在t1时刻,子实例A和B均持有Key1(将于t3时刻过期)、Key2(未设置过期时间)。
在t2时刻,子实例A执行
SMOVE Key1 Key2 "foo"
命令,将"foo"成员移动至Key2中。在t3时刻,由于网络延迟等原因,子实例B尚未收到来自子实例A的同步命令。同时,子实例A和B中的Key1因过期被删除。
在t4时刻,子实例B收到SMOVE命令,但由于Key1已被过期删除,SMOVE命令执行失败。此时子实例A中的Key2包含“foo”成员,但子实例B中的Key2不包含“foo”成员。
数据随机逐出
在t1时刻,子实例A和B均持有Key1、Key2。
在t2时刻,子实例A内存占满,触发数据逐出,随机删除Key2。
在t3时刻,子实例B内存占满,触发数据逐出,随机删除Key1。
由于默认数据逐出策略是volatile-lru,且数据逐出的删除操作不会同步,因此子实例A和B数据不一致。
多写-Value互换
多个子实例同时对同一个Key进行写操作,可能导致数据不一致。
在t1时刻,子实例A写入
Key:ValA
。在t2时刻,子实例B写入
Key:ValB
。在t3时刻,子实例A向子实例B同步数据(
Key:valA
),同时子实例B向子实例A同步数据(Key:valB
)。两个子实例中Key对应的值发生了互换。
多写-数据类型冲突
在t1时刻,子实例A写入
Key
,为Hash数据类型。在t2时刻,子实例B写入
Key
,为String数据类型。在t3时刻同步命令时,会因数据类型冲突而导致失败。
多写-写入条件不满足
在t1时刻,子实例A写入
SETNX Key ValA
。在t2时刻,子实例B写入
SETNX Key ValB
。在t3时刻同步命令时,会因不满足写入条件而导致同步失败。
HSETNX、SET[NX | XX]等命令也会造成类似问题。
多写-乱序或丢失
在t1时刻,子实例A写入
RPUSH Key valA
。在t2时刻,子实例B写入
RPUSH Key valB
。在t3时刻同步命令时,会导致数据乱序或丢失。
LPUSH、APPEND、DEL、HDEL、INCR、XADD等系列命令也会造成类似问题。
- 本页导读 (1)
- 使用限制
- 同步命令限制
- 同步粒度限制
- 数据一致性限制