如何使用Droplet快照备份MongoDB

来自菜鸟教程
跳转至:导航、​搜索

介绍

定期数据库备份是防止意外数据丢失事件的关键步骤。 一般来说,有两大类备份:文件系统级(“物理”)备份和逻辑备份。 文件系统级备份涉及在某个时间点对底层数据文件进行快照,并允许数据库使用快照文件中捕获的状态完全恢复自身。 逻辑备份涉及使用工具(例如 mongodumppg_dump)将数据从数据库导出到备份文件,然后使用相应的恢复工具(例如 mongorestorepsql <)。

在本指南中,我们将演示如何使用 Droplet Snapshots 对正在运行的 MongoDB 安装执行文件系统级备份。 此外,我们将介绍如何从快照映像执行恢复。

注意: 如 DigitalOcean 备份 指南 中所述,使用 Droplet 快照时会产生一些性能影响,尤其是在高负载数据库上。 您应该首先使用具有模拟负载的非生产数据库测试此过程,以验证此方法是否适用于您的生产部署。


先决条件

在开始使用本指南之前,请确保您已完成以下必备步骤:

本指南将假设您已安装 MongoDB 3.2+,使用默认的 WiredTiger 存储引擎并启用日志。 此外,要使用本指南,重要的是 dbpath 目录(包含数据文件的目录,默认为 /var/lib/mongodb)映射到单个卷。 如果您没有将额外的块存储卷附加到您的 Droplet,您可以按照本指南进行操作。

一旦您登录到您的 Droplet 并启动并运行 MongoDB,您就可以开始了。

第 1 步 — 验证您的 MongoDB 设置

我们首先要检查是否启用了日记功能。

日志是 MongoDB 的一项功能,它通过将操作写入日志文件来在数据库发生故障时提供持久性。 要了解有关 MongoDB 日志的更多信息,请参阅 MongoDB 手册

如果您遵循上述指南,则默认情况下将启用日记功能。 为了确认是这种情况,我们可以检查 MongoDB 配置文件。

使用您喜欢的文本编辑器打开 /etc/mongod.conf,例如 nano:

nano /etc/mongod.conf

您应该看到以下块:

/etc/mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

这表明已启用日记功能。 如果您使用的是 MongoDB 3.2+,则默认存储引擎是 WiredTiger(MMAPv1 是 MongoDB 的原始存储引擎)。

我们现在将插入一些虚拟数据来测试备份和恢复过程。

第 2 步 — 插入测试数据

如果您开始使用干净的服务器并且还没有任何数据,我们可以将一些示例数据插入到虚拟 restaurants 集合中以进行演示。 如果您的数据库中已经存储了一些集合和文档,请随意跳过此步骤。

首先,使用 MongoDB shell 连接到正在运行的数据库:

mongo

您应该看到以下 Mongo shell 提示符:

MongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
>

shell 使用的默认数据库是 test 数据库。

让我们列出 test 数据库中存在的集合:

show collections

因为我们还没有向数据库中插入任何东西,所以没有集合,我们被带回到没有输出的提示。

让我们将一个文档插入到一个虚拟的 restaurants 集合中,我们将同时创建它:

db.restaurants.insert({'name': 'Sammy's Pizzeria'})

您应该看到以下输出:

WriteResult({ "nInserted" : 1 })

这表明插入操作成功。 由于 restaurants 集合以前不存在,因此它是同时创建的。

让我们再次列出集合:

show collections

我们现在看到我们新创建的 restaurants 集合:

restaurants

既然我们已经在数据库中存储了一些示例数据,我们就可以备份它了。

    1. Step 3 — 对 MongoDB Droplet 进行快照

为了执行备份,我们将利用 DigitalOcean Droplet Snapshots。 Droplet 快照允许我们在启动快照的时间点创建 Droplet 的图像。 然后可以将此图像恢复到新的 Droplet,在那里可以进行进一步的恢复操作。

鉴于我们使用的是 MongoDB 3.2+(启用了 WiredTiger 和日志),我们不需要在快照发生时暂停对文件系统的写入。 一旦我们恢复镜像并启动数据库,MongoDB 将从检查点恢复自身,然后从日志文件重放操作,直到它到达快照发生的时间点。 如果您有兴趣进一步探索日志,请参阅 MongoDB 手册 ),

要开始快照过程, 登录到您的 DigitalOcean 帐户,导航到您的 MongoDB Droplet,然后单击侧栏中的 Snapshots 链接。

您应该看到以下提示:

注意: 虽然建议在拍摄快照之前关闭 Droplet,但在生产部署中这可能并不总是可行。 MongoDB 的日志功能支持一致且有效的快照,即使在数据库和 Droplet 运行时也是如此。


给您的快照起一个描述性的名称,然后单击 Take Live Snapshot 按钮开始快照过程。

您应该看到以下快照进度指示器:

快照完成后,您将能够从映像创建新的 Droplet,或将正在运行的 Droplet 恢复到快照映像中捕获的状态。

我们现在已准备好执行备份过程的还原和验证。

第 4 步 — 恢复 MongoDB Droplet

我们现在将创建一个新的 Droplet,它将从我们刚刚创建的图像中恢复。 我们的 MongoDB 数据库中可用的数据将与拍摄快照时可用的数据相同。

使用侧边栏导航回 Snapshots,然后找到完成的 Droplet 快照。

点击进入More并选择Create Droplet

您将被带到 Create Droplet 菜单,您可以在其中从快照中启动新的 Droplet。

选择与您之前拍摄的快照对应的图像。 在这种情况下,我们将使用 mongo-backup-test 图像。

完成配置恢复 Droplet 并单击 创建 。 恢复 Droplet 启动并运行后,登录它。

如果您将 MongoDB 配置为在 Droplet 启动时启动,它现在应该正在运行。 您可以使用 systemctl 进行检查:

sudo systemctl status mongod

您应该看到以下输出:

Output● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-02-14 21:14:40 UTC; 4min 53s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1302 (mongod)
    Tasks: 19
   Memory: 87.2M
      CPU: 1.802s
   CGroup: /system.slice/mongod.service
           └─1302 /usr/bin/mongod --quiet --config /etc/mongod.conf

表示一切正常,MongoDB 已正确启动。

如果 MongoDB 没有运行,我们首先需要删除锁定文件,然后启动服务:

rm /var/lib/mongodb/mongod.lock
sudo systemctl start mongod

使用 systemctl status 验证 MongoDB 是否正确启动。

一旦 MongoDB 启动并运行,它将开始自我清理并将其状态恢复到快照发生的时间点。 这可能需要几分钟时间,并且 mongo shell 在完成之前可能不可用。

一旦服务器可用,我们可以使用 mongo 命令登录:

mongo

您现在将看到 mongo shell 提示符:

OutputMongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
>

如果你已经做到了这一点,恭喜! 您已成功执行 MongoDB 数据库的备份和恢复。

作为一项额外的预防措施,我们可以检查我们的收藏品的完整性。

第 5 步 — 检查数据完整性

在生产使用此备份数据之前,检查恢复的集合中是否存在无效的 BSON 对象很有用。

注意: validate 命令在非常大的集合上可能会很慢。 此外,在 validate 命令返回之前,集合上的所有读写都将被阻止。


在此示例中,我们有一个名为 restaurants 的集合,我们希望在该集合上运行 validate 命令。

在 mongo shell 中,运行 validate 命令:

db.restaurants.validate({full:true})

您应该会看到与以下类似的输出:

{
   "ns" : "test.restaurants",
   "nrecords" : 1,
   "nIndexes" : 1,
   "keysPerIndex" : {
       "test.restaurants.$_id_" : 1
   },
   "indexDetails" : {
       "test.restaurants.$_id_" : {
           "valid" : true
       }
   },
   "valid" : true,
   "errors" : [ ],
   "ok" : 1
}

如果您看到 valid: true,则您的集合的所有方面都是有效的,您可以在生产中安全地使用此集合中的数据。

结论

在本教程中,我们学习了如何完成正在运行的 MongoDB 数据库服务器的物理文件系统级备份。

要了解有关备份 MongoDB 数据库的各种方法的更多信息,请参阅 MongoDB 手册

由于 DigitalOcean 方便的 Droplet Snapshots 功能,这种特殊的备份技术成为可能。 要了解有关 Droplet 快照的更多信息,请参阅 快照文档

此外,您可以使用备份功能安排这些快照自动发生。 要了解有关 Droplet 备份的更多信息,请参阅 备份介绍