MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。试用相比 hadoop hdfs 分布式存储服务轻量很多。且支持单节点部署,非常容易上手。推荐使用!
官网地址,含官方文档
http://docs.minio.org.cn/docs/
部署
单节点部署
#1 下载地址
https://dl.min.io/server/minio/release/windows-amd64/minio.exe
#2 cmd 启动 server 指定数据存储目录
minio.exe server E:\data1
#3 启动日志如下
Endpoint: http://169.254.6.240:9000 http://169.254.157.192:9000 http://169.254.87.123:9000 http://192.168.10.112:9000 http://169.254.0.44:9000 http://169.254.143.36:9000 http://127.0.0.1:9000
Browser Access:
http://169.254.6.240:9000 http://169.254.157.192:9000 http://169.254.87.123:9000 http://192.168.10.112:9000 http://169.254.0.44:9000 http://169.254.143.36:9000 http://127.0.0.1:9000
Object API (Amazon S3 compatible):
Go: https://docs.min.io/docs/golang-client-quickstart-guide
Java: https://docs.min.io/docs/java-client-quickstart-guide
Python: https://docs.min.io/docs/python-client-quickstart-guide
JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
.NET: https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
Exiting on signal: INTERRUPT
分部署部署
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
- 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 分布式Minio里的节点时间差不能超过3秒
- 分布式部署至少需要4个节点,否则启动会报错
linux 启动分布式Minio实例,4个节点,每节点1块盘;命令需要在每个服务器执行一遍
export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin
minio server http://192.168.10.11/data1 http://192.168.10.12/data2 \
http://192.168.10.13/data3 http://192.168.10.14/data4 \
win 启动分布式Minio实例,1个节点,4块盘(目前win分布式部署处于实验阶段慎重使用)
set MINIO_ACCESS_KEY=minioadmin
set MINIO_SECRET_KEY=minioadmin
minio.exe server http://192.168.10.112/E:/data1 http://192.168.10.112/E:/data2 http://192.168.10.112/E:/data3 http://192.168.10.112/E:/data4
UI查看
#账号密码 'minioadmin'
http://127.0.0.1:9000
客户端
Maven依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
上传功能
public static void main(String[] args) {
try {
// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient("http://192.168.10.112:9000", "minioadmin", "minioadmin");
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists("asiatrip");
if(isExist) {
System.out.println("Bucket already exists.");
} else {
// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
minioClient.makeBucket("asiatrip");
}
// 使用putObject上传一个文件到存储桶中。
// 存储桶\上传文件名称\上传文件目录\PutObjectOptions(上传InputStream对象时传)
minioClient.putObject("asiatrip","0.zip", "E:/0.zip",null);
System.out.println(" End:"+sdf.format(new Date()));
} catch(MinioException e) {
System.out.println("Error occurred: " + e);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
下载功能
public static void main(String[] args) {
try {
// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient("http://192.168.10.112:9000", "minioadmin", "minioadmin");
try {
// 调用statObject()来判断对象是否存在。
// 如果不存在, statObject()抛出异常,
// 否则则代表对象存在。
minioClient.statObject("asiatrip", "test.zip");
// 获取"myobject"的输入流。
InputStream input = minioClient.getObject("asiatrip", "test.zip");
//将输入流输出到磁盘文件,byte[文件大小]
byte[] bytes = new byte[1289500];
int index;
File file = new File("e:/test.zip");
FileOutputStream downloadFile = new FileOutputStream(file);
while ((index = input.read(bytes)) != -1) {
downloadFile.write(bytes, 0, index);
downloadFile.flush();
}
downloadFile.close();
// 关闭流,此处为示例,流关闭最好放在finally块。
input.close();
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}