介绍
定期数据库备份是防范意外数据损失事件的关键步骤。 一般来说,备份有两大类:文件系统级("物理")备份和逻辑备份. 文件系统级备份涉及在某一时间点对基础数据文件进行快照,并允许数据库使用快照文件中所捕获的状态来清理恢复自己. 逻辑备份涉及使用一个工具(如 " 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时会产生一些性能影响,尤其是在高负荷的数据库中。 您应该先使用模拟负荷的非生产数据库来测试此过程,以确认该方法在您的生产部署中将工作。
前提条件
在您开始使用本指南之前,请确保您完成了以下前提步骤:
- 具有 sudo 特权的非根用户的 Ubuntu 16.04 Droplet,如下所述(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04) * MongoDB 已安装和配置,如下所述(How to Install MongoDB on Ubuntu 16.04)(https://andsky.com/tech/tutorials/how-to-install-mongodb-on-ubuntu-16-04)
此指南将假定您已安装 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 链接。
你应该看到以下快速:
<$>[注] 注意: 虽然在拍摄快照之前建议将您的Droplet下载,但在生产部署中,这可能并不总是可能的。
给你的快照一个描述性的名称,然后点击 Take Live Snapshot 按钮开始快照过程。
您应该看到下面的快照进度指标:
一旦快照完成,您将能够从图像中创建一个新的Droplet,或将正在运行的Droplet恢复到您的快照图像中捕获的状态。
我们现在已经准备好执行备份程序的恢复和验证。
步骤 4 – 恢复 MongoDB 滴滴
我们现在将创建一个新的Droplet,它将从我们刚刚创建的图像中恢复,在我们的MongoDB数据库中可用的数据将是拍摄时可用的数据。
使用侧面栏返回 Snapshots ,并找到完成的 Droplet 截图。
点击更多
并选择创建滴滴
。
您将被带到 Create Droplet 菜单,在那里您将能够从您的快照中旋转一个新的 Droplet。
选择与您之前拍摄的快照相匹配的图像,在这种情况下,我们将使用 mongo-backup-test 图像。
完成配置您的恢复 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。