介绍
定期数据库备份是防止意外数据丢失事件的关键步骤。 一般来说,有两大类备份:文件系统级(“物理”)备份和逻辑备份。 文件系统级备份涉及在某个时间点对底层数据文件进行快照,并允许数据库使用快照文件中捕获的状态完全恢复自身。 逻辑备份涉及使用工具(例如 mongodump
或 pg_dump
)将数据从数据库导出到备份文件,然后使用相应的恢复工具(例如 mongorestore
或 psql <
)。
在本指南中,我们将演示如何使用 Droplet Snapshots 对正在运行的 MongoDB 安装执行文件系统级备份。 此外,我们将介绍如何从快照映像执行恢复。
注意: 如 DigitalOcean 备份 指南 中所述,使用 Droplet 快照时会产生一些性能影响,尤其是在高负载数据库上。 您应该首先使用具有模拟负载的非生产数据库测试此过程,以验证此方法是否适用于您的生产部署。
先决条件
在开始使用本指南之前,请确保您已完成以下必备步骤:
- 具有 sudo 权限的非 root 用户的 Ubuntu 16.04 Droplet,详见 使用 Ubuntu 16.04 的初始服务器设置
- MongoDB安装和配置,详见How to Install MongoDB on Ubuntu 16.04
本指南将假设您已安装 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
既然我们已经在数据库中存储了一些示例数据,我们就可以备份它了。
- 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 备份的更多信息,请参阅 备份介绍 。