简介
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
MinIO是一种高性能的分布式对象存储系统。它是软件定义的,可在行业标准硬件上运行,并且在Apache V2许可下是100%开放源代码。
MinIO的不同之处在于,它从一开始就被设计为私有云对象存储的标准。由于MinIO是专门为仅服务对象而构建的,因此单层体系结构可在不妥协的情况下实现所有必需的功能。结果是一个同时具有性能,可伸缩性和轻量级的云原生对象服务器。
尽管MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色,但在克服与机器学习,分析和云原生应用程序工作负载相关的私有云挑战方面却独树一帜。
更多请参考官方网站:https://min.io/
单机安装
二进制安装
1 2 3 4 5 6 7 8 9 10 11
| $ wget https://dl.min.io/server/minio/release/linux-amd64/minio
$ chmod 755 minio
$ ./minio server ./data
$ nohup ./minio server --address 127.0.0.1:9001 ./data &
|
docker 安装
1 2 3 4 5 6 7
| $ docker pull minio/minio $ docker run -p 9000:9000 --name minio1 \ -e "MINIO_ACCESS_KEY=minio123" \ -e "MINIO_SECRET_KEY=minio123" \ -v /mnt/data:/data \ -v /mnt/config:/root/.minio \ minio/minio server /data
|
分布式安装
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。
分布式Minio有什么好处?
在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
数据保护
分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。
注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。
一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
分布式搭建的流程和单机搭建基本一样,Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式。
运行分布式Minio
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
- 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
- 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用
二进制部署
这里我采用两个节点,每个节点两块硬盘
每个节点都要执行以下命令
数据存储目录
1 2 3
| $ mkdir -p /minio/data1 $ mkdir -p /minio/data2
|
配置目录
默认的配置目录是 ${HOME}/.minio
,可以使用 --config-dir
命令行选项重写。MinIO server在首次启动时会生成一个新的config.json
,里面带有自动生成的访问凭据。
下载上传文件
(下载请参考上面单机二进制安装链接),我这里上传到 /usr/local/minio/
1
| $ mkdir -p /usr/local/minio/
|
编写启动脚本
1
| $ vim /usr/local/minio/run.sh
|
1 2 3 4 5 6 7 8 9
| #!/bin/bash export MINIO_ACCESS_KEY=minio export MINIO_SECRET_KEY=minio123 /usr/local/minio/minio server --config-dir /etc/minio \ http://192.168.80.230/minio/data1 \ http://192.168.80.230/minio/data2 \ http://192.168.80.231/minio/data1 \ http://192.168.80.231/minio/data2 \
|
编辑服务脚本
1
| $ vim /usr/lib/systemd/system/minio.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] Description=Minio service Documentation=https://docs.minio.io/ [Service] WorkingDirectory=/usr/local/minio/ ExecStart=/usr/local/minio/run.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
|
WorkingDirectory 为启动脚本目录
ExecStart 为启动脚本文件
给这三个文件授权
1 2 3 4 5
| $ chmod +x /usr/local/minio/minio $ chmod +x /usr/local/minio/run.sh $ chmod +x /usr/lib/systemd/system/minio.service
|
启动停止一些命令
1 2 3 4 5 6 7 8
| $ systemctl daemon-reload $ systemctl start minio $ systemctl stop minio $ systemctl enable minio
|
重复7个步骤在其他节点再执行
docker-compose 部署
Docker Compose允许定义和运行单主机,多容器Docker应用程序。
使用Compose,您可以使用Compose文件来配置MinIO服务。 然后,使用单个命令,您可以通过你的配置创建并启动所有分布式MinIO实例。 分布式MinIO实例将部署在同一主机上的多个容器中。 这是建立基于分布式MinIO的开发,测试和分期环境的好方法。
新建docker-compose.yaml 文件(这里为了方便先在一个centos7 下运行部署多个minio)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| version: '3.7'
services: minio1: image: minio/minio:RELEASE.2020-04-23T00-58-49Z volumes: - data1-1:/data1 - data1-2:/data2 ports: - "9001:9000" environment: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 command: server http://minio{1...4}/data{1...2} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio2: image: minio/minio:RELEASE.2020-04-23T00-58-49Z volumes: - data2-1:/data1 - data2-2:/data2 ports: - "9002:9000" environment: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 command: server http://minio{1...4}/data{1...2} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio3: image: minio/minio:RELEASE.2020-04-23T00-58-49Z volumes: - data3-1:/data1 - data3-2:/data2 ports: - "9003:9000" environment: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 command: server http://minio{1...4}/data{1...2} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio4: image: minio/minio:RELEASE.2020-04-23T00-58-49Z volumes: - data4-1:/data1 - data4-2:/data2 ports: - "9004:9000" environment: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 command: server http://minio{1...4}/data{1...2} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3
volumes: data1-1: data1-2: data2-1: data2-2: data3-1: data3-2: data4-1: data4-2:
|
启动

可以使用 nginx 对着4台机器进行负载均衡,具体配置自行查阅
测试
在一台机器后创建bucket 或上传文件会自动同步到其他节点。以下上传一个图片,进行测试

java 操作minio
maven 引入依赖
1 2 3 4 5
| <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency>
|
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| import java.io.*; import java.security.NoSuchAlgorithmException; import java.security.InvalidKeyException; import org.xmlpull.v1.XmlPullParserException; import io.minio.MinioClient; import io.minio.errors.MinioException;
public class FileUploader { public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException { try { String endpoint = "http://127.0.0.1:9001/"; String accessKey = "minio"; String secretKey = "minio123"; String bucketName = "test111"; String uploadFilePath = "C:\\Bing壁纸\\AbuSimbel_ROW8423253975_1920x1080.jpg"; MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey); boolean isExist = minioClient.bucketExists(bucketName); if (isExist) { System.out.println("Bucket already exists."); } else { minioClient.makeBucket(bucketName); } File file = new File(uploadFilePath); if (!file.exists()) { System.out.println("上传文件不存在"); }
minioClient.putObject(bucketName, file.getName(), uploadFilePath, null);
minioClient.getObject(bucketName, file.getName(), "D://" + file.getName()); } catch (MinioException e) { System.out.println("Error occurred: " + e); } } }
|
官方参考硬件
