如何使用 Droplet 快照备份 MongoDB

介绍

定期数据库备份是防范意外数据损失事件的关键步骤。 一般来说,备份有两大类:文件系统级("物理")备份和逻辑备份. 文件系统级备份涉及在某一时间点对基础数据文件进行快照,并允许数据库使用快照文件中所捕获的状态来清理恢复自己. 逻辑备份涉及使用一个工具(如 " mongodump " 或 " pg_dump " )将数据从数据库导出为备份文件,然后使用相应的还原工具(如 " mongodump " 或 " psql " )恢复.

在本指南中,我们将展示如何使用 [Droplet Snapshots] 执行运行 MongoDB 安装的文件系统级备份(https://andsky.com/tech/tutorials/digitalocean-backups-and-snapshots-explained)。

<$>[注] 注: 如在DigitalOcean备份(https://andsky.com/tech/tutorials/understanding-digitalocean-droplet-backups)中详细说明的那样,使用Droplet snapshots时会产生一些性能影响,尤其是在高负荷的数据库中。 您应该先使用模拟负荷的非生产数据库来测试此过程,以确认该方法在您的生产部署中将工作。

前提条件

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

此指南将假定您已安装 MongoDB 3.2+,使用默认的 WiredTiger 存储引擎与日志启用. 此外,要使用本指南,重要的是将 dbpath 目录(包含数据文件的目录,默认情况下 /var/lib/mongodb)绘制到一个单一的卷。

一旦您登录到您的Droplet,并启动和运行MongoDB,您已经准备好开始。

步骤 1 — 验证您的 MongoDB 设置

我们将首先检查是否已启用日志。

Journaling 是 MongoDB 功能,可在数据库故障发生时通过将操作写入日志文件时提供耐用性。 有关 MongoDB 日志的更多信息,请参阅 MongoDB 手册

如果您遵循上述指南,登录将默认启用,以确认此情况,我们可以检查 MongoDB 配置文件。

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

1nano /etc/mongod.conf

你应该看到以下块:

1[label /etc/mongod.conf]
2# Where and how to store data.
3storage:
4  dbPath: /var/lib/mongodb
5  journal:
6    enabled: true
7#  engine:
8#  mmapv1:
9#  wiredTiger:

如果您使用的是 MongoDB 3.2+,默认存储引擎是 WiredTiger (MMAPv1 是 MongoDB 的原始存储引擎)。

我们现在将插入一些愚蠢的数据来测试备份和恢复程序。

第2步:输入测试数据

如果您已经开始使用清洁的服务器,但尚无任何数据,我们可以将一些样本数据插入愚蠢的餐馆收藏中,以进行演示。

首先,使用 MongoDB 壳连接到运行数据库:

1mongo

您应该看到以下Mongo壳提示:

 1MongoDB shell version: 3.2.19
 2connecting to: test
 3Server has startup warnings:
 42018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
 52018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
 62018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
 72018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
 82018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
 92018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
102018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
11>

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

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

1show collections

由于我们还没有将任何东西插入到数据库中,所以没有收藏,我们被带回了提示,没有输出。

让我们将文档插入到一个愚蠢的餐厅收藏中,我们将同时创建:

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

你应该看到以下结果:

1WriteResult({ "nInserted" : 1 })

这表明插入操作是成功的,因为餐厅收藏以前不存在,因此它同时创建。

让我们再次列出收藏:

1show collections

现在我们看到我们新创建的餐厅收藏:

1restaurants

现在我们已经在数据库中存储了一些样本数据,我们已经准备好备份它。

步骤 3 — 截图 MongoDB 滴滴

为了进行备份,我们将利用DigitalOcean Droplet Snapshots创建Droplet Snapshots,使我们能够在拍摄时点创建Droplet的图像,然后可以将此图像恢复到新的Droplet,在那里可以进行进一步的恢复操作。

鉴于我们正在使用 MongoDB 3.2+(有 WiredTiger 并启用日志),我们不需要在即时拍摄发生时暂停写入文件系统。一旦我们恢复图像并启动数据库,MongoDB 将从检查点恢复自己,然后从日志文件中重播操作,直到它达到即时拍摄发生的时刻。如果您有兴趣进一步探索日志,请参阅 MongoDB 手册

要开始拍摄过程,请 登录您的DigitalOcean帐户,导航到您的MongoDB Droplet,然后点击侧面栏中的 Snapshots 链接。

你应该看到以下快速:

Take Snapshot

<$>[注] 注意: 虽然在拍摄快照之前建议将您的Droplet下载,但在生产部署中,这可能并不总是可能的。

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

您应该看到下面的快照进度指标:

Snapshot Progress

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

我们现在已经准备好执行备份程序的恢复和验证。

步骤 4 – 恢复 MongoDB 滴滴

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

使用侧面栏返回 Snapshots ,并找到完成的 Droplet 截图。

Completed Snapshot

点击更多并选择创建滴滴

您将被带到 Create Droplet 菜单,在那里您将能够从您的快照中旋转一个新的 Droplet。

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

Choose Image

完成配置您的恢复 Droplet 并点击 Create . 一旦您的恢复 Droplet 启动并运行,登录它。

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

1sudo systemctl status mongod

你应该看到以下结果:

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

表示一切顺利,MongoDB 启动正确。

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

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

检查 MongoDB 是否使用systemctl 状态正确启动。

一旦 MongoDB 启动并运行,它将开始自我清理并恢复到拍摄时的状态,这可能需要几分钟,而mongo壳可能无法使用,直到完成。

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

1mongo

您现在将收到mongo壳提示:

 1[secondary_label Output]
 2MongoDB shell version: 3.2.19
 3connecting to: test
 4Server has startup warnings:
 52018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
 62018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
 72018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
 82018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
 92018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
102018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
112018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
12>

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

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

步骤5:检查数据完整性

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

<$>[注] 注: 在非常大的集合中,验证命令可能很慢,此外,所有阅读和写入都将被阻止在集合中,直到验证命令返回。

在本示例中,我们有一个名为餐厅的集合,我们要在其中运行验证命令。

从mongo壳中,运行 validate 命令:

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

你应该看到类似的输出如下:

 1{
 2    "ns" : "test.restaurants",
 3    "nrecords" : 1,
 4    "nIndexes" : 1,
 5    "keysPerIndex" : {
 6    	"test.restaurants.$_id_" : 1
 7    },
 8    "indexDetails" : {
 9    	"test.restaurants.$_id_" : {
10    		"valid" : true
11    	}
12    },
13    "valid" : true,
14    "errors" : [ ],
15    "ok" : 1
16}

如果您看到有效:真实,您的收藏的所有方面都是有效的,您可以在生产中安全地使用该收集的数据。

结论

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

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

为了了解更多关于Droplet Snapshots的信息,请参阅 Snapshot docs

此外,您还可以使用备份功能自动安排这些快照。 有关 Droplet Backups 的更多信息,请参阅 Backups Introduction

Published At
Categories with 技术
comments powered by Disqus