首页 > 解决方案 > MongoDB 副本集快照与 Lambda 函数最佳实践

问题描述

我对 MongoDB 很陌生,有点困惑。我正在尝试在 AWS 上创建一个用于生产的自动备份例程,并且我想确保我做得正确。

到目前为止,我已经设置了一个包含 1 个仲裁器和 3 个成员的副本集(1 个主节点,1 个辅助节点,1 个隐藏延迟 4 小时)。每个成员有 3 个独立的 EBS 卷(数据 100GB,日志 20GB,日志 10GB)。

我使用 NodeJS 创建了一个 Lambda 函数,该函数每小时运行一次(使用 CloudWatch Event)来拍摄快照,它执行以下操作:

  1. MongoClient连接到隐藏的延迟成员mongodb://admin:password@ec2.private.ip:27017/admin
  2. 刷新所有挂起的写操作db.command({ fsync: 1, lock: true })
  3. 创建 EC2 连接以检索所有标记为的 EBS 卷LambdaSnapshot
const ec2Conn = new AWS.EC2({ region: 'us-west-1' })
const params = {
  Filters: [
    {
      Name: "tag-key",
      Values: ["LambdaSnapshot"],
    },
  ],
};
const volumes = (await ec2Conn.describeVolumes(params).promise()).Volumes;
const volumeIds = volumes.map((volume) => volume.VolumeId);
  1. 在每个卷上创建快照:
return Promise.all(
  volumeIds.map(async (volumeId) => {
    const formattedDate = moment().format("DD/MM/YYYY HH:mm:ss");
    const snapshot = await ec2Conn
      .createSnapshot({
        Description: "Snapshot " + volumeId + " taken on " + formattedDate,
        VolumeId: volumeId,
        TagSpecifications: [
          {
            ResourceType: "snapshot",
            Tags: [
              {
                Key: "Name",
                Value: volume + " " + formattedDate,
              },
              {
                Key: snapshotTag,
                Value: volume + " " + formattedDate,
              },
            ],
          },
        ],
      })
      .promise();
    return snapshot.SnapshotId;
  });
);
  1. 解锁实例以进行写入db.command({ fsyncUnlock: 1 })

我有两个主要疑问。

  1. 我已标记为LambdaSnapshot 包含隐藏延迟成员的数据(100GB 之一)的 EBS 卷。我不确定是否还必须拍摄日志和日志卷的快照。
  2. 我注意到,即使我正在使用await运行命令来创建快照,该功能仍然会继续并在快照处于pending状态时解锁实例。我不确定,但我认为该命令createSnapshot()仅向 AWS 提供输入以启动快照并解决承诺,而无需等待完成。因此,我怀疑在快照完成后是否必须在 lambda 函数之外解锁数据库;在那种情况下,我不知道如何监听完整事件以运行解锁数据库的第二个 lambda 函数。

提前致谢

标签: mongodbaws-lambdasnapshotreplicaset

解决方案


文档中所述, EBS 快照创建是异步的:

快照异步发生;即时点快照会立即创建,但快照的状态是待处理,直到快照完成(当所有修改的块都已传输到 Amazon S3 时),对于大型初始快照或后续快照,这可能需要几个小时许多块已更改的快照。在完成时,正在进行的快照不受对卷的持续读取和写入的影响。

备份文档说:

要获取正在运行的 mongod 进程的正确快照,您必须启用日志,并且日志必须与其他 MongoDB 数据文件位于同一逻辑卷上。如果不启用日记功能,则无法保证快照是一致的或有效的。

除非您有另一个文档参考说您不需要使用所有其他数据备份日志或日志数据,否则我建议将所有内容一起备份。


推荐阅读