【问题标题】:Taking EBS snapshot for multiple mongo node EBS volumes in mongoDB cluster为 mongoDB 集群中的多个 mongo 节点 EBS 卷拍摄 EBS 快照
【发布时间】:2015-06-23 17:48:58
【问题描述】:

对于一个 mongoDB 分片,我在同一个卷上拥有日志和数据,因此不需要使用 fsyncLock 锁定后才拍摄快照的一致性问题。 EBS 快照将是单个分片的一致时间点。

我想知道在 mongodb 集群中进行备份的首选方式是什么。我探索了两种选择:

  1. 通过大约在同一时间拍摄 EBS 快照的近似时间点一致备份。优点是不需要写锁。
  2. 停止对系统的写入,然后拍摄快照。这将提供时间点一致的备份。

现在,我想知道它是如何在生产中实际完成的。我已经阅读过正在使用的副本集的辅助节点,但不清楚它如何提供时间点一致的备份。除非所有从节点都有一致的时间点数据,否则 EBS 快照不可能是时间点。例如,对于 NodeA 的辅助节点,如果数据与主节点同步,但 NodeB 的辅助节点的某些数据没有同步,该怎么办。我在这里遗漏了什么吗?

另外,如果发生这种情况,方法 1 是否会导致 MongoDB 集群不一致(恢复时),例如崩溃或问题?

【问题讨论】:

  • 你的设置是什么?只有一个副本集还是您有一个分片集群(多个副本集、配置服务器)?他们每个人的备份都是不同的。一般来说,如果您可以停止写入并为主节点创建原子快照,这是最简单的解决方案。您需要考虑很多事情(写入问题、复制延迟、oplog/journaling),以尽量减少服务器崩溃时的数据丢失。
  • 暂时没有副本。多个分片和 3 个配置服务器。让我知道这是否足以让您回答

标签: mongodb amazon-web-services snapshot


【解决方案1】:

一致的备份

任何分片集群备份过程的第一步应该是:

  • 停止平衡器(包括等待任何正在进行的迁移完成)。通常这是使用sh.stopBalancer() shell 助手完成的。

  • 备份配置服务器(通常使用与分片服务器相同的方法,例如 EBS 或文件系统快照)

我会将分片集群的一致备份定义为分片集群元数据(即存储在配置服务器上的数据)与各个分片的备份相对应的备份,并且每个分片都已正确备份.停止平衡器可确保在备份过程中不会发生数据迁移。

假设您的 MongoDB 数据和日志文件位于单个卷上,您可以采用一致的 EBS snapshotfilesystem snapshot 而无需停止对正在备份的节点的写入。快照异步发生。创建初始快照后,后续快照是增量的(只需要更新自上一个快照以来已更改的块)。

时间点备份

使用活动的分片集群,您只能通过停止对集群的所有写入并备份每个分片的主节点来轻松捕获已写入数据的真实时间点备份。否则,正如您所推测的,如果您从辅助节点备份,分片之间可能会有不同的复制延迟。从辅助节点备份更为常见,因为在写入快照时会有一些 I/O 开销。

如果您没有对分片使用复制(或者更喜欢从主分片备份),则复制滞后警告不适用,但对于活动系统来说,时间仍然是近似的,因为需要同时启动快照跨所有分片。

时间点恢复

假设您的所有分片都由副本集支持,则可以使用近似的时间点一致备份来编排 还原 到使用 @ 的更具体的时间点每个分片(加上一个配置服务器)的 987654324@。这本质上是 MongoDB Cloud Manager (née MMS) 等备份解决方案所采用的方法:请参阅 MongoDB Backup for Sharded Cluster。 MongoDB Cloud Manager 利用每个分片上的备份代理使用复制 oplog 进行连续备份,并按计划定期创建完整快照。可以通过从完整数据快照开始构建时间点恢复,然后将相关操作日志重播到请求的时间点。

常见的制作方法是什么?

停机通常不是生产系统理想的备份策略,因此常见的方法是使用快照在大致的时间点对正在运行的分片集群进行一致的备份。跨分片集群协调备份可能具有挑战性,因此备份工具/服务也值得考虑。如果您的部署不允许快照(例如,如果您的数据和/或日志目录分布在多个卷中以最大限度地提高可用 IOPS),备份服务也可能更适合。

注意:您真的应该考虑在生产部署中使用复制,除非这是一个非必要的集群或停机时间是可以接受的。副本集有助于最大限度地延长部署的正常运行时间和可用性,并且在没有数据冗余的情况下,一些维护任务(包括备份)将更有影响力。

【讨论】:

  • 你能告诉我如何使用副本集来确保时间点一致的备份吗?我认为除非我们停止对分片集群的写入,否则我们永远无法确保这一点,对吗?另外,我们如何使用副本集 oplog 协调恢复到特定时间点?
  • 另外,如果您可以共享一些链接以使用副本集 oplog 协调还原到特定时间点,这将很有帮助
  • 您能否详细说明副本集如何帮助改进备份等维护任务?尤其是在不使用 mongobackup/restore 的情况下获取时间点备份?
  • 我想我已经涵盖了时间点的注意事项。如果你想要一个绝对的时间点备份,你必须停止世界,但这通常不是生产中的分片集群所需的方法。只要您进行了一致的备份,大致的时间点通常就足以进行备份和还原。如果您需要恢复到更具体的时间点,您可以将复制操作日志(例如:Modify and replay MongoDB oplog)从较新的快照转储并重播到较旧的快照。
  • 副本集支持高可用性、自动故障转移和滚动升级。快照会降低 I/O 性能(尤其是初始快照而不是后续增量),因此在辅助节点上进行备份可以最大限度地减少主节点的潜在开销。如果您的部署有充足的可用资源或快照没有大的增量可捕获,则快照的影响可能不明显。在副本集上滚动升级是在最终降级并升级前一个主节点之前升级每个辅助节点(例如版本升级)。
【解决方案2】:

您的备份将分为多个阶段:

  1. sh.stopBalancer() 停止mongos 上的平衡器
  2. 您现在可以备份配置服务器的config 数据库。不管你是使用 EBS 快照还是 mongodump --oplog
  3. 现在分片,您可以决定采用哪种方式:
    1. 要么:您使用mongodump --oplog 备份每个节点。您不需要停止写入,因为您将操作日志与数据库导出一起拍摄快照。此备份允许一致的还原。还原时,您可以使用--oplogReplay--oplogLimit 选项来指定时间戳(假设您的 oplog 大小合适并且在备份期间没有翻转)。您可以在所有分片上并行执行转储,并且恢复由 oplog 同步。
    2. 或者您为每个分片 fsync 并锁定并创建 EBS 快照(描述为 http://docs.mongodb.org/ecosystem/tutorial/backup-and-restore-mongodb-on-amazon-ec2/)。 MongoDB 3.0 不能保证在使用 WiredTiger 时数据文件不会改变。这里的代价是,您必须停止所有读取和写入,因为您必须卸载设备。
  4. 现在用sh.startBalancer() 启动mongos 上的平衡器

由于您不使用副本集,因此您无需担心滞后的辅助节点/写入不会在整个集群中复制。我最喜欢的选项是使用mongodump/mongorestore,它可以对还原进行大量控制。

更新:

最后,您必须决定要支付多少费用才能获得某些好处:

  1. 快照:支付空间、写入锁定和一定程度的一致性,以获得快速备份、快速恢复时间,并且备份后不影响性能
  2. 转储:花时间付费并在备份期间淘汰工作集以获得更小的备份,以实现一致且较慢的恢复,无写锁定

【讨论】:

  • 但是对于非常大的数据库来说,mongodump/restore 非常慢。我设想我的数据大小将超过 500 GB。这是一个可扩展的解决方案吗?
  • 我目前使用的数据库分布在 8 台机器上,大小为 24TB,但我(还)没有遇到问题。
  • 在实时服务器上运行mongodump 需要将数据加载到内存中以便转储它。这将影响您在内存中的工作集,并且如果您的整体数据远大于内存或您的 I/O 速度较慢,则尤其成问题。出于这个原因,大多数大型生产部署通常在备份实时系统时使用快照以将影响降至最低。 mongodump 输出仅包含数据和索引的定义(而不是完全构建的数据文件和索引),因此恢复时间通常明显长于恢复快照。
  • @Stennie,这正是我对 mongodump 的看法。它们很慢,当您遇到灾难时,您可能需要几天的时间来处理您正在谈论的那种 24 TB 数据。这就是我探索非 mongodump 选项的原因。让我知道我提到的两种方法中哪一种有意义,或者您是否有更好的快照机制。
  • @mp911de 你不觉得这个东西对于灾难恢复来说会慢得离谱吗?我很确定即使自己进行备份也必须花费大量时间
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2019-04-06
  • 1970-01-01
  • 2016-12-26
  • 2018-12-06
相关资源
最近更新 更多