概述官网基于Golang编写的开源GitHub61.4K Star7.8K Fork对象存储组件100%兼容s3最适合存储非结构化数据如照片视频日志文件备份和容器/VM镜像。对象的大小从几KB到最大5TB。与现在的虚拟技术如k8s、k3s、etcd、docker等深度集成为云环境而生。资料官方文档中文文档1中文文档2注26年4月25日代码仓库已归档且开源协议已修改参考MinIO替代汇总SeaweedFS、RustFS、Ceph、GlusterFS、Garage、Free FS。特点高性能在标准硬件条件下其读写速率分别可达到55Gb/s和35Gb/s。支持的对象文件可以是任意大小从几KB到最大5T不等可扩展不同MinIO集群可组成联邦并形成一个全局的命名空间并且支持跨越多个数据中心云原生容器化、基于K8S的编排、多租户支持。Amazon S3兼容使用Amazon S3 v2 / v4 API可使用Minio SDKMinio ClientAWS SDK和AWS CLI访问Minio服务器高可用单机Minio服务存在单点故障。如果是一个有N块硬盘的分布式 Minio只要有N/2硬盘在线数据就是安全的。不过你需要至少有N/21个硬盘来创建新的对象。一个16节点Minio集群每个节点16块硬盘就算8台服務器宕机集群仍然可读不过需要 9 台服務器才能写数据。只要遵守分布式 Minio 的限制可组合不同的节点和每个节点几块硬盘。可使用2个节点每个节点4块硬盘也可使用4个节点每个节点两块硬盘诸如此类一致性Minio在分布式和单机模式下所有读写操作都严格遵守读后写read-after-write一致性模型数据保护分布式Minio采用纠删码来防范多个节点宕机和位衰减 bit rot。分布式Minio至少需要4个硬盘分布式自动引入纠删码功能优点安装部署简单一个二进制文件minio即是一切支持各种平台支持海量存储可按zone扩展单个对象支持最大5TB低冗余且磁盘损坏高容忍标准且最高的数据冗余系数为2(即存储一个1M的数据对象实际占用磁盘空间为2M)。但在任意n/2块磁盘损坏的情况下依然可读出数据(n为一个纠删码集合中的磁盘数量)。这种损坏恢复是基于单个对象的而不是基于整个存储卷的读写性能优异概念S3Simple Storage Service简单存储服务S3提供一个简单Web服务接口可用于随时在Web上的任何位置存储和检索任何数量的数据Object存储到Minio的基本对象如文件、字节流等Bucket用来存储Object的逻辑空间。每个Bucket之间的数据相互隔离Drive部署Minio时设置的磁盘Minio中所有的对象数据都会存储在Drive里Set一组Drive的集合分布式部署根据集群规模自动划分一个或多个Set每个Set中的Drive分布在不同位置一个对象存储在一个Set上一个集群划分为多个Set一个Set包含的Drive数量是固定的默认由系统根据集群规模自动计算得出一个Set中的Drive尽可能分布在不同的节点上对象最终是存储在Set上Set是一组Drive的集合实战和Hadoop一样有3种安装方式单主机单硬盘模式Minio只在一台服务器上搭建服务且数据都存在单块磁盘上该模式存在单点风险主要用作开发、测试等使用单主机多硬盘模式伪分布式Minio在一台服务器上搭建服务但数据分散在多块大于4块磁盘上提供数据安全保障。多主机多硬盘模式分布式通过共享access_key和secret_key在多台服务器上搭建服务且数据分散在多块大于4块无上限磁盘上提供强大的数据冗余机制Reed-Solomon纠删码。分布式安装安装步骤省略。单独对每个节点进行访问显然不合理可通过nginx代理进行负载均衡。安装nginxyuminstallepel-release-yyuminstallnginx-ysystemctl start nginx systemctl status nginx systemctlenablenginxvi /etc/nginx/conf.d/minio.conf添加配置文件upstream minio_api { server 192.168.182.110:9000; server 192.168.182.111:9000; server 192.168.182.112:9000; } upstream minio_console { server 192.168.182.110:9001; server 192.168.182.111:9001; server 192.168.182.112:9001; } server { listen 19000; server_name 192.168.182.110; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 300; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_ignore_client_abort on; proxy_pass http://minio_api; } } server { listen 19001; server_name 192.168.182.110; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 300; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_ignore_client_abort on; proxy_pass http://minio_console; } }重启加载配置nginx-tnginx-sreload# 或systemctl reload nginx客户端提供Java、JS、Python、Golang、.Net等各语言的SDK。命令行不完全子命令列表命令描述ls列出文件和文件夹mb创建一个存储桶或一个文件夹cat显示文件和对象内容pipe将一个STDIN重定向到一个对象、文件或STDOUTshare生成用于共享的URLcp拷贝文件和对象mirror给存储桶和文件夹做镜像find基于参数查找文件diff对两个文件夹或存储桶比较差异rm删除文件和对象events管理对象通知watch监听文件和对象的事件policy管理访问策略session为cp命令管理保存的会话config管理mc配置文件update检查软件更新version输出版本信息mcMinIO Client mc 命令行工具为 UNIX 命令如 ls、cat、cp、mirror 和提供一种现代替代方案并 diff 支持文件系统和兼容 Amazon S3 的云存储服务。mc 命令行工具是为与 AWS S3 API 兼容而构建的并针对预期的功能和行为测试MinIO 和 AWS S3。MinIO 不为其他与 S3 兼容的服务提供任何保证因为它们的 S3 API 实现是未知的因此不受支持。下载cd/opt/minio/wgethttps://dl.min.io/client/mc/release/linux-amd64/mcchmodxmc./mc--help添加 MinIO 存储服务MinIO 服务器显示 URL访问权和秘密密钥。用法mc config host add ALIAS YOUR-MINIO-ENDPOINT [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]示例cd/opt/minio/# 明文输入./mc confighostaddminio http://local-168-182-110:19000 admin123456# 密文输入推荐./mc confighostaddminio http://local-168-182-110:19000 Enter Access Key: admin Enter Secret Key:123456测试cd/opt/minio/# 获取别名为minio的MinIO服务器信息./mc admin info minio# 添加外壳别名以获取信息以便恢复aliasminfo/opt/minio/mc admin infoaliasmheal/opt/minio/mc admin healJavaMaven项目引入如下依赖dependencygroupIdio.minio/groupIdartifactIdminio/artifactId/dependency配置类minio:url:http://192.168.100.144# 秘钥accessKey:123456secretKey:abcdefService工具类封装Slf4jServicepublicclassMinioService{Value(${minio.url})privateStringurl;Value(${minio.accessKey})privateStringaccessKey;Value(${minio.secretKey})privateStringsecretKey;privateMinioClientinstance;PostConstructpublicvoidinit(){try{instancenewMinioClient(url,accessKey,secretKey);}catch(Exceptione){log.error(init MinioClient error:{},e);}}// 判断bucket是否存在publicbooleanbucketExists(StringbucketName){try{returninstance.bucketExists(bucketName);}catch(Exceptione){log.error(bucketExists error:{},e);}returnfalse;}// 创建bucketpublicvoidmakeBucket(StringbucketName)throwsException{booleanisExistinstance.bucketExists(bucketName);if(!isExist){instance.makeBucket(bucketName);}}// 文件上传SuppressWarnings(deprecation)publicvoiduploadFile(StringbucketName,StringobjectName,InputStreamstream)throwsException{instance.putObject(bucketName,objectName,stream,application/octet-stream);}// 获取文件URLexpires是过期时间秒publicStringgetFileUrl(StringbucketName,StringobjectName,Integerexpires)throwsException{returninstance.presignedGetObject(bucketName,objectName,expires);}publicInputStreamdownFile(StringbucketName,StringobjectName)throwsException{returninstance.getObject(bucketName,objectName);}publicvoiddelFile(StringbucketName,StringobjectName)throwsException{instance.removeObject(bucketName,objectName);}}进阶纠删码即便丢失一半数量N/2硬盘仍然可恢复数据。Minio在分布式和单机模式下所有读写操作都严格遵守read-after-write一致性模型。对象存储都是存的比较大的数据写入耗时比协调耗时要长的多没必要使用类似Raft或Paxos一样的复杂协调机制。纠删码是一种恢复丢失和损坏数据的数学算法该技术在分布式存储系统中的应用主要有三类阵列纠删码Array Code: RAID5、RAID6等RS(Reed-Solomon)里德-所罗门类纠删码LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。压缩多租户FederationSTSSecure Token Service安全令牌服务监控暴露3个endpoint/minio/health/live不鉴权指示服务器是否工作正常/minio/health/ready不鉴权指示服务器是否由于重负载而未接受连接/minio/prometheus/metrics鉴权对比产品HDFSFastDFSMinIO开发语言JavaCgo部署麻烦文档不完整读速度写速度分布式高可用参考