使用 MinIO Jumbo 加速 MongoDB 备份

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 部署。
先决条件
要完成本教程,您将需要
- 在裸机或 Kubernetes 上运行的 MinIO 服务器。 如果您还没有运行它,请在 裸机 或 Kubernetes 上安装 MinIO。
- MinIO 客户端 (mc) 用于访问 MinIO 服务器。 以下是 在本地安装 mc 的方法。
- MongoDB 社区版,以便我们可以运行 MongoDB。
- MongoDB Shell 用于管理和使用 MongoDB。
安装 mongodump
打开此 链接 下载 MongoDB 的数据库工具。 如果您使用的是 Linux 命令行,请单击“下载”按钮右侧的“复制链接”。 然后,使用命令行工具(如 wget
或 curl
)下载安装包。 接下来,解压缩文件并将可执行文件复制到路径中的目录。
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 与我们联系。