MinIO 自建 S3 对象存储

引言

大家好,今天想跟你们聊聊我自己是怎么搭建对象存储服务的。之前公司业务需要存储大量的图片、视频和日志文件,最开始用的是云厂商的 S3 服务,成本嘛,你们懂的,随着数据量增长,账单看得我肉疼。后来发现了 MinIO 这个开源方案,简直打开了新世界的大门——完全兼容 S3 协议,性能也不错,关键是免费开源,可以自己部署在本地或者私有云上。今天就把我的使用经验整理一下,分享给有同样需求的朋友。

什么是 MinIO

MinIO 是一个开源的分布式对象存储服务,特点是高性能、支持 S3 兼容协议、部署简单。它的设计理念就是让每个人都能够轻松搭建自己的 "AWS S3",不需要昂贵的硬件,也不需要复杂的运维。

我最喜欢 MinIO 的几个点:

- 完全兼容 S3 协议:现有的 S3 SDK、CLI 工具都可以直接用

- 部署简单:一个二进制文件就能跑,不需要复杂的依赖

- 性能强劲:支持分布式部署,读写速度很可观

- 开源免费:Apache License,想怎么用就怎么用

对于我们这种中小团队来说,用 MinIO 替代商业对象存储服务,能省下一大笔钱。

快速部署 MinIO

单节点部署

最简单的方式就是单节点部署,适合开发测试或者小规模使用。我一般在 Docker 里跑,方便管理:

docker run -d \

--name minio \

-p 9000:9000 \

-p 9001:9001 \

-v /data/minio:/data \

-e MINIO_ROOT_USER=minioadmin \

-e MINIO_ROOT_PASSWORD=minioadmin \

minio/minio server /data --console-address ":9001"

这里解释一下:9000 端口是 S3 API 接口,9001 端口是管理后台。数据目录我映射到了宿主机的 /data/minio,你改成自己的路径就行。

启动成功后,浏览器访问 http://你的IP:9001,用刚才设置的用户名密码登录,就能看到管理界面了。

Docker Compose 方式

如果想要更规范一点,可以用 Docker Compose 来管理:

version: '3.8'

services:

minio:

image: minio/minio:latest

container_name: minio

ports:

- "9000:9000"

- "9001:9001"

environment:

MINIO_ROOT_USER: minioadmin

MINIO_ROOT_PASSWORD: minioadmin

volumes:

- ./data:/data

command: server /data --console-address ":9001"

restart: unless-stopped

保存为 docker-compose.yml,然后 docker-compose up -d 就完事了。

使用 S3 客户端操作

部署好了之后,怎么往里面存文件呢?这里有几种方式。

1. 管理后台

直接在浏览器访问 9001 端口,登录后可以可视化上传、下载、创建存储桶(Bucket),跟使用网盘差不多,对非技术人员很友好。

2. mc 命令行工具

MinIO 官方提供了一个叫 mc(MinIO Client)的命令行工具,功能很强大,安装也简单:

# Linux/macOS

curl https://dl.min.io/client/mc/release/linux-amd64/mc -o mc

chmod +x mc

sudo mv mc /usr/local/bin/

或者用 Homebrew

brew install minio-stable/mc/mc

配置连接到我们的 MinIO 服务:

mc alias set myminio http://192.168.1.100:9000 minioadmin minioadmin

然后就可以愉快地操作了:

# 创建存储桶

mc mb myminio/my-bucket

上传文件

mc cp /path/to/file.txt myminio/my-bucket/

下载文件

mc cp myminio/my-bucket/file.txt ./

查看文件列表

mc ls myminio/my-bucket

设置存储桶为公开访问

mc anonymous set download myminio/my-bucket

3. AWS CLI

因为 MinIO 兼容 S3 协议,所以 AWS CLI 也能直接用,只需要配置一下:

aws configure

AWS Access Key ID: minioadmin

AWS Secret Access Key: minioadmin

Default region name: us-east-1

Default output format: json

然后修改 S3 endpoint:

aws s3 ls --endpoint-url=http://192.168.1.100:9000

aws s3 cp test.txt s3://my-bucket/ --endpoint-url=http://192.168.1.100:9000

4. 编程语言 SDK

各种语言的 SDK 也都支持,只需要把 endpoint 改成你的 MinIO 地址就行。以 Python 为例:

import boto3

s3 = boto3.client(

's3',

endpoint_url='http://192.168.1.100:9000',

aws_access_key_id='minioadmin',

aws_secret_access_key='minioadmin'

)

上传文件

s3.upload_file('test.txt', 'my-bucket', 'test.txt')

下载文件

s3.download_file('my-bucket', 'test.txt', 'downloaded.txt')

存储桶策略与权限控制

生产环境肯定需要精细的权限控制,MinIO 支持类似 AWS S3 的存储桶策略(Bucket Policy)。

比如我想让某个存储桶可以公开读取,但只能由特定用户写入,可以这样配置:

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Principal": "*",

"Action": "s3:GetObject",

"Resource": "arn:aws:s3:::my-bucket/*"

},

{

"Effect": "Allow",

"Principal": {

"AWS": ["arn:aws:iam::root:user/uploader"]

},

"Action": "s3:PutObject",

"Resource": "arn:aws:s3:::my-bucket/*"

}

]

}

在管理后台的 "存储桶 → 编辑策略" 里可以可视化配置,或者用 mc policy 命令行操作。

分布式集群部署

如果单节点不够用,MinIO 还支持分布式部署,可以多台机器组成集群,提高可用性和容量。

分布式部署需要至少 4 台服务器(推荐 4、6、8 等偶数台),每个节点上运行 MinIO 实例,数据会自动分布在多个节点上。

minio server http://host1/data http://host2/data http://host3/data http://host4/data

集群模式下,MinIO 会自动进行数据 erasure coding,即使坏掉一半的硬盘,数据依然可以恢复。这个特性非常适合对数据可靠性要求高的场景。

总结

好啦,今天的分享就到这里。MinIO 真的是一个非常棒的工具,部署简单、性能强劲、兼容性好,无论是个人项目还是企业级应用都很合适。

我的使用场景主要是:

- 存储用户上传的图片和视频

- 备份数据库和日志

- 作为静态资源服务器

- 开发测试环境模拟 S3

如果你也在寻找对象存储解决方案,不妨试试 MinIO,相信不会让你失望的。有什么问题欢迎在评论区留言,我们一起讨论!