第五章:核心概念

深入理解 MinIO 的核心概念,包括存储桶、对象、多段上传、版本控制和生命周期管理。

最后更新: 2024-01-15
页面目录

第五章:核心概念

5.1 存储桶(Bucket)

5.1.1 存储桶概述

存储桶是 MinIO 中的顶级命名空间,用于组织和存储对象。

属性 说明
命名 全局唯一,不可重复
命名规范 3-63字符,小写字母、数字、点、连字符
数量限制 无限制
嵌套 不支持嵌套

5.1.2 存储桶命名

# 合法的存储桶名称
my-bucket
mybucket
my.bucket
123-bucket

# 非法的存储桶名称
MyBucket     # 不能有大写
my bucket    # 不能有空格
bucket_123   # 不能有下划线
192.168.1.1  # 不能是 IP

5.1.3 存储类型

# 创建标准存储桶(默认)
mc mb myminio/standard-bucket

# 创建存储桶并指定存储类别
mc mb myminio/hot-bucket

# 查看存储桶信息
mc stat myminio/bucket

5.2 对象(Object)

5.2.1 对象概述

对象是存储在存储桶中的基本数据单元,包括数据和元数据。

Object 结构
┌─────────────────────────────────────────────────────────┐
│                        Object                             │
├─────────────────────────────────────────────────────────┤
│  Key: logs/2024/01/server.log                            │
│  Size: 1.5 GB                                            │
│  ETag: d41d8cd98f00b204e9800998ecf8427e                  │
│  Content-Type: text/plain                                │
│  Last-Modified: 2024-01-15T10:30:00Z                     │
├─────────────────────────────────────────────────────────┤
│  User Metadata:                                           │
│  X-Amz-Meta-Owner: admin                                 │
│  X-Amz-Meta-Project: production                          │
└─────────────────────────────────────────────────────────┘

5.2.2 对象键(Object Key)

对象键是存储桶中对象的唯一标识符:

# 对象键示例
logs/2024/01/server.log
images/products/001.jpg
videos/2024-01/training.mp4
documents/reports/q1-2024.pdf

5.2.3 对象元数据

# 上传时设置元数据
mc cp file.txt myminio/bucket/ \
  --attr "Content-Type=application/json;X-Amz-Meta-Custom=custom-value"

# 查看对象元数据
mc stat myminio/bucket/file.txt

# 示例输出
# Name      : file.txt
# Size      : 1024 bytes
# Type      : application/octet-stream
# ETag      : d41d8cd98f00b204e9800998ecf8427e
# Metadata  :
#   Content-Type    : application/octet-stream
#   X-Amz-Meta-Custom : custom-value

5.3 多段上传(Multipart Upload)

5.3.1 什么是多段上传

大文件上传时,MinIO 支持将文件分割成多个部分分别上传,提高上传速度和可靠性。

Multipart Upload 流程
┌─────────────────────────────────────────────────────────┐
  1. 初始化多段上传                                       
     POST /bucket/object?uploads                          
                                                         
                                                        
  2. 上传各个部分                                         
     PUT /bucket/object?partNumber=1&uploadId=xxx         
     PUT /bucket/object?partNumber=2&uploadId=xxx         
     PUT /bucket/object?partNumber=3&uploadId=xxx         
                                                         
                                                         
  3. 完成上传                                             
     POST /bucket/object?uploadId=xxx                     
                                                         
                                                         
  4. 组装完整文件                                         
└─────────────────────────────────────────────────────────┘

5.3.2 多段上传配置

# 配置多段上传参数
export MINIO_API_PART_MAX_MB=5        # 单个part最大 5GB

# 列出正在进行的分段上传
mc ls --incomplete myminio/bucket/

# 中止未完成的分段上传
mc abort myminio/bucket/object --upload-id <upload-id>

# 清理所有未完成的分段上传
mc cleanup --incomplete myminio/bucket/

5.3.3 大文件上传示例

import boto3
from botocore.config import Config

# 创建 S3 客户端
s3 = boto3.client(
    's3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='admin',
    aws_secret_access_key='password123',
    config=Config(max_pool_connections=100)
)

# 配置分段上传
config = {
    'LocationConstraint': 'us-east-1',
    'ObjectSizeThreshold': 1024 * 1024 * 100,  # 100MB 以上自动分段
}

# 上传大文件(自动分段)
s3.upload_file('large-file.zip', 'bucket', 'large-file.zip')

# 手动分段上传
# 1. 初始化
create_response = s3.create_multipart_upload(
    Bucket='bucket',
    Key='large-file.zip'
)
upload_id = create_response['UploadId']

# 2. 上传各部分
parts = []
part_number = 1
with open('large-file.zip', 'rb') as f:
    while chunk := f.read(100 * 1024 * 1024):  # 100MB 每块
        part = s3.upload_part(
            Bucket='bucket',
            Key='large-file.zip',
            PartNumber=part_number,
            UploadId=upload_id,
            Body=chunk
        )
        parts.append({'PartNumber': part_number, 'ETag': part['ETag']})
        part_number += 1

# 3. 完成上传
s3.complete_multipart_upload(
    Bucket='bucket',
    Key='large-file.zip',
    UploadId=upload_id,
    MultipartUpload={'Parts': parts}
)

5.4 版本控制(Versioning)

5.4.1 版本控制概述

启用版本控制后,每次对对象的修改都会创建一个新版本,保留历史版本。

Versioning 存储结构
┌─────────────────────────────────────────────────────────┐
│  Bucket (versioning enabled)                              │
├─────────────────────────────────────────────────────────┤
│  object.txt (最新版本)                                   │
│  ├─ Version ID: v3 (当前)                               │
│  ├─ Version ID: v2                                      │
│  └─ Version ID: v1                                      │
└─────────────────────────────────────────────────────────┘

5.4.2 版本控制操作

# 启用版本控制
mc version enable myminio/mybucket

# 暂停版本控制
mc version suspend myminio/mybucket

# 查看版本状态
mc version info myminio/mybucket

# 上传新版本
mc cp updated-file.txt myminio/mybucket/file.txt

# 列出所有版本
mc ls --versions myminio/mybucket/

# 下载特定版本
mc cp --version-id <version-id> myminio/mybucket/file.txt /tmp/

# 删除指定版本
mc rm --version-id <version-id> myminio/mybucket/file.txt

5.4.3 版本控制与删除

# 简单删除(添加删除标记)
mc rm myminio/mybucket/file.txt
# 结果:添加 Delete Marker,保留所有版本

# 永久删除(彻底删除)
mc rm --version-id <version-id> myminio/mybucket/file.txt
# 结果:永久删除指定版本

5.5 对象锁定(Object Locking)

5.5.1 合规模式 vs 治理模式

模式 说明 权限要求
合规模式 (Compliance) 锁定期间任何人无法删除 只有合规官可以移除
治理模式 (Governance) 可被特权用户覆盖 需要特殊权限

5.5.2 创建锁定存储桶

# 创建带对象锁定的存储桶
mc mb --with-lock myminio/compliance-bucket

# 启用默认锁定规则
mc object-lock set myminio/compliance-bucket \
  --default-retention-days 30 --mode compliance

5.5.3 上传锁定对象

# 上传带保留期的对象
mc cp file.txt myminio/compliance-bucket/ \
  --lock-until "2024-12-31T23:59:59Z"

# 上传带法律保留的对象
mc cp file.txt myminio/compliance-bucket/ \
  --legal-hold on

# 查看对象锁定状态
mc retention info myminio/compliance-bucket/file.txt

5.6 生命周期管理

5.6.1 生命周期规则

{
  "Rules": [
    {
      "ID": "cleanup-old-logs",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Expiration": {
        "Days": 90
      }
    },
    {
      "ID": "transition-to-archive",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "archive/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "GLACIER"
        }
      ]
    }
  ]
}

5.6.2 设置生命周期规则

# 创建生命周期配置文件
cat > lifecycle.json << 'EOF'
{
  "Rules": [
    {
      "ID": "expire-old-files",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Expiration": {
        "Days": 365
      }
    },
    {
      "ID": "delete-incomplete-uploads",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 7
      }
    }
  ]
}
EOF

# 应用生命周期规则
mc ilm import myminio/mybucket < lifecycle.json

# 查看生命周期规则
mc ilm ls myminio/mybucket/

# 删除生命周期规则
mc ilm rm --id expire-old-files myminio/mybucket

5.7 访问控制列表(ACL)

5.7.1 ACL 权限

权限 说明
READ 列出和读取对象
WRITE 上传、删除对象
READ_ACP 读取 ACL
WRITE_ACP 修改 ACL
FULL_CONTROL 完全控制

5.7.2 设置 ACL

# 设置存储桶为公开读取
mc anonymous set download myminio/mybucket

# 设置特定用户权限
mc policy set download myminio/mybucket/user-prefix/

# 查看当前策略
mc anonymous list myminio/mybucket

5.8 总结

本章深入介绍了 MinIO 的核心概念,包括存储桶、对象、多段上传、版本控制和生命周期管理等。掌握这些概念对于高效使用 MinIO 至关重要。下一章将学习 MinIO Client 的高级用法。