使用 MinIO 版本控制和倒带进行持续数据保护

使用 MinIO 版本控制和倒带进行持续数据保护

MinIO 包括多种机制,确保数据得到持续保护。在较早的博客文章中,我讨论了 MinIO 如何在对象级别应用纠删码和 BitRot 保护,以防止数据丢失和损坏。使用 MinIO 的最高奇偶校验设置 (EC:8),您可以丢失多达一半的驱动器并仍然恢复数据。

然而,损坏并不是数据面临的唯一风险 - 存在意外或恶意修改、覆盖或删除的可能性。我们每个人都可以回忆起打开一个数据文件,修改它并错误地覆盖原始文件。在大量用户和应用程序可能尝试使用相同文件或文件组的网络设置中,风险会被放大。

MinIO 完全消除了这种负担。与所有对象存储解决方案一样,对象一旦写入就无法更改。在 MinIO 中,对一个对象的所有操作都是原子的,并且在启用版本控制的情况下,不会丢失任何对象。一个典型的工作流涉及用户或应用程序从 MinIO 服务器获取对象,在本地修改它,然后将这个新版本上传回服务器。原始对象成为记录系统的一部分,因为它无法修改,并且随着每个新版本的保存,可以回滚更改以使用以前的版本。这也使较新的版本保持不变,因为甚至添加了较新的版本。    

MinIO 按照 Amazon 的 S3 结构/实现独立地对每个对象进行版本化。写入对象的每个新版本时,都会为其分配一个唯一的版本 ID。应用程序可以指定版本 ID 以在特定时间访问该对象的特定版本。MinIO 在同一桶中保留一个对象的多个变体,并提供一种机制(下面的教程)来保存、检索和恢复存储在桶中的每个对象的每个版本。

MinIO 版本控制不依赖于卷级快照。当我们处理小数据量时,这样的快照是一种很好的数据保护方法,但每个对象的版本控制更加精细和高效。当您制作整个卷的完整时间点副本时,回滚到对象的先前版本需要读取整个卷的快照才能到达特定对象。一些存储将快照链接在一起,因此必须按顺序恢复它们。这个过程类似于搜索整个图书馆的多个版本只是为了找到一篇文章——既缓慢又痛苦。  

MinIO 内置了版本控制形式的持续数据保护。版本控制在桶级别启用,如上所述,MinIO 会自动为对象的每个版本创建一个唯一的版本 ID。MinIO 通过使用删除标记来防止意外删除。删除版本化对象时,它不会从系统中删除。取而代之的是,一个删除标记被创建并成为该对象的当前版本。当请求该对象时,MinIO 返回 404 Not Found 消息。移除删除标记会使对象再次可见。类似地,如果写入了对象的新版本,则对象的旧版本和新版本都存在,每个版本都有自己的唯一标识符。只需删除其删除标志,即可根据需要快速轻松地公开单个对象的旧版本。            

如何使用 MinIO 持续保护数据

启用版本控制后,MinIO 会跟踪每一个操作并且永远不会覆盖任何对象。您可以使用 MinIO 控制台、MinIO 客户端 (mc)、SDK 或命令行来应用版本控制并使用不同版本的对象。

这个强大的功能很容易使用,但有几点需要牢记。只有管理员和具有适当权限的用户才能更改版本控制配置。一旦为存储桶启用版本控制,就不能禁用它,它只能被暂停。

版本控制有一个折衷——虽然它可以保护数据免受意外操作的影响,但它会导致更大的存储桶大小,因为存储桶包含多个版本的对象。这可以通过使用生命周期管理删除不再需要的对象版本来缓解。MinIO 生命周期管理工具是一种基于策略的方法,它确定数据在被删除之前在磁盘上保留的时间——但那是另一篇博文的内容。

对于本教程,我将使用 MinIO 客户端,或者mc向您展示如何在任何时间点查看存储桶或对象,并使用单个命令回滚 PUT 和 DELETE 等操作。  

首先为 Kubernetes、Linux、MacOS、Docker 或源代码和 MinIO 客户端下载最新版本的 MinIO 并安装它们。如果您只是尝试一下,play只需下载mc.

我将从本地计算机上的文件目录开始。请注意,我在适用于 Linux 2 的 Windows 子系统上运行 Windows 10 和 Ubuntu 20.04。这些只是我用作示例的几张小猫照片。您不必使用小猫照片,可以随意替换与您的用例更相关的文件,例如电子商务目录的产品照片或来自网络设备的日志数据。这都是 MinIO 的对象。


pasted image 0 - 2023-04-03T122344.271.png


要在 MinIO play 测试环境中创建一个桶,请输入:./mc mb play/msarrel.

通过输入启用版本控制./mc version enable play/msarrel,我可以看到版本控制已打开:


pasted image 0 - 2023-04-03T122405.670.png


现在,我将我的小猫照片复制到播放时的版本化存储桶中./mc cp /mnt/c/Documents\ and\ Settings/msarr/Downloads/kittens/*.* play/msarrel,我可以看到文件已复制到我播放时的存储桶中:


pasted image 0 - 2023-04-03T122429.398.png


我看到本地文件现在是在我键入时保存在 MinIO 中的对象mc ls play/msarrel


pasted image 0 - 2023-04-03T122452.397.png


出于本教程的目的,我将从我的存储桶中下载一张小猫照片,在我的本地计算机上对其进行稍微修改,然后再次将其复制到同一个存储桶中。./mc cp /mnt/c/Documents\ and\ Settings/msarr/Downloads/kittens/PXL_20210619_183244637.jpg play/msarrel

对象的修改版本已替换原始版本,但原始版本仍然存在。输入命令可以看到./mc ls --versions play/msarrel对象PXL_2021_0619_183244637.jpg有两个版本。有一个 v1 与其他对象同时创建,大约一个小时后创建了一个 v2。您还可以看到,每个对象版本都有自己唯一的标识符,从而可以直接使用特定的对象版本。


pasted image 0 - 2023-04-03T122517.538.png


现在有趣的部分来了:如果我的对象的新版本不是我想要的怎么办?如果我运行的是通常的文件系统,我会坚持使用它,因为它会覆盖原始版本。这就是我的本地文件系统中发生的事情。救救我,MinIO!

MC Rewind - 无遗物

MinIO 包括一个倒带功能,使您能够像以前一样列出、检查、检索或回滚对象。MC Rewind 是一个更高级别的功能,可以应用于大多数 MC 命令集以处理对象的不同版本。该  -rewind选项可用于listtreeducathead, , cp,等,rm因此您可以在不同的时间点使用存储桶和对象,而不会覆盖任何内容。tagstat

--rewind可以通过多种不同方式调用该标志,因此您可以找到您要查找的对象的先前版本。--rewind标志后面可以跟一个时间间隔(例如 3d)或特定时间(例如 2020.03.24T10:00),以使用当时处于活动状态的对象的版本。

继续我们的示例,我需要将我的对象 PXL_20210619_183244637.jpg 回滚到以前的版本。如果你还记得我的输出,./mc ls --versions我知道我想要的版本是在 2021.09.25T10:15 之前上传到 MinIO 的,它比当前版本旧一个版本。

我通过运行来确认这一点./mc ls --rewind 1d play/msarrel,并且在覆盖 PXL_20210619_183244637.jpg 之前,我看到了我的存储桶昨天的样子。


pasted image 0 - 2023-04-03T122545.067.png



我可以运行./mc undo play/msarrel/PXL_20210619_183244637.jpg --last 1以恢复对我的对象的最新 PUT 操作。如果我不确定那是我想要做的,那么我还可以添加标志--dry-run以查看对象发生了什么:


pasted image 0 - 2023-04-03T122609.357.png



让我们看一个回滚一个对象的简单例子。场景是用户告诉我他不小心删除了一个文件,让我恢复它。我可以在一分钟内完成。

果然,我们最新版本的存储桶中没有 kitten1.jpg。


pasted image 0 - 2023-04-03T122635.038.png



删除的对象在 MinIO 上仍然存在,但当前版本被标记为已删除。我所要做的就是删除该版本,然后我可以在大多数 MC 命令中使用 `--vid` 标志来处理特定版本。首先,我将列出对象的所有版本,以便我可以用删除标记记下意外删除对象的版本 ID。然后我将删除标记为已删除的版本,最后我将列出存储桶的内容,以便您可以看到对象已恢复。

./mc ls --versions play/msarrel


pasted image 0 - 2023-04-03T122658.402.png


./mc rm play/msarrel/kitten1.jpg --vid e7fc7cf4-f4bb-443a-8db9-25c3dd5fa8d1

./mc ls play/msarrel


pasted image 0 - 2023-04-03T122719.395.png



我还可以使用mc cp命令 with--rewind将特定版本的对象复制到另一个位置。在这种情况下,我要将旧版本的 PXL_20210619_183244637.jpg 复制到我的本地文件系统,以便我可以打开它并使用它。我输入./mc cp --rewind 1d play/msarrel/PXL_20210619_183244637.jpg new.jpg以将昨天的文件版本复制到我的本地目录中,作为 new.jpg。  


pasted image 0 - 2023-04-03T122743.597.png



MC Rewind 也可以从对象浏览器中的 MinIO 控制台使用,方法是导航到我的存储桶并单击右上角的 Rewind 图标,然后选择要将对象倒回的日期和时间。我将选择初始文件写入之后和覆盖测试对象之前的时间。一旦我倒回存储桶,我就可以在我的对象的早期版本上恢复、复制、下载等。




如果您真的想确保没有版本被删除或篡改,那么您可以创建启用了对象锁定的存储桶,./mc mb -l或者稍后使用添加它./mc retention

如果您在攻击后面临审计,保留和锁定是重要的概念。假设有一天您发现有人未经授权访问您的存储桶。启用对象锁定后,对象的任何版本都不会被删除。它们是不可变的和只读的,因此它们不会在攻击中被损坏或删除。了解审计员的法律要求后,您可以使用retention命令在存储桶上设置治理,以便在审计完成之前无法修改它。

或者,如果您想节省存储空间,您可以根据日期和时间清除对象版本。例如,该命令  ./mc rm play/msarrel/ --recursive --versions --rewind 365d将删除超过 365 天的所有对象的所有版本。    

使用 MinIO 版本控制和倒带进行持续数据保护

MinIO 通过多种机制防止数据丢失和损坏。为存储桶启用版本控制时,可以防止对象被意外或恶意覆盖和删除。与基于卷的方法不同,MinIO 可以使用单个命令立即恢复被覆盖或删除的对象,因此用户可以在发生灾难性且耗时的错误后快速恢复工作。虽然这种方法消除了拍摄快照的需要,但我们认识到许多客户将继续这样做 - 实现腰带和背带的舒适度。

立即下载 MinIO,以便您了解运行自己的数据时间机器是多么容易。如果您有任何具体问题,请在 hello@min.io 上给我们留言或在Slack上加入对话。我们在这里提供帮助。


上一篇 下一篇