对象管理
对象是二进制数据,例如图像、音频文件、电子表格,甚至二进制可执行代码。“二进制大对象”或“blob”这个术语有时与对象存储相关联,尽管 blob 的大小可以从几字节到几 TB 不等。像 MinIO 这样的对象存储平台提供了专用工具和功能,用于通过标准的 S3 兼容 API 来存储、列出和检索对象。
驱动器的独占访问
MinIO 要求对提供给对象存储的驱动器或卷进行独占访问。任何其他进程、软件、脚本或个人都不应直接对提供给 MinIO 的驱动器或卷,或者 MinIO 放置在它们上面的对象或文件执行任何操作。
除非得到 MinIO 工程团队的指示,否则不要使用脚本或工具直接修改、删除或移动所提供驱动器上的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点移动到另一个。这类操作极有可能导致大范围的损坏和数据丢失,超出 MinIO 的修复能力。
MinIO 对象存储使用存储桶来组织对象。存储桶类似于文件系统中的顶级驱动器、文件夹或目录(/mnt/data 或 C:\),每个存储桶可以容纳任意数量的对象。
MinIO 服务器上对象的结构可能类似于以下内容:
/ #root
/images/
2020-01-02-MinIO-Diagram.png
2020-01-03-MinIO-Advanced-Deployment.png
MinIO-Logo.png
/videos/
2020-01-04-MinIO-Interview.mp4
/articles/
/john.doe/
2020-01-02-MinIO-Object-Storage.md
2020-01-02-MinIO-Object-Storage-comments.json
/jane.doe/
2020-01-03-MinIO-Advanced-Deployment.png
2020-01-02-MinIO-Advanced-Deployment-comments.json
2020-01-04-MinIO-Interview.md
根据示例结构,管理员将创建 /images、/videos 和 /articles 存储桶。客户端应用程序使用该对象的完整“路径”(包括所有中间前缀)将对象写入这些存储桶。
MinIO 支持使用前缀的多层嵌套目录和对象,以支持最动态的对象存储工作负载。MinIO 使用 / 作为分隔符,从完整的对象路径中自动推断出中间前缀,例如 /articles/john.doe。客户端和管理员不应手动创建这些前缀。
客户端和管理员都无需手动创建中间前缀,因为 MinIO 会自动从对象名称中推断它们。
路径 vs 虚拟主机存储桶访问
MinIO 支持路径样式(默认)和虚拟主机样式的存储桶查找。
例如,考虑一个分配了完全限定域名(FQDN)为 minio.example.net 的 MinIO 部署:
使用路径样式查找时,应用程序指定到存储桶的完整路径,例如
minio.example.net/mybucket。使用虚拟主机样式查找时,应用程序将存储桶指定为子域名,例如
mybucket.minio.example.net/。
某些应用程序在对 MinIO 执行 S3 操作时,可能需要或期望支持虚拟主机查找。要启用虚拟主机存储桶查找,您必须将 MINIO_DOMAIN 环境变量设置为一个解析到该 MinIO 部署的FQDN。
如果您配置了 MINIO_DOMAIN,您必须将指定 FQDN 的所有子域名视为专门分配给存储桶名称使用。任何与这些域名冲突的 MinIO 服务(如复制目标)都可能因冲突而出现意外或不希望的行为。
例如,如果设置 MINIO_DOMAIN=minio.example.net,您不能将 minio.example.net 的任何子域名(形式为 *.minio.example.net)分配给任何 MinIO 服务或目标。这包括用于存储桶、批处理或站点复制的主机名。
重要
对于启用了 TLS 的部署,您必须确保您的 TLS 证书的 SANs 覆盖了 MINIO_DOMAIN 中指定的最左侧域名的所有子域名。
例如,MINIO_DOMAIN=minio.example.net 的示例需要一个覆盖 minio.example.net 子域名的 TLS SAN。您可以设置一个额外的 TLS SAN *.minio.example.net 来适当地覆盖该子域名命名空间。
TLS 通配符规则阻止链式扩展到更深层次的子域名,因此,具有通配符 SAN *.example.net 的 TLS 证书将不覆盖 *.minio.example.net 的虚拟主机查找。
对象组织和规划
管理员通常控制存储桶的创建和配置。然后,客户端应用程序可以使用兼容 S3 的 SDK 在 MinIO 部署上创建、列出、检索和删除对象。因此,客户端驱动了给定存储桶或前缀内数据的整体层次结构,而管理员可以使用策略来授予或拒绝某个操作或资源的访问权限,从而进行控制。
MinIO 对给定部署上的存储桶、对象或前缀数量没有硬性阈值。MinIO 部署底层硬件和网络的相对性能可能会对给定前缀或存储桶中的对象数量构成实际限制。具体来说,使用较慢驱动器或网络基础设施的硬件,在具有扁平对象层次结构的存储桶或前缀中往往表现不佳。有关其他需要考虑的因素、阈值或限制,请参阅阈值和限制。
请将以下几点作为客户端应用程序工作负载模式的一般性指导:
对于硬件配置中等或注重成本的部署,应将其工作负载设计为每个前缀目标 10,000 个对象作为基准。根据对实际工作负载的基准测试和监控,将此目标增加到硬件能够有效处理的水平。
具有高性能或企业级硬件的部署通常可以处理包含数百万甚至更多对象的前缀。
MinIO SUBNET 企业账户可以利用年度架构审查作为部署和维护策略的一部分,以确保持有 MinIO 的项目的长期性能和成功。
有关限制前缀内容好处的更深入讨论,请参阅关于优化 S3 性能的文章。
注意
MinIO 不支持在对象名称中使用 \ 或 : 字符,无论 Windows 文件系统是否支持这些字符。请在对象名称中使用 / 作为分隔符,以便 MinIO 使用前缀自动创建文件夹结构。
对象版本控制
在存储桶上执行写入、列出、获取或删除操作时的具体客户端行为取决于该存储桶的版本控制状态:
操作 |
启用版本控制 |
禁用 | 暂停版本控制 |
|---|---|---|
|
创建一个对象的新的完整版本作为“最新”版本,并分配一个唯一的版本 ID |
创建对象,若命名空间匹配则覆盖。 |
|
默认检索对象的最新版本 支持通过版本 ID 检索任何对象版本。 |
检索对象 |
|
检索指定存储桶或前缀下对象的最新版本 支持检索所有对象及其关联的版本 ID。 |
检索指定存储桶或前缀下的所有对象 |
|
为该对象创建一个 0 字节的“删除标记”作为“最新”版本(软删除) 支持通过版本 ID 删除任何对象版本(硬删除)。硬删除操作无法撤销。 更多信息请参考对象删除。 |
删除对象 |
请参阅存储桶版本控制以获取更完整的文档。
对象标签
MinIO 支持向对象添加自定义标签。标签是包含在对象元数据中的键值对。标签可用于通过策略控制访问,或使用 mc find --tags 定位对象。
MinIO 支持为一个对象添加最多 10 个自定义标签。
有关设置标签的更多信息,请参阅 mc tag set。
对象保留
MinIO 对象锁定(“对象保留”)强制执行一次写入多次读取(WORM)的不可变性,以保护版本化对象免于删除。MinIO 同时支持基于持续时间的对象保留和无限期合法保留。
针对受 WORM 锁定的对象执行删除操作取决于具体操作:
未指定版本 ID 的删除操作会导致创建一个“删除标记”
指定了锁定对象版本 ID 的删除操作会导致 WORM 锁定错误
您只能在首次创建存储桶时启用对象锁定。启用存储桶锁定也会同时启用版本控制。
MinIO 对象锁定提供了关键的数据保留合规性,并根据 Cohasset Associates 的评估,满足 SEC17a-4(f)、FINRA 4511(C) 和 CFTC 1.31(c)-(d) 的要求。
请参阅MinIO 对象锁定和对象删除以获取更完整的文档。
对象生命周期管理
MinIO 对象生命周期管理允许创建基于时间或日期的规则,以自动转换或过期对象。对于对象转换,MinIO 会自动将对象移动到配置的远程存储层。对于对象过期,MinIO 会自动删除该对象。
MinIO 对版本化和非版本化存储桶应用生命周期管理规则,其行为与正常的客户端操作相同。您可以指定处理最新对象版本、非当前对象版本或两者的转换或生命周期规则。
MinIO 的生命周期管理在行为和语法上与AWS S3 生命周期管理兼容。MinIO 使用 JSON 来描述生命周期管理规则。对于导入在 S3 或类似兼容平台上创建的规则,可能需要进行与 XML 的相互转换。
请参阅对象生命周期管理以获取更完整的文档。
目标存储桶注意事项
MinIO 不要求目标存储桶与源存储桶的对象管理或版本控制配置相匹配。目标存储桶可以有自己的一套对象管理规则,但需谨慎定义。
目标存储桶不应有自己的过期或额外分层规则。过期规则可能导致源存储桶仍在使用的分层数据被移除。分层到额外的远程存储会增加热层与其数据之间的网络跳数,同时也增加了操作复杂性。
您可以在远程存储桶上配置对象锁定或版本控制。
在目标存储桶上启用版本控制或对象锁定可能会产生以下影响:
在目标存储桶上设置的对象锁定可能会阻止源存储桶期望的
delete操作完成。MinIO 使用自己的
UUID对对象进行分层,因此在目标存储桶上启用版本控制充其量是多余的。目标存储的效率降低,因为
delete操作会创建DeleteMarker而不是释放空间。源存储桶和目标存储桶上出现重复的删除标记。
远程数据的独占访问
MinIO 必须对目标存储桶有独占访问权。任何其他用户、进程、应用程序或资源都不应访问目标存储桶或对其执行任何操作。
所有对已转换对象的访问必须仅通过 MinIO 的 S3 API 操作进行。手动修改已转换的对象——无论是“热”MinIO 层上的元数据还是远程“温/冷”层上的对象数据——都可能导致该对象数据的丢失。
MinIO 会忽略远程存储桶或存储桶前缀中任何未由 MinIO 部署明确管理的对象。自动转换和透明的对象检索依赖于以下假设:
远程存储上的对象没有外部的修改、迁移或删除。
远程存储桶上没有生命周期管理规则(如转换或过期)。
为了实现这种独占访问,请在生命周期管理用户的策略中授予其对目标存储桶的 read、write 和 delete 访问权限。所有其他策略都应deny对目标存储桶的访问。
对象冲突
应用程序必须为所有对象分配非冲突的、唯一的键。这包括避免创建其名称可能与父对象或兄弟对象名称冲突的对象。MinIO 会在发生冲突的位置对 LIST 操作返回一个空集。
例如,以下操作会创建命名空间冲突:
PUT data/invoices/2024/january/vendors.csv
PUT data/invoices/2024/january <- collides with existing object prefix
PUT data/invoices/2024/january
PUT data/invoices/2024/january/vendors.csv <- collides with existing object
虽然您可以对这些对象执行 GET 或 HEAD 操作,但名称冲突会导致 LIST 操作在 /invoices/2024/january 路径上返回一个空的结果集。