如何恢复损坏的 Active-Active 副本?
最后更新于 2024年4月18日
问题
在一个 Active-Active 地理分布式设置 (CRDB) 中,一个或多个副本可能会失败。问题可能由集群故障引起,或由导致数据库副本不可用的逻辑损坏引起。甚至可能由人为错误引起,例如使用 flush 命令或 crdb-cli
工具的 remove-instance 命令。
答案
根据问题的类型,可能需要不同的解决方案来重新建立集群中的数据库副本。
数据已被清空
如果使用 crdb-cli crdb flush 命令彻底清空了 CRDB 数据库中的数据,则唯一恢复方法是利用备份。
副本移除或清除
假设由于使用 remove-instance 或 purge-instance 手动移除或清除了副本。如果在另一个 Redis Enterprise Cluster 中存在一个完好的数据库副本。在这种情况下,解决方案很简单,只需在移除副本的原始集群中重新创建副本即可。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,[email protected],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 文件备份,可以最大程度地减少数据丢失,这可能有助于恢复到更接近所选时间点的数据。