创建多活实例

第1个子实例
从已经存在的 Redis 实例选择。
注意 若该子实例内核版本比较早,不支持oplog,系统在创建多活实例时,会对该子实例进行版本升级。升级最后阶段,该子实例上会有TCP连接闪断,并有5~30秒的只读时间。
其他子实例
都是通过clone新建出来, 实例规格全量数据密码白名单 都clone自子实例列表中的第1个子实例。
注意 实例规格密码白名单 只会在新子实例被创建时,被同步到新子实例。创建完毕后,子实例上对于 实例规格密码白名单 的更改不会同步到其他子实例。

子实例变更配置

子实例架构类型:
  • 标准版
    • 支持变配到其他容量标准版规格,变配过程中同步通道不会中断。
    • 暂不支持变配到集群版读写分离版,近期会支持。
  • 集群版
    • 暂不支持变配到其他容量集群版规格,近期会支持。
    • 暂不支持变配到标准版读写分离版,近期会支持。
  • 读写分离版
    • 暂不支持变配到其他容量读写分离版规格,近期会支持。
    • 暂不支持变配到标准版集群版了,近期会支持。
说明 多活子实例变配可能导致部分数据同步异常,请谨慎变配。例如,多活子实例A与B同步,规格为2G,若B变配到4G,当B中的数据量大于2G时,B向A同步的数据将溢出。

数据一致性

  • flushdb/flushall命令不会同步到其他子实例。若要清空数据,需对所有子实例执行flushdb/flushall命令,不然会造成数据不一致。
  • 多个子实例同时修改同一个key,可能会造成数据不一致。下面举例说明这种造成数据不一致的情况。

value 交换



  • 1.1时刻A收到set命令(key->value_A),在1.2时刻A记录db(key->value_A)。

  • 2.1时刻B收到set命令(key->value_B),在2.2时刻B记录db(key->value_B)。

  • 3.1时刻A向B同步(key->value_A),同时B向A同步(key->value_B),在3.2时刻A记录(key->value_B), B记录(key->value_A)。

可以看到,A和B两个数据库的value交换了。

乱序/丢失



  • 1.1时刻A收到(rpush key->value_A),在1.2时刻A记录db(key->value_A)。

  • 2.1时刻B收到(rpush key->value_B),在2.2时刻B记录db(key->value_B)。

  • 3.1时刻A向B同步(rpush key->value_A),同时B向A同步(rpush key->value_B)。

  • 3.2时刻A记录(rpush key->value_A,value_B), B记录(rpush key->value_B,value_A)。

当操作类型依赖value原始值时,在交换的情况下可能会出现乱序甚至丢失的情况。类似的操作还有incr系列,lpush,lpop,append,sort(store),del,hdel等命令。

类型不一致



  • 1.1时刻A收到(key->T(hash)),1.2时刻A记录(key->T(hash))。

  • 2.1时刻B收到(key->T(string)),2.2时刻B记录(key->T(string))。

之后时刻,A向B同步(key->T(hash)),或者B向A同步(key->T(string)),都将形成冲突。

写入条件不满足



  • 1.1时刻A收到(setnx key->value_A),1.2时刻记录(key->value_A)。

  • 2.1时刻B收到(setnx key->value_B),2.2时刻记录(key->value_B)。

之后时刻,A向B同步(setnx key->value_A),或者B向A同步(setnx key->value_B),都将形成冲突。同样可能造成问题的还有set(nx | xx)hsetnx等。