news 2026/4/23 11:34:04

MinIO对象存储搭建与S3兼容实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MinIO对象存储搭建与S3兼容实战

本文详解MinIO对象存储的部署配置、S3兼容API使用、分布式集群搭建等实践。

前言

对象存储越来越重要:

  • 海量非结构化数据存储
  • 图片、视频、备份文件
  • 云原生应用标配

MinIO是最流行的开源对象存储:

  • S3 API 100%兼容
  • 高性能(单节点可达100Gbps)
  • 部署简单,轻量级
  • 支持分布式、纠删码

用MinIO搭建私有云存储,成本低、速度快。


一、单节点部署

1.1 Docker部署

docker run -d\--name minio\-p9000:9000\-p9001:9001\-eMINIO_ROOT_USER=admin\-eMINIO_ROOT_PASSWORD=admin123456\-v /data/minio:/data\minio/minio server /data --console-address":9001"

1.2 Docker Compose部署

# docker-compose.ymlversion:'3.8'services:minio:image:minio/minio:latestcontainer_name:minioports:-"9000:9000"# API端口-"9001:9001"# 控制台端口environment:MINIO_ROOT_USER:adminMINIO_ROOT_PASSWORD:admin123456volumes:-./data:/datacommand:server /data--console-address ":9001"restart:unless-stoppedhealthcheck:test:["CMD","curl","-f","http://localhost:9000/minio/health/live"]interval:30stimeout:20sretries:3
docker compose up -d

1.3 访问MinIO

控制台:http://服务器IP:9001 API地址:http://服务器IP:9000 用户名:admin 密码:admin123456

二、基本操作

2.1 创建Bucket

控制台 → Buckets → Create Bucket - Bucket Name: my-bucket - Versioning: 按需开启 - Object Locking: 按需开启

2.2 mc客户端

# 安装mc客户端wgethttps://dl.min.io/client/mc/release/linux-amd64/mcchmod+xmcmvmc/usr/local/bin/# 配置别名mcaliassetmyminio http://192.168.1.100:9000 admin admin123456# 查看bucketmclsmyminio# 创建bucketmcmb myminio/my-bucket# 上传文件mccpmyfile.txt myminio/my-bucket/# 下载文件mccpmyminio/my-bucket/myfile.txt ./# 查看bucket内容mclsmyminio/my-bucket/# 删除文件mcrmmyminio/my-bucket/myfile.txt# 同步目录mcmirror ./local-folder myminio/my-bucket/

2.3 S3 API使用

Python示例:

importboto3frombotocore.clientimportConfig# 创建S3客户端s3=boto3.client('s3',endpoint_url='http://192.168.1.100:9000',aws_access_key_id='admin',aws_secret_access_key='admin123456',config=Config(signature_version='s3v4'))# 创建buckets3.create_bucket(Bucket='my-bucket')# 上传文件s3.upload_file('local_file.txt','my-bucket','remote_file.txt')# 下载文件s3.download_file('my-bucket','remote_file.txt','downloaded_file.txt')# 列出对象response=s3.list_objects_v2(Bucket='my-bucket')forobjinresponse.get('Contents',[]):print(obj['Key'])# 生成预签名URL(临时访问链接)url=s3.generate_presigned_url('get_object',Params={'Bucket':'my-bucket','Key':'remote_file.txt'},ExpiresIn=3600# 1小时有效)print(url)

Java示例:

importsoftware.amazon.awssdk.auth.credentials.AwsBasicCredentials;importsoftware.amazon.awssdk.auth.credentials.StaticCredentialsProvider;importsoftware.amazon.awssdk.regions.Region;importsoftware.amazon.awssdk.services.s3.S3Client;importsoftware.amazon.awssdk.services.s3.model.*;importjava.net.URI;publicclassMinioExample{publicstaticvoidmain(String[]args){S3Clients3=S3Client.builder().endpointOverride(URI.create("http://192.168.1.100:9000")).credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("admin","admin123456"))).region(Region.US_EAST_1).build();// 列出bucketListBucketsResponseresponse=s3.listBuckets();response.buckets().forEach(bucket->System.out.println(bucket.name()));}}

三、权限管理

3.1 创建用户

控制台 → Identity → Users → Create User - Access Key: readonly-user - Secret Key: readonly123456 - Policies: readonly(只读)

3.2 内置策略

策略权限
readonly只读所有bucket
readwrite读写所有bucket
diagnostics诊断权限
writeonly只写权限

3.3 自定义策略

{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetObject","s3:PutObject","s3:DeleteObject"],"Resource":["arn:aws:s3:::my-bucket/*"]},{"Effect":"Allow","Action":["s3:ListBucket"],"Resource":["arn:aws:s3:::my-bucket"]}]}

3.4 Bucket策略(公开访问)

{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":["s3:GetObject"],"Resource":["arn:aws:s3:::public-bucket/*"]}]}

四、分布式集群

4.1 集群架构

┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Node1 │ │ Node2 │ │ Node3 │ │ Node4 │ │ /data1 │ │ /data1 │ │ /data1 │ │ /data1 │ │ /data2 │ │ /data2 │ │ /data2 │ │ /data2 │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ └───────────┼───────────┼───────────┘ │ 纠删码分布存储 (最多允许N/2节点故障)

4.2 Docker Compose集群

# docker-compose.ymlversion:'3.8'services:minio1:image:minio/minio:latesthostname:minio1volumes:-./data1-1:/data1-./data1-2:/data2environment:MINIO_ROOT_USER:adminMINIO_ROOT_PASSWORD:admin123456command:server--console-address ":9001" http://minio{1...4}/data{1...2}healthcheck:test:["CMD","curl","-f","http://localhost:9000/minio/health/live"]interval:30stimeout:20sretries:3minio2:image:minio/minio:latesthostname:minio2volumes:-./data2-1:/data1-./data2-2:/data2environment:MINIO_ROOT_USER:adminMINIO_ROOT_PASSWORD:admin123456command:server--console-address ":9001" http://minio{1...4}/data{1...2}minio3:image:minio/minio:latesthostname:minio3volumes:-./data3-1:/data1-./data3-2:/data2environment:MINIO_ROOT_USER:adminMINIO_ROOT_PASSWORD:admin123456command:server--console-address ":9001" http://minio{1...4}/data{1...2}minio4:image:minio/minio:latesthostname:minio4volumes:-./data4-1:/data1-./data4-2:/data2environment:MINIO_ROOT_USER:adminMINIO_ROOT_PASSWORD:admin123456command:server--console-address ":9001" http://minio{1...4}/data{1...2}nginx:image:nginx:latestports:-"9000:9000"-"9001:9001"volumes:-./nginx.conf:/etc/nginx/nginx.conf:rodepends_on:-minio1-minio2-minio3-minio4

4.3 Nginx负载均衡配置

# nginx.conf events { worker_connections 1024; } http { upstream minio_api { server minio1:9000; server minio2:9000; server minio3:9000; server minio4:9000; } upstream minio_console { server minio1:9001; server minio2:9001; server minio3:9001; server minio4:9001; } server { listen 9000; location / { proxy_pass http://minio_api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 9001; location / { proxy_pass http://minio_console; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }

五、跨站点同步

5.1 场景

需求: - 总部MinIO存储主数据 - 分部MinIO作为副本或缓存 - 两地网络不通

5.2 组网方案

使用组网软件(如星空组网)打通网络:

┌─────────────────────────────────────────────────────────┐ │ 组网虚拟局域网 │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 总部MinIO │ │ 分部MinIO │ │ │ │ 10.10.0.1 │←────→│ 10.10.0.2 │ │ │ │ :9000 │ 同步 │ :9000 │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘

5.3 配置站点复制

# 在总部MinIO配置mcadmin replicateaddmyminio http://10.10.0.2:9000\--access-key admin --secret-key admin123456# 或使用mc mirror同步mcmirror --watch myminio/my-bucket remote-minio/my-bucket

5.4 客户端访问就近节点

# 应用根据网络环境选择MinIO节点MINIO_ENDPOINTS={'headquarters':'http://10.10.0.1:9000','branch':'http://10.10.0.2:9000'}# 使用就近节点endpoint=MINIO_ENDPOINTS.get(current_location,MINIO_ENDPOINTS['headquarters'])

六、与应用集成

6.1 Spring Boot集成

<!-- pom.xml --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version></dependency>
@ConfigurationpublicclassMinioConfig{@BeanpublicMinioClientminioClient(){returnMinioClient.builder().endpoint("http://192.168.1.100:9000").credentials("admin","admin123456").build();}}@ServicepublicclassFileService{@AutowiredprivateMinioClientminioClient;publicStringuploadFile(MultipartFilefile,Stringbucket){StringfileName=UUID.randomUUID()+"_"+file.getOriginalFilename();minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(fileName).stream(file.getInputStream(),file.getSize(),-1).contentType(file.getContentType()).build());returnfileName;}publicInputStreamdownloadFile(Stringbucket,StringfileName){returnminioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(fileName).build());}}

6.2 文件直传(前端直传)

// 1. 后端生成预签名URL// 2. 前端直接上传到MinIOasyncfunctionuploadFile(file){// 获取预签名URLconstresponse=awaitfetch('/api/presigned-url',{method:'POST',body:JSON.stringify({filename:file.name})});const{url}=awaitresponse.json();// 直接上传到MinIOawaitfetch(url,{method:'PUT',body:file,headers:{'Content-Type':file.type}});}

七、监控与告警

7.1 Prometheus指标

# 启用Prometheus指标mcadmin prometheus generate myminio# 配置Prometheusscrape_configs: - job_name: minio metrics_path: /minio/v2/metrics/cluster static_configs: - targets:['192.168.1.100:9000']

7.2 关键指标

指标说明
minio_bucket_usage_total_bytesBucket使用量
minio_node_disk_free_bytes磁盘剩余空间
minio_s3_requests_total请求总数
minio_s3_requests_errors_total错误请求数

八、总结

MinIO对象存储要点:

  1. 部署简单:Docker一行命令
  2. S3兼容:无缝替换AWS S3
  3. 分布式:纠删码保证数据安全
  4. 权限管理:IAM策略控制
  5. 跨站点:组网后同步复制

使用场景:

☑ 图片/视频存储 ☑ 日志归档 ☑ 数据备份 ☑ AI训练数据集 ☑ 云原生应用存储后端

参考资料

  1. MinIO官方文档:https://min.io/docs/minio/linux/index.html
  2. MinIO GitHub:https://github.com/minio/minio
  3. MinIO SDK文档:https://min.io/docs/minio/linux/developers/minio-drivers.html

💡建议:生产环境至少4节点集群,启用纠删码。单节点仅用于开发测试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:32:22

探索macOS开源应用的世界:从入门到精通

探索macOS开源应用的世界&#xff1a;从入门到精通 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库&#xff0c;这些应用程序涉及到各种领域&#xff0c;例如编程、生产力工具、游戏等。对于开发…

作者头像 李华
网站建设 2026/4/15 12:37:11

5分钟精通YOLOv9模型评估:从零基础到实战高手的完整指南

5分钟精通YOLOv9模型评估&#xff1a;从零基础到实战高手的完整指南 【免费下载链接】yolov9 项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9 你是否曾经面对训练好的YOLOv9模型&#xff0c;却不知道如何客观评价它的真实性能&#xff1f;在目标检测项目中&…

作者头像 李华
网站建设 2026/4/21 13:26:21

基于VUE的企业客户信息管理系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;在市场竞争日益激烈的当下&#xff0c;客户作为企业的核心资源&#xff0c;其信息管理的高效性与精准性对企业发展至关重要。本文阐述了一个基于VUE框架开发的企业客户信息管理系统&#xff0c;详细介绍了系统的需求分析、技术选型、架构设计、功能模块设计及实…

作者头像 李华
网站建设 2026/4/15 19:51:07

ClickShow鼠标点击特效工具使用指南

ClickShow鼠标点击特效工具使用指南 【免费下载链接】ClickShow 鼠标点击特效 项目地址: https://gitcode.com/gh_mirrors/cl/ClickShow 在屏幕录制、教学演示或远程协作过程中&#xff0c;准确展示鼠标操作轨迹和点击位置往往至关重要。ClickShow作为一款专业的鼠标点击…

作者头像 李华
网站建设 2026/4/19 18:55:09

卫浴行业大会资讯:掌握最新动态,引领行业潮流——5大亮点速览

卫浴行业大会资讯&#xff1a;掌握最新动态&#xff0c;引领行业潮流——5大亮点速览引言卫浴行业作为家居装修的重要组成部分&#xff0c;近年来随着消费者需求的不断升级和技术创新的推动&#xff0c;呈现出快速发展的态势。为了更好地把握行业脉搏&#xff0c;众多企业纷纷参…

作者头像 李华
网站建设 2026/4/18 12:30:31

CANopen转Profinet网关:小设备撬动自动化产线大效率

在工业自动化领域&#xff0c;CANopen转ProfiNET网关扮演着至关重要的角色。它不仅实现了不同通信协议之间的无缝对接&#xff0c;还提升了整个系统的灵活性和可靠性。接下来&#xff0c;我们将深入了解这一技术如何应对实际问题&#xff0c;提供解决方案&#xff0c;并探讨其带…

作者头像 李华