MinIO 是一个**高性能、开源、云原生的对象存储系统**。它设计用于存储非结构化数据,如图片、视频、日志文件、备份和容器/虚拟机镜像等。MinIO 的核心目标是提供与 Amazon S3 云存储服务兼容的 API,同时可以在任何基础设施(公有云、私有云、边缘计算、裸金属服务器)上运行。
以下是 MinIO 的关键特性和简介:
1. S3 兼容性
这是 MinIO 最重要的特性之一。它完全实现了 Amazon S3 API (v2, v4, 以及 Select API)。
这意味着任何原本设计用于与 Amazon S3 通信的应用程序、工具、库(如 AWS CLI, SDKs, s3cmd, mc等)都可以无缝地与 MinIO 配合使用,无需修改代码。大大降低了迁移和集成的难度。
2. 高性能
MinIO 是为高性能而设计的,号称是世界上最快的对象存储之一。
它利用现代硬件(如 NVMe SSD)的优势,能够提供极高的吞吐量和低延迟。其设计架构(如无单点故障、强一致性)也确保了性能的稳定。
3. 开源
MinIO 采用 GNU Affero General Public License v3.0 开源协议发布。源代码完全公开透明,用户可以自由地下载、使用、修改和分发。
活跃的开源社区提供了持续的开发和支持。
4. 云原生
MinIO 是 Kubernetes 原生的,非常适合运行在容器化和编排环境中(如 Kubernetes, Docker Swarm)。它可以轻松地作为有状态应用部署在 Kubernetes 上。
其轻量级、可扩展的架构完美契合云原生应用的需求。
5. 可扩展性
MinIO 支持分布式模式(也称为 MinIO 集群),允许你将多台服务器(节点)的磁盘汇聚成一个或多个大的、逻辑的对象存储命名空间。
分布式 MinIO 利用纠删码(Erasure Code)提供数据冗余和恢复能力,同时保证强一致性。你可以通过添加更多节点来水平扩展存储容量和性能。
也支持单机模式(Standalone),适用于开发和测试。
6. 简单易用
安装和部署非常简便,通常只需一个二进制文件即可启动单机实例。
提供功能强大的命令行管理工具 mc,用于管理 MinIO 服务器和与 Amazon S3 兼容的云存储服务。
直观的 Web 控制台界面,方便用户进行存储桶管理、文件上传下载、权限配置和监控。
7. 安全性
支持传输层加密(TLS/SSL)。
支持静态数据加密(Server-Side Encryption with KMS or SSE-S3)。
提供精细的基于策略的访问控制(Identity and Access Management - IAM),兼容 S3 策略语法。支持 OpenID Connect、LDAP/Active Directory 等外部身份提供商集成。
支持对象锁定和保留(Object Locking/Retention),满足 WORM(Write Once Read Many)合规性要求。
8. 强一致性和数据保护
所有 I/O 操作(读写)在分布式模式下都是强一致的。写入成功后,所有节点立即可见。
使用纠删码(Erasure Coding)技术提供数据冗余和容错能力。它比传统的复制(Replication)更高效(例如,在 8 个磁盘中,使用 4 个数据盘和 4 个校验盘,可以容忍最多 4 块盘同时故障,而存储开销仅为 2x,远低于 3 副本的 3x)。同时提供比特位保护(Bit Rot Detection),防止磁盘静默数据损坏。
主要应用场景:
云原生应用存储: 在 Kubernetes 集群中为容器化应用提供持久化存储。
数据湖/分析平台: 作为大数据分析框架(如 Spark, Presto, Hive, Flink)的后端存储。
AI/ML 数据集存储:存储和管理训练机器学习模型所需的海量数据集。
备份与恢复:作为备份目标,存储数据库备份、虚拟机备份等。
内容存储与分发: 存储和管理网站、应用程序的静态内容(图片、视频、文档),可通过 CDN 加速。
替换或兼容 S3:在本地或私有云环境中构建兼容 S3 的存储服务,避免供应商锁定。
边缘存储:在边缘计算节点上部署轻量级的对象存储。
以下是一些代码:
1. 使用用户名密码连接(不安全,仅用于开发)
from minio import Minio
from minio.error import S3Error
# 初始化客户端
client = Minio(
"localhost:9000", # MinIO 服务器地址
access_key="your-username", # 用户名
secret_key="your-strong-password", # 密码
secure=False # 禁用HTTPS(开发环境)
)
# 测试连接
try:
buckets = client.list_buckets()
print("连接成功!可用存储桶:")
for bucket in buckets:
print(f"- {bucket.name}")
except S3Error as exc:
print(f"连接失败: {exc}")
2. 创建存储桶
bucket_name = "my-bucket"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
print(f"存储桶 {bucket_name} 创建成功")
else:
print(f"存储桶 {bucket_name} 已存在")
3、 上传文件
# 上传本地文件
client.fput_object(
bucket_name, # 存储桶名称
"photos/2023/summer.jpg", # 对象名称(可包含路径)
"C:/Users/me/Pictures/summer.jpg" # 本地文件路径
)
# 上传二进制数据
data = b"Hello, MinIO from Python!"
client.put_object(
bucket_name,
"text/greeting.txt",
data=io.BytesIO(data),
length=len(data),
content_type="text/plain"
)
4、 下载文件
# 下载到本地文件
client.fget_object(
bucket_name,
"photos/2023/summer.jpg",
"downloaded_photo.jpg"
)
# 下载为字节流
response = client.get_object(bucket_name, "text/greeting.txt")
data = response.read()
print(f"文件内容: {data.decode('utf-8')}")
response.close()
response.release_conn()