如何恢复损坏的 Active-Active 复制?

上次更新时间:2024 年 4 月 18 日

问题

在一个 Active-Active 地理分布式设置 (CRDB) 中,一个或多个副本可能会出现故障。问题可能是由集群故障引起的,也可能是由于逻辑损坏导致数据库副本无法使用。甚至可能是人为错误,使用 flush 命令或 remove-instance crdb-cli 工具。

答案

根据问题的类型,不同的解决方案可以重新将数据库副本建立回集群中。

数据已被清除

如果数据已使用 crdb-cli crdb flush 命令从 CRB 数据库中干净地清除,则恢复数据的唯一选择是恢复备份。

副本删除或清除

假设副本由于手动删除或使用 remove-instancepurge-instance 命令清除而丢失。另一个 Redis Enterprise 集群中存在一个完好的数据库副本。在这种情况下,解决方案很简单,因为只需在原始集群(副本被删除的集群)中重新创建副本即可。crdb-cli 工具将通过 add-instance 命令提供帮助。必须从运行完好副本的集群中执行此命令。例如,使用 crdb-cli crdb list 收集 crdb-guid 标识符后,可以按以下方式重新创建副本。

crdb-cli crdb add-instance --crdb-guid b6a68af2-978a-40d4-9eae-c9f471420da8 --instance fqdn=clusteraa1.local,username=redis@redis.com,password=redis
Task 5b30c439-c2c7-4c5c-b86f-8cdcadfafe94 created
---> CRDB GUID Assigned: crdb:b6a68af2-978a-40d4-9eae-c9f471420da8
---> Status changed: queued -> started
---> Status changed: started -> finished

副本损坏

如果数据库副本出现数据损坏或其他问题,且其根本原因可能无法完全诊断,则可以通过配置解决此问题,方法是删除副本并将其重新添加回,如上一个场景中所述。此操作将推动完全同步或增量同步。此场景假设集群仍然可以运行,并且问题存在于数据库级别。

影响一个或多个集群的事件

如果一个或多个集群遇到事件,但仍然存在一个具有 CRDB 数据库副本的操作集群,则只需恢复受影响的集群即可。这是文档 恢复数据库 中推荐的解决方案。

对于仍然具有活动实例的 Active-Active 数据库,建议您恢复失败实例的配置,并让数据从其他实例更新。

影响所有集群的主要事件

如果由于重大事件导致所有集群都无法运行,则唯一的补救措施是从备份中恢复单个集群,如文档中所述。

对于所有实例都需要恢复的 Active-Active 数据库,建议您使用数据恢复一个实例,只恢复其他实例的配置。然后,空实例将从恢复的数据中进行自我更新。

其他注意事项

整个集群的逻辑损坏(副本中的数据损坏并复制到 CRDB 网格的其余部分)将需要从备份中进行完全恢复。这意味着唯一的有效解决方案可能是从最后一个正常备份中重建集群。值得记住的是,AOF 可能无法保护数据免受逻辑损坏,因为可能难以将文件编辑到某个时间点进行恢复。由于这种隐含的复杂性,RDB 快照是常用的解决方案。根据风险与回报,管理员需要安排备份。可能无法恢复损坏前的最后一次更改。

通过恢复 AOF 文件的备份可以最大程度地减少数据丢失,这可能使您能够恢复到所需时间点的更接近的时间线。

参考资料

恢复失败的数据库