使用 MinIO Jumbo 加速 MongoDB 备份

Accelerating MongoDB Backup with MinIO Jumbo

MongoDB 是最广泛使用(如果不是最广泛使用的话)的分布式文档数据库之一。 MongoDB 以灵活的文档数据模型与强大的功能相结合而闻名,例如对临时查询、辅助索引和实时聚合的支持。 企业依赖 MongoDB 及其横向扩展架构来处理大量非结构化数据,从而构建快速发展并透明扩展的业务和 Web 应用程序。 该数据库提供多种格式,而今天我们将重点介绍 MongoDB 社区服务器。

任何数据库在投入生产之前都应配备可靠、坚不可摧的备份和恢复策略。 由于 MongoDB 在企业中扮演着至关重要的角色,因此必须备份它保存的业务数据以实现 业务连续性和灾难恢复。 但是,备份 MongoDB 数据库是一个耗时且资源密集的过程。 本博客文章将介绍如何备份 MongoDB 副本集;分片集群需要更多努力和协调,如 MongoDB 文档 中所述。

Mongodump 是一个简单的小型 MongoDB 备份实用程序,它会从数据库创建 BSON 文件。 BSON 或二进制 JavaScript 对象表示法是 JSON 文档的二进制编码序列化。 JSON 是人类可读的,而 BSON 则不是。 BSON 对类型和长度信息进行编码,以便机器可以快速解析数据。 BSON 支持多种编程语言,例如 C、C++、C#、Java、JavaScript、PHP、Python、Ruby 和 Swift。 BSON 很轻巧,这意味着可以在 BSON 格式中存储大量数据,此外,BSON 文件在通过网络传输和写入存储时效率很高。 您可能会将 BSON 视为其他 二进制文件格式 的方式。 工作流程是运行 mongodump 并将 BSON 输出发送到 MinIO,以创建 MongoDB 副本集的远程快照。

免费的 mongodump 是一个便捷的 MongoDB 备份解决方案,但 mongodump 只是来自单个服务器的单个数据流。 结果是,mongodump 在一定程度上效果很好,但在需要大规模提供性能时就会失效。 缓慢的备份性能降低了企业 BC/DR 策略的有效性,并阻止了为分析和进一步开发克隆数据库。 当企业达到这一点时,他们通常会升级到托管版或企业版,或者编写自己的脚本来使用底层文件系统进行备份。 但如果有一种方法可以使 mongodump 的输出并行化以实现更高的速度和规模呢?

不要害怕,MinIO Jumbo 在这里!

我们开发了 MinIO Jumbo 用于将非常大的流(例如数据库备份)上传/下载到/从 MinIO。 Jumbo 通过 STDIN 管道接受内容,或从存储中读取内容,并将其并行上传到 MinIO 服务器。 在 mongodump 的情况下,Jumbo 从源接收管道流,填充并发缓冲区,并将其并行上传到服务器。 默认缓冲区大小为 256 GiB,但您可以配置缓冲区大小以满足您的性能要求。 每个缓冲区的内容将成为一个对象,该对象将作为多部分上传上传到 MinIO。

MinIO Jumbo 与 MinIO 部署结合使用,可以为备份创建一个灵活、持久、高性能的家,没有限制。 MinIO 能够支持最苛刻的工作负载,但也非常适合作为备份存储,因为它具有以下特点:

  • 高性能: MinIO 在 单个 32 节点 NVME 集群 中能够实现 1.32 Tbps 的 PUT 吞吐量和 2.6 Tbps 的 GET 吞吐量。 这意味着备份和恢复操作运行得更快,减少了停机对业务的潜在影响。
  • 针对各种对象大小进行优化: MinIO 可以轻松处理任何大小的对象。 由于 MinIO 与对象数据一起原子地写入元数据,因此不需要单独的元数据数据库。 这大大减少了小文件 PUT 和 GET 的响应时间。 Jumbo 会并行化大型对象上传,以尽可能高效地使用网络。
  • 内联和严格一致: 所有 I/O 均与内联 擦除编码、Bitrot 哈希和加密同步提交,使 MinIO 成为原子且立即一致的。 S3 API 能够抵御上传或下载过程中的中断或重启,因此备份不会消失。 最后,没有数据缓存或暂存,这意味着所有备份操作都保证完成。
  • 专为商品硬件打造: 商用 现成硬件 意味着您将在专用设备上节省大量成本。 在当今的经济环境下,随着备份数据增长到 PB 级,您将获得更高的性价比。

MinIO Jumbo 和 mongodump 教程

我们将使用 mongodump 和 MinIO Jumbo 将本地 MongoDB 数据库备份到 MinIO 部署。

先决条件

要完成本教程,您将需要

  1. 在裸机或 Kubernetes 上运行的 MinIO 服务器。 如果您还没有运行它,请在 裸机Kubernetes 上安装 MinIO。
  2. MinIO 客户端 (mc) 用于访问 MinIO 服务器。 以下是 在本地安装 mc 的方法。
  3. MongoDB 社区版,以便我们可以运行 MongoDB。
  4. MongoDB Shell 用于管理和使用 MongoDB。

安装 mongodump

打开此 链接 下载 MongoDB 的数据库工具。 如果您使用的是 Linux 命令行,请单击“下载”按钮右侧的“复制链接”。 然后,使用命令行工具(如 wgetcurl)下载安装包。 接下来,解压缩文件并将可执行文件复制到路径中的目录。

mkdir mongodbtools
cd mongodbtools
wget mongodb-database-tools-*-100.7.0.tgz
tar -zxvf mongodb-database-tools-*-100.7.0.tgz
sudo cp * /usr/local/bin

此时,您只需输入 mongodump 即可进行备份并将其保存到本地。

创建 MongoDB 数据库

如果您已经拥有 MongoDB 数据库,那么您可以跳过此步骤。 如果,像我一样,您没有安装 MongoDB,但想要尝试 MinIO Jumbo,请按照本节中的步骤创建 MongoDB 数据库并填充它。 这些步骤基于 入门 - MongoDB 手册

$ mongosh
...
test> 
test> use examples
Switched to db examples
examples> db.movies.insertMany([ { title: 'Titanic', year: 1997, genres: ['Drama', 'Romance'], rated: 'PG-13', languages: ['English', 'French', 'German', 'Swedish', 'Italian', 'Russian'], released: ISODate("1997-12-19T00:00:00.000Z"), awards: { wins: 127, nominations: 63, text: 'Won 11 Oscars. Another 116 wins & 63 nominations.' }, cast: ['Leonardo DiCaprio', 'Kate Winslet', 'Billy Zane', 'Kathy Bates'], directors: ['James Cameron'] }, { title: 'The Dark Knight', year: 2008, genres: ['Action', 'Crime', 'Drama'], rated: 'PG-13', languages: ['English', 'Mandarin'], released: ISODate("2008-07-18T00:00:00.000Z"), awards: { wins: 144, nominations: 106, text: 'Won 2 Oscars. Another 142 wins & 106 nominations.' }, cast: ['Christian Bale', 'Heath Ledger', 'Aaron Eckhart', 'Michael Caine'], directors: ['Christopher Nolan'] }, { title: 'Spirited Away', year: 2001, genres: ['Animation', 'Adventure', 'Family'], rated: 'PG', languages: ['Japanese'], released: ISODate("2003-03-28T00:00:00.000Z"), awards: { wins: 52, nominations: 22, text: 'Won 1 Oscar. Another 51 wins & 22 nominations.' }, cast: ['Rumi Hiiragi', 'Miyu Irino', 'Mari Natsuki', 'Takashi Naitè'], directors: ['Hayao Miyazaki'] }, { title: 'Casablanca', genres: ['Drama', 'Romance', 'War'], rated: 'PG', cast: ['Humphrey Bogart', 'Ingrid Bergman', 'Paul Henreid', 'Claude Rains'], languages: ['English', 'French', 'German', 'Italian'], released: ISODate("1943-01-23T00:00:00.000Z"), directors: ['Michael Curtiz'], awards: { wins: 9, nominations: 6, text: 'Won 3 Oscars. Another 6 wins & 6 nominations.' }, lastupdated: '2015-09-04 00:22:54.600000000', year: 1942 }])

输入此命令以验证文档是否已添加到集合中

db.movies.find( { } )

现在,我们已经在 movies 集合中拥有数据,可以对其进行备份。 请记住,如果您已经拥有一个填充的集合,则可以对其进行备份。

安装 MinIO Jumbo

请通过 hello@min.io 与我们联系获取 Jumbo 二进制文件。

设置身份验证变量

export JUMBO_ACCESS_KEY=<Your-MinIO-Access-Key> JUMBO_SECRET_KEY=<Your-MinIO-Secret-Key>

现在我们准备使用 Jumbo。

使用 mongodump 和 Jumbo 进行备份

我们将使用 mongodump 进行备份,然后使用 Jumbo 将备份快速高效地存储到 MinIO 中。 Mongodump 将备份到 STDOUT,并将此输出管道到 Jumbo。 由于我们使用的是 STDOUT,因此 mongodump 仅限于一次备份单个数据库中的单个集合。

如果您输入以下内容,您将在监视器上看到您的集合内容飞过,因为它们被写入 STDOUT。 这告诉您 MongoDB 部分一切正常。

mongodump --db=examples --collection=movies --out="-"

您可以随意替换您的数据库和集合名称。

在您的 MinIO 部署中创建一个存储备份的桶

mc mb backup

接下来,我们将 mongodump 的输出管道到 Jumbo,并将其写入指定的 MinIO 桶。 请注意,Jumbo 版本可能会随着时间的推移而发生变化。

mongodump --db=examples --collection=movies --out="-" | ./jumbo_0.1-rc2_linux_amd64 put http://<Your-MinIO-Address>:9000/backup/mongo-backup-1

MinIO Jumbo 加速备份

如果您正在努力实现备份目标,那么您需要 MinIO Jumbo 来并行化并加快将备份写入对象存储的速度。 Jumbo 使您能够使用所有可用带宽将备份文件写入 MinIO。 鉴于 MinIO 是您可以购买的最快的对象存储,并且 Jumbo 使网络达到最大值,这意味着备份速度的唯一限制是源系统本身。

如果您对 Jumbo 有任何疑问,或者想要下载二进制文件,请通过电子邮件 hello@min.io 与我们联系。