Redis 数据源之间的双向数据复制
NineData 数据复制功能支持为两个或多个 Redis 数据源之间执行任意方向的数据实时同步。
功能说明
NineData Redis 双向复制用于在两个 Redis 实例之间建立持续、实时的双向数据同步通道,使两个实例在逻辑上形成一个对等的数据体系。在该体系下,任一实例均可同时承担读写流量,NineData 负责保证数据最终一致性、冲突可控和同步链路稳定运行。
前提条件
源和目标数据源均为 Redis,建议参与双向复制的 Redis 数据源版本保持一致。
Redis 的架构为:单机版、主从版、读写分离版、集群版
步骤一:为参与复制的所有数据源添加多活标记
为防止发生数据循环复制,您需要为参与复制任务的所有数据源添加多活标记。
登录 NineData 控制台。
在左侧导航栏,单击数据源管理>数据源。
单击目标数据源 ID,打开数据源详情页面。
在数据源详情区域(即包含数据源名称、ID、创建人、创建时间等信息的区域),单击更多。
找到多活标记,单击其右侧的
图标。
输入多活标记,单击确定。
提示- 多活标记可包含 1~64 个字符。
- 多活标记需为全局唯一,不可和其他多活标记重复。
步骤二:配置双向复制任务
登录 NineData 控制台。
在左侧导航栏单击数据复制 > 数据复制。
在数据复制页面,单击右上角的创建复制。
在数据源与目标页签,按照下表进行配置,并单击下一步。
参数 说明 任务名称 输入数据同步任务的名称,为了方便后续查找和管理,请尽量使用有意义的名称。最多支持 64 个字符。 源数据源 同步对象所在的数据源。 目标数据源 接收同步对象的数据源。 目标对象命名规则 选择对象名称从源端迁移到目标端后的大小写转换规则。 - 全部转小写:无论源端的命名规则如何,目标端的命名规则全部为小写。
- 保持与源一致:沿用源端的命名规则。
- 全部转大写:无论源端的命名规则如何,目标端的命名规则全部为大写。
复制方式 选择复制方式。此处选择双向复制。 - 单向复制:从源数据源到目标数据源方向的单向数据复制任务。
- 双向复制:源和目标两个数据源之间进行的双向增量数据复制任务。
正向复制类型 复制方式为双向复制时需要选择。选择正向复制类型。 - 全量复制:同步源数据源的所有对象和数据,即全量数据复制。
- 增量复制:在全量同步完成后,基于源数据源的日志进行增量同步。
增量开始时间 复制类型仅为增量复制时需要选择。 - 从启动时间开始:以当前复制任务开始时间为基准,进行增量复制。
- 自定义时间:选择增量复制开始的时间点,您可以根据您的业务所在地域按需选择时区。如果将时间点配置为当前复制任务开始前,则如果该时间段内有 DDL 操作,复制任务将失败。
正向增量开始时间 正向复制类型仅为增量复制时需要选择。 - 从启动时间开始:以当前复制任务开始时间为基准,进行增量复制。
- 自定义时间:选择增量复制开始的时间点,您可以根据您的业务所在地域按需选择时区。如果将时间点配置为当前复制任务开始前,则如果该时间段内有 DDL 操作,复制任务将失败。
反向复制类型 目标数据源到源数据源方向的复制类型,仅在复制方式为双向复制时显示。仅支持增量复制,且默认选中无法关闭。 复制规格(仅结构复制的情况下不可选) 复制任务的规格,规格越大复制的速率越高,将鼠标悬浮于 图标上即可查看每个规格对应的速率和配置信息。每个规格中显示了可用数量及规格总数,当可用数量为 0 时将以灰度显示,无法选择。
目标表存量数据处理策略(未选中结构复制时需要选择) - 预检查报错并停止任务:预检查阶段检测到目标表中存在数据时,停止任务。
- 忽略存量数据,追加写入:预检查阶段检测到目标表中存在数据时,忽略该部分数据,追加写入其他数据。
- 清空存量数据,重新写入:预检查阶段检测到目标表中存在数据时,删除该部分数据,重新写入。
在选择复制对象页签,配置下列参数,然后单击下一步。
参数 说明 复制对象 选择需要复制的内容,您可以选择全部实例复制源库所有内容,也可以选择自定义对象,在源对象列表中选中需要复制的内容,单击>添加到右侧目标对象列表。 如果您需要创建多条相同复制对象的复制链路,可以创建一个配置文件,在新建任务的时候导入即可。单击右上角的导入配置,再单击下载模板,将配置文件模版下载到本地,编辑完成后单击上传文件上传该配置文件即可实现批量导入。配置文件说明:
参数 说明 source_database_name需同步的对象所在的源库名。 target_database_name接收同步对象的目标库名。
在配置映射页签,配置源库同步到目标数据源之后的库名,然后单击保存并预检查。如果在配置映射阶段,源和目标数据源中有更新,可以单击页面右上角的刷新元数据按钮,重新获取源和目标数据源的信息。 您还可以进行如下操作:
- 单击添加过滤条件,可配置过滤条件,仅符合过滤条件的数据会同步到目标数据源,过滤条件书写示例请参见页面。
- 单击右上角的批量配置,可以批量定义过滤条件,实现批量配置。
在预检查页签,等待系统完成预检查,预检查通过后,单击启动任务。
您可以勾选开启数据一致性对比。在同步任务完成后,自动开启基于源数据源的数据一致性对比,保证两端数据一致。根据您选择的复制类型,开启数据一致性对比的启动时机如下:
- 全量复制:全量复制完成后启动。
- 全量复制+增量复制、增量复制:当增量数据首次和源数据源一致且延迟为 0 秒时启动。您可以单击查看详情,在复制详情页面中查看同步延迟。

如果预检查未通过,需要单击目标检查项右侧操作列的详情,排查失败的原因,手动修复后单击重新检查重新执行预检查,直到通过。
检查结果为警告的检查项,可视具体情况修复或忽略。
在启动任务页面,提示启动成功,同步任务开始运行。此时您可以进行如下操作:
单击查看详情查看同步任务各个阶段的执行情况。
- 单击返回列表可以返回数据复制任务列表页面。
步骤三:查看双向复制结果
双向任务创建完成后,NineData 将自动为当前任务启动一条反向的复制任务,用于将目标中的增量数据复制回源端,以保证两端数据的完全一致。
登录 NineData 控制台。
在左侧导航栏单击数据复制 > 数据复制。
在数据复制页面单击目标同步任务的任务 ID,页面说明如下。

| 序号 | 功能 | 说明 |
|---|---|---|
| 1 | 同步延迟 | 源数据源和目标数据源之间的数据同步延迟,0 秒表示两端之间没有延迟,此时您可以选择将业务切换到目标数据源,实现平滑迁移。 |
| 2 | 配置告警 | 配置告警后,系统会在任务失败时通过您选择的方式通知您。更多信息,请参见运维监控简介。 |
| 3 | 更多 |
|
| 4 | 全量复制(包含全量复制的场景下显示) | 展示全量复制的进度和详细信息。
|
| 5 | 增量复制(包含增量复制的场景下显示) | 展示增量复制的各项监控指标。
|
| 7 | 数据对比 | 展示源数据源和目标数据源之间对比的结果。如果您未开启数据对比,请单击页面中的开启数据对比。
|
| 8 | 查看反向 | 单击可查看目标数据源到源数据源的复制详情。 |
| 9 | 更多 | 展示当前复制任务的详细信息。 |
附录 1:增量复制支持的命令
在增量复制过程中,只有 NineData 数据复制功能支持的 Redis 数据变更命令才会在源端执行后实时同步到目标端。本章节介绍 NineData 数据复制功能所支持的 Redis 数据类型和数据变更命令。
| 支持的数据类型 | 支持的命令 |
|---|---|
| Strings | APPEND、DECR、DECRBY、GETDEL(6.2.0 版本以上)、GETEX(6.2.0 版本以上)、GETSET、INCR、INCRBY、INCRBYFLOAT、MSET、MSETNX、PSETEX、SET、SETEX、SETNX、SETRANGE |
| Lists | BLMOVE、BLMPOP、BLPOP、BRPOP、BRPOPLPUSH、LINSERT、LMOVE、LMPOP、LPOP、LPUSH、LPUSHX、LREM、LSET、RPOP、RPOPLPUSH、RPUSH、RPUSHX |
| Sets | SADD、SDIFFSTORE、SINTERSTORE、SMOVE、SPOP、SREM、SUNIONSTORE |
| Hashes | HDEL、HINCRBY、HINCRBYFLOAT、HMSET、HSET、HSETNX、 |
| Sorted Sets | BZMPOP、BZPOPMAX、BZPOPMIN、ZADD、ZDIFFSTORE、ZINCRBY、ZINTERSTORE、ZMPOP、ZPOPMAX、ZPOPMIN、ZRANGESTORE、ZREM、ZREMRANGEBYLEX、ZREMRANGEBYSCORE、ZUNIONSTORE |
| Streams | XADD、XTRIM、XGROUP、 XAUTOCLAIM、XDELXREADGROUP |
| Geospacial | GEOADD、GEOSEARCHSTORE |
| HyperLogLog | PFADD |
| Bitmaps | SETBIT、BITFIELD、BITOP |
附录 2:预检查项一览表
| 检查项 | 检查内容 |
|---|---|
| 源数据源连接检查 | 检查源数据源网关状态、实例是否可达、用户名及密码准确性 |
| 目标数据源连接检查 | 检查目标数据源网关状态、实例是否可达、用户名及密码准确性 |
| 源库权限检查 | 检查源数据库的账号权限是否满足要求 |
| 源对象存在性检查 | 检查目标端中存在的表,当前在源端是否存在 |
| 双向复制多活单元标记检查 | 检查多活单元标记是否存在 |
| 目标库数据存在性检查 | 检查待复制对象在目标数据库中是否已存在数据 |
| 循环链路检查 | 检查环路是否存在 |
| 源实例 Log Buffer 大小检查 | 检查源实例参数 repl-backlog-size 的大小配置 |
| 检查源实例 Client Output Buffer 大小 | 检查源实例参数 client-output-buffer-limit replica 的大小配置 |