MinIO是基于 GNU AGPL v3 开源的高性能对象存储,与 Amazon S3 云存储服务 API 兼容。
介绍
MinIO 是 Kubernetes 的原生产品,是唯一可用于公有云、私有云、Kubernetes 发行版和边缘的对象存储套件。
-
Minio 的一些限制
- UI Console Missing Features 管理用户界面不在维护
-
在线示例 https://play.min.io
-
Minio Tiers 用于将数据分层存储到不同的存储介质中,以优化成本和性能,存储类型参考:
- STANDARD
- NEARLINE
- COLDLINE
使用场景
一般作为高性能基础设施的场景,包括`
- 机器学习
- 分析
- 应用数据负载
- 测试环境
- 支持基于
Policy-Based Access Control (PBAC)认证
特点
- 高可用,
N/2硬盘在线数据就是安全的- Minio 使用
纠删码(erasure code)和校验和(checksum)来保护数据免受硬件故障 纠删码是一种恢复丢失和损坏数据的数学算法,Minio 采用Reed-Solomon code将对象拆分成N/2数据和N/2奇偶校验块- 示例:如果有 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,丢失任意 6 块盘(不管是数据块还是奇偶校验块)时仍可以从剩下的盘中将数据进行恢复
- Minio 使用
一致性所有读写操作都严格遵守read-after-write一致性模型
安装部署
支持多种安装部署方式,参考` https://hub.docker.com/r/minio/minio
Docker
mkdir -p /data/minio
docker run -d \
--name minio \
--restart=always \
-p 9000:9000 \
-p 9001:9001 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
-v /data/minio:/data \
minio/minio:RELEASE.2022-05-08T23-50-31Z.hotfix.d33e6d144 \
server /data --console-address ":9001"说明`
- 默认用户名:密码
admin/minioadmin`,示例通过环境变量指定 - API Port:
9000 - Web Console Port:
9001 - 安装完成后,通过
http://<ip>:9001访问/identity/account/new-account添加Access Key和Secret Key
Docker Compose
- docker-compose.yaml
启动:
docker-compose up -dMinio Operator
- install minio operator
kubectl krew update
kubectl krew install minio- init
kubectl minio init- pvc 创建
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-disk-0
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/minio/0
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node6- 创建租户
kubectl minio tenant create minio-tenant-1 \
--servers 1 \
--volumes 4 \
--capacity 40Gi \
--storage-class local-storage \
--namespace minio-tenant-1集群扩容
- 水平扩容:增加节点数扩展系统容量,包括两种方式(不支持扩容单个节点)
- 对等扩容:要求增加的节点数和磁盘数均需与原集群保持对等
- 联邦扩容:通过引入 etcd,将多个 MinIO 分布式集群在逻辑上组成一个联邦,对外以一个整体提供服务,并提供统一的命名空间
- 垂直扩容:采用扩容节点磁盘空间,会为集群运行带来若干问题,官方并不推荐
使用
客户端 mc 安装
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --helpmc 客户端使用
mc alias list
mc alias list <name>
mc alias export <name> > <name>.json
mc alias remove <name>
mc alias import <name> <name>.json
# 查看 minio 服务端配置
mc config host ls
# 添加 minio 服务端配置
mc config host add minio http://minio.xiexianbin.cn xxx --api s3v4
# 查看 minio bucket
mc ls minio
# 创建 bucket
mc mb minio/backup
# 上传本地目录(文件不加r)
mc cp -r ingress minio/backup/
# 下载远程目录(文件不加r)
mc cp -r minio/backup .
# 将一个本地文件夹镜像到 minio (类似rsync)
mc mirror localdir/ minio/backup/
# 持续监听本地文件夹镜像到 minio(类似rsync)
mc mirror -w localdir/ minio/backup/
# 跨bucket复制文件
mc cp --recursive minio1/mydata minio2/archive
# 持续从 minio 存储桶中查找所有 jpg 图像,并复制到 minio "play/bucket" 存储桶
mc find minio/backup --name "*.jpg" --watch --exec "mc cp {} play/bucket"
# 移动文件
mc mv --recursive minio1/mydata minio2/archive
# 删除目录
mc rm minio/backup/ingress --recursive --force
# 删除文件
mc rm minio/backup/xxx.yaml
# 删除所有未完整上传的对象
mc rm --incomplete --recursive --force minio/backup
# 删除 7 天前的对象
mc rm --force --older-than=7 minio/backup
# 将 MySQL 数据库 dump 文件输出到 minio
mysqldump -u root -p ******* db | mc pipe minio/backup/backup.sql
# MongoDB 备份
mongodump -h mongo-server1 -p 27017 -d blog-data --archive | mc pipe minio/backup/mongo-blog-data-`date +%Y-%m-%d`.archive- Object Lifecycle Management(ilm) 是一套功能,允许你定义规则来自动管理 MinIO 中对象的生命周期,包括:
- 对象过期 (Expiration): 自动删除达到特定年龄或条件的过期对象
- 对象分层 (Tiering / Transition): 根据预设规则,将对象从一个存储层自动移动到另一个存储层(例如,从高性能存储移动到成本更低的归档存储)
- LifecycleConfiguration
- 使用 mc ilm 管理上述功能:
mc ilm tier add minio myminio WARM-MINIO-TIER \
--endpoint https://warm-minio.com \
--access-key ACCESSKEY \
--secret-key SECRETKEY \
--bucket mybucket \
--prefix myprefix/
mc ilm tier ls myminio
mc ilm tier info myminio WARM-TIER
mc ilm tier check myminio WARM-TIER
# 创建远程层上存档的对象的临时副本, 副本默认1天后自动失效 https://docs.min.io/enterprise/aistor-object-store/reference/cli/mc-ilm-tier/mc-ilm-restore/
mc ilm restore minio1/xxx.xx上传文件的 Content-Type
推荐:h2non/filetype 通过文件 magic code 判断文件类型,参考
text/htmlHTML 格式,浏览器直接打开text/plain纯文本格式text/xmlXML 格式text/x-loglog 格式image/gifgif 图片格式image/jpegjpg 图片格式image/pngpng 图片格式application/jsonJSON 数据格式application/xmlXML 数据格式application/xhtml+xmlXHTML 格式application/atom+xmlAtom XML 聚合格式application/pdfpdf 格式application/mswordWord 文档格式application/octet-stream二进制数据流下载
Python SDK
pip3 install minioGolang SDK
MinIO DirectPV
Service Account Policy
MinIO 策略(policy) 文档使用与 AWS IAM Policy 文档相同的架构
IAM(Identity and Access Management)
Built-In Policies
- Built-In Policies
consoleAdminreadonlyreadwritediagnosticswriteonly
Policy Document Structure
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [ "s3:<ActionName>", ... ],
"Resource" : "arn:aws:s3:::*",
"Condition" : { ... }
},
{
"Effect" : "Deny",
"Action" : [ "s3:<ActionName>", ... ],
"Resource" : "arn:aws:s3:::*",
"Condition" : { ... }
}
]
}参数说明:
-
Version标识策略的版本号,Minio 中一般为2012-10-17 -
Statement策略声明Effect(效果)包含两种:Allow(允许)Deny(拒绝)
Action(动作)是对资源的具体操作权限- 格式为:
服务名:资源类型:操作 - 支持
单个或多个操作权限,支持通配符号*,表示所有 - 例如
s3:GetObject:*表示获取对象
- 格式为:
Resource(资源)该策略所作用的资源,支持通配符号*,表示所有- 在 JSON 视图中,不带 Resource 表示对所有资源生效。
- Resource 支持以下字符:
-_0-9a-zA-Z*.,如果 Resource 中包含不支持的字符,请采用通配符号* - 例如:
arn:aws:s3:::my-bucketname/myobject*表示 minio 中my-bucketname/myobject目录下所有对象文件
Condition(条件)表示在创建自定义策略时,通过 Condition 元素来控制策略何时生效
-
扩展:AWS
-
其他示例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::public"
]
}
]
}- policy 可以和 minio 的用户或组关联,实现权限分配
STS
MinIO 的 STS (Security Token Service) 允许应用程序申请临时凭证(Access Key, Secret Key 和 Session Token)。这通常用于通过外部身份认证(如 OpenID Connect, LDAP)或为特定操作生成有时效性的权限。
python 使用示例:
- 安装:
pip install minio - 一个具有 sts:AssumeRole 权限的普通用户
from minio import Minio
from minio.credentials import AssumeRoleProvider
# 1. 配置基础信息
minio_endpoint = "localhost:9000"
parent_access_key = "minioadmin"
parent_secret_key = "minioadmin"
# 2. 定义 STS 提供者
# 这个例子中,我们使用现有的用户来为一个“角色”申请临时凭证
# DurationSeconds: 临时凭证有效期(单位:秒),范围 900 - 604800
provider = AssumeRoleProvider(
endpoint=f"http://{minio_endpoint}",
access_key=parent_access_key,
secret_key=parent_secret_key,
duration_seconds=3600 # 1小时有效
)
# 3. 使用临时凭证初始化 MinIO 客户端
client = Minio(
minio_endpoint,
credentials=provider,
secure=False
)
# 4. 像往常一样使用客户端
try:
buckets = client.list_buckets()
for bucket in buckets:
print(bucket.name)
except Exception as err:
print(f"Error: {err}")- curl 示例
curl -X POST "http://localhost:9000/" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "Action=AssumeRole" \
-d "Version=2011-06-15" \
-d "DurationSeconds=3600" \
-d "Policy={\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::my-bucket\"]}]}" \
--user "minioadmin:minioadmin"返回结果(XML),其中包含了临时凭证:
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleResult>
<Credentials>
<AccessKeyId>STS_ACCESS_KEY</AccessKeyId>
<SecretAccessKey>STS_SECRET_KEY</SecretAccessKey>
<SessionToken>STS_SESSION_TOKEN</SessionToken>
<Expiration>2023-10-27T10:00:00Z</Expiration>
</Credentials>
</AssumeRoleResult>
</AssumeRoleResponse>如果只是想手动创建一个有时效性的临时账号,可以使用 MinIO 的 service-account 功能(它在底层与 STS 逻辑类似):
# 创建一个 12 小时后过期的子账号
mc admin service-account create myminio/ mainuser --expiry 12h对象版本控制(Object Versioning)
在存储桶(Bucket)开启了版本控制的情况下,bucket 查看页面会显示 Show deleted objects
在开启了版本控制的存储桶中,当你执行“删除”操作时,MinIO 并没有物理上抹除数据,而是:
- 插入一个删除标记(Delete Marker):系统会为该对象创建一个特殊版本,称为“删除标记”。
- 隐藏旧版本:默认情况下,对象列表只会显示最新版本。因为最新版本是“删除标记”,所以该文件看起来像是“消失了”。
命令行查看:
mc ls --versions alias/my-bucket/F&Q
bucket quota exceeded
达到了存储的配额 quota 限制
error file size too large
- nginx 代理拦截,https://github.com/minio/minio/discussions/15440
最近更新
最新评论