使用 MinIO 版本控制和回滚实现持续数据保护
MinIO包含多种机制来确保数据的持续保护。在之前的博文中,我讨论了MinIO如何在对象级别应用擦除编码和BitRot保护以防止数据丢失和损坏。使用MinIO的最高奇偶校验设置(EC:8),您可以丢失多达一半的总驱动器,但仍然可以恢复数据。
但是,损坏并不是数据唯一的风险——存在意外或恶意修改、覆盖或删除的可能性。我们每个人都记得打开一个数据文件,修改它并错误地覆盖原始文件。在网络环境中,这种风险被放大,因为许多用户和应用程序可能试图使用相同的文件或文件组。
MinIO彻底消除了这种负担。与所有对象存储解决方案一样,一旦写入,对象就不能更改。在MinIO中,对对象的所有操作都是原子的,并且在启用版本控制的情况下,任何对象都不会丢失。一个典型的流程涉及用户或应用程序从MinIO服务器获取对象,在本地修改它,然后将这个新版本上传回服务器。原始对象成为记录系统的一部分,因为它不能被修改,并且随着每个新版本的保存,可以回滚更改以使用以前的版本。这也会使较新的版本保持完整,因为即使添加了较新的版本。
MinIO按照亚马逊S3的结构/实现独立地对每个对象进行版本控制。当每个对象的新版本被写入时,都会分配一个唯一的版本ID。应用程序可以指定一个版本ID来访问特定时间该对象的特定版本。MinIO在同一个存储桶中保留对象的多个变体,并提供一种机制(下面的教程)来保留、检索和恢复存储桶中每个对象的每个版本。
MinIO版本控制不依赖于卷级快照。当我们处理少量数据时,这种快照是数据保护的一种很好的方法,但每个对象的版本控制更细粒度且更高效。当您创建整个卷的完整时间点副本时,回滚到对象的先前版本需要读取整个卷的快照才能获取特定对象。一些存储链将快照连接在一起,因此它们必须顺序恢复。此过程类似于搜索整个图书馆的多个版本以查找一篇单独的文章——它既缓慢又痛苦。
版本控制形式的持续数据保护内置于MinIO中。版本控制在存储桶级别启用,如上所述,MinIO会自动为对象的每个版本创建一个唯一的版本ID。MinIO通过使用删除标记来防止意外删除。当一个已版本化的对象被删除时,它不会从系统中移除。相反,会创建一个删除标记,并成为对象的当前版本。当请求该对象时,MinIO会返回404未找到消息。移除删除标记将使对象再次可见。类似地,如果写入对象的新的版本,则对象的老版本和新版本都存在,每个版本都有其自己的唯一标识符。只需移除其删除标记,就可以根据需要快速轻松地公开各个对象的旧版本。
如何使用MinIO持续保护数据
启用版本控制后,MinIO会跟踪每个操作,并且永远不会覆盖任何对象。您可以使用MinIO控制台、MinIO客户端 (mc)、SDK或命令行来应用版本控制并使用对象的不同版本。
此强大功能易于使用,但需要注意一些事项。只有管理员和具有相应权限的用户才能更改版本控制配置。一旦为存储桶启用,版本控制就不能禁用,只能暂停。
版本控制存在权衡——虽然它可以保护数据免受意外操作的影响,但它会导致存储桶大小增加,因为存储桶会保存对象的多个版本。这可以通过使用生命周期管理来缓解,以删除不再需要的对象的版本。MinIO生命周期管理工具是一种基于策略的方法,用于确定数据在磁盘上保留多长时间然后再被移除——但这将留待以后的博文进行讨论。
在本教程中,我将使用MinIO客户端或mc
来向您展示如何在任何时间点查看存储桶或对象,以及如何使用单个命令回滚PUT和DELETE等操作。
首先下载Kubernetes、Linux、MacOS、Docker或源代码的最新版MinIO和MinIO客户端并安装它们。如果您只是想试用一下,只需下载mc
即可使用我们的play
环境。
我将从本地机器上的文件目录开始。请注意,我在Windows 10上运行Ubuntu 20.04,在Windows Subsystem for Linux 2上运行。这些只是一些我用作示例的小猫照片。您不必使用小猫照片,可以随意替换与您的用例更相关的文件,例如电子商务目录的产品照片或网络设备的日志数据。对MinIO来说,它们都是对象。
要在MinIO play测试环境中创建存储桶,请键入:./mc mb play/msarrel
。
通过输入./mc version enable play/msarrel
启用版本控制,我可以看到版本控制已启用。
现在我将我的小猫照片复制到play上的已版本化存储桶中,使用./mc cp /mnt/c/Documents\ and\ Settings/msarr/Downloads/kittens/*.* play/msarrel
,我可以看到文件已复制到play上的存储桶中。
当我键入mc ls play/msarrel
时,我看到本地文件现在保存在MinIO中的对象。
出于本教程的目的,我将从存储桶中下载一张小猫照片,在本地机器上对其稍作修改,然后再次将其复制到同一个存储桶中。./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是在大约一个小时后创建的。您还可以看到每个对象版本都有其自己的唯一标识符,这使得可以直接使用特定的对象版本成为可能。
现在到了有趣的部分:如果我的新版本对象不是我想要的怎么办?如果我运行的是普通的Файловая система,我将无法摆脱它,因为它会覆盖原始版本。这就是我本地Файловая система中发生的情况。救救我,MinIO!
MC回滚 - 没有对象被遗忘
MinIO包含一个回滚功能,使您可以列出、检查、检索或回滚对象,使其恢复到之前的状态。MC回滚是一个更高级别的功能,可以应用于大多数MC命令集以处理对象的不同版本。-rewind
选项可用于list
、tree
、du
、cat
、head
、cp
、rm
、tag
和stat
,因此您可以处理不同时间点的存储桶和对象,而无需覆盖任何内容。
--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之前,昨天我的存储桶是什么样子。
我可以运行./mc undo play/msarrel/PXL_20210619_183244637.jpg --last 1
来恢复对象上最近一次PUT操作。如果我不确定是否要这样做,那么我还可以添加--dry-run
标志来查看对象会发生什么变化。
让我们来看一个回滚单个对象的简单示例。场景是一个用户告诉我他意外删除了一个文件并要求我恢复它。我可以在不到一分钟的时间内完成此操作。
当然,kitten1.jpg 在我们存储桶的最新版本中不存在。
已删除的对象仍然存在于 MinIO 上,但当前版本被标记为已删除。我所要做的就是删除该版本,然后我就可以使用大多数 MC 命令中的 `--vid` 标志来处理特定版本。首先,我将列出所有对象的版本,以便记下带有删除标记的意外删除对象的版本 ID。然后我将删除标记为已删除的版本,最后我将列出存储桶的内容,以便您可以看到对象已恢复。
./mc ls --versions play/msarrel
./mc rm play/msarrel/kitten1.jpg --vid e7fc7cf4-f4bb-443a-8db9-25c3dd5fa8d1
./mc ls play/msarrel
我还可以使用带有 `--rewind` 标志的 `mc cp` 命令将对象的特定版本复制到另一个位置。在本例中,我将把 PXL_20210619_183244637.jpg 的旧版本复制到我的本地文件系统,以便我可以打开它并对其进行操作。我输入 `./mc cp --rewind 1d play/msarrel/PXL_20210619_183244637.jpg new.jpg` 将我昨天文件版本复制到我的本地目录作为 new.jpg。
MC 回滚也可以在 MinIO 控制台的对象浏览器中使用,方法是导航到我的存储桶并点击右上方的“回滚”图标,然后选择要将对象回滚到的日期和时间。我将选择一个在初始文件写入之后且在我覆盖测试对象之前的时间点。一旦我回滚了存储桶,我就可以恢复、复制、下载等操作,使用对象之前的版本。
如果您确实希望确保没有版本被删除或篡改,那么您可以使用 `./mc mb -l` 启用对象锁定创建存储桶,或者稍后使用 `./mc retention` 添加它。
保留和锁定是在攻击后您面临审计时重要的概念。假设有一天您注意到有人未经授权访问您的存储桶。启用对象锁定后,对象的任何版本都不会被删除。它们是不可变的且只读的,因此在攻击中不会被损坏或删除。一旦您知道审计员的法律要求,您可以使用 `retention` 命令为存储桶设置治理,使其在审计完成之前无法修改。
或者,如果您想节省存储空间,您可以根据日期和时间清除对象版本。例如,命令 `./mc rm play/msarrel/ --recursive --versions --rewind 365d` 将删除所有对象在 365 天前的所有版本。
使用 MinIO 版本控制和回滚实现持续数据保护
MinIO 通过多种机制防止数据丢失和损坏。当为存储桶启用版本控制时,对象可以防止意外或恶意覆盖和删除。与基于卷的方法不同,MinIO 可以立即并使用单个命令恢复覆盖或删除的对象,以便用户在发生原本会造成灾难性和耗时错误后能够快速恢复工作。 虽然这种方法消除了对快照的需求,但我们认识到许多客户将继续这样做 - 以获得安全可靠的保障。
立即下载 MinIO,了解运行您自己的数据时间机器有多么容易。如果您有任何具体问题,请发送邮件至 hello@min.io 或加入 Slack 上的讨论。我们随时为您提供帮助。