云数据库 Redis® 支持全球复制的功能,解决跨地域数据同步一致性的问题。
为什么需要全球复制?
Redis 原生代码在跨地域复制的场景中,当本端实例写入量过大或者长时间断开复制时,Master 节点的 backlog 复制日志可能无法满足断点复制日志的续传,导致远端实例只能进行全量复制,而全量复制同步数据将使得远端实例访问受阻,严重影响远端实例的正常业务。具体信息,请参见 Redis 官方文档的复制方案 。
同时,Redis 原生的复制方案在 backlog 复制日志中没有标记写入节点,当本端与远端需进行双向复制时,容易引起复制环路,造成数据错乱。
实现机制
全球复制是腾讯云在开源社区版本的内核中新增的功能,完全兼容 Redis 4.0 和 Redis 5.0 的命令。基于原有的主从复制方案,新增了一个日志文件进行远端复制,保证复制组内任意地域实例数据的最终一致。
在远端节点未复制日志文件之前,本端节点将保留日志文件,保证远端复制的连续性。
日志文件包含 ServerID,标识日志文件写入节点 ID,支持远端与本端双向复制,避免复制环路。
日志文件包含命令执行时间戳和操作 KEY 的版本号,用于解决命令冲突的问题。
应用场景
灾备场景
Redis 全球复制方案,在复制组中配置一个主实例,在多地部署只读实例,不同地域的灾备实例从主实例进行数据复制。用户便可以在本地进行数据访问,改善数据访问的响应速度,提升用户体验,提高数据可用性,增强数据安全性。
说明:
分片数量:灾备场景,全球复制组中的主实例与灾备实例分片数建议设置为2的 n 次方,最大值为64,如8、16、32、64,否则可能导致分片存储容量不均。
事务命令:全球复制的事务操作,相比普通的 Redis 事务,数据库性能会有一定程度的下降。
多 Key 命令:全球复制实例中,多 Key 命令按 Slot 进行拆分,相比非全球复制组中的数据库实例,性能有所下降,下降比例与拆分的数量有关。拆分数量越多,性能下降越多。
数据一致性:数据的版本以主实例为准,数据的一致性级别为最终数据一致。当主实例的主从节点链路出现故障,灾备实例的远程复制也会受到延迟影响。对数据库一致性要求较高的业务场景,强烈建议不要在灾备实例上进行读操作。
淘汰策略:全球复制不支持设置淘汰策略
maxmemory-policy
。如果有淘汰诉求,请使用del
删除命令清理 Key。延迟说明:全球复制中,主实例的主节点与副本节点的同步延迟会影响主实例与灾备实例之间的远程同步延迟,延迟时长理论上不超过500ms。
监控指标:支持主实例与灾备实例远程同步过程中的命令数量偏差的监控,以及同步延时的监控。具体信息,请参见 监控指标。
多活方案
在用户跨地域漫游、多地数据合并等场景,您需要将一份数据分发到多个地域,需在任意地域进行数据读取和更新,或者需要将多个地域的数据合并为一份。此时,数据库需要具备多地写入能力。全球复制组中可以配置多主架构,数据可以在任何一个主实例写入,复制组内的其他地域的主实例将同步数据。
说明:
注意:
Redis 主实例对应用写入的数据和复制组中其他主实例写入的数据,不做版本检测和写入时间检查,按照接收到命令的时间依次执行。若相同的数据在同一时间的不同主实例中进行了更新,全球复制的数据可能出现数据错乱,无法保证数据的完全一致。
因此,多主场景中,需避免对相同的数据在同一时间在不同的主实例中进行更新。多主架构存在数据一致性风险,请您仔细评估您的业务场景是否适用该功能。