目录
一、概述
1、Minio介绍
2、Minio的基础概念
3、Minio安装
3.1、Docker容器中安装
3.2、Windows运行安装
4、分布式Minio优势
数据保护
高可用
一致性
5、Minio客户端使用
6、SpringBoot工程引入Minio
一、概述
Minio分布式文件系统。
Minio是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
Minio是一个非常轻量的服务,可以很简单的和其他应用的结合,类似NodeJS,Redis或者MySQL。
1、Minio介绍
Minio官网
Minio中文官网
Minio是全球领先的对象存储先锋,目前在全世界有数百万的用户。
高性能:在标准硬件上,读/写速度上高达183GB/秒和171GB/秒,拥有更高的吞吐量和更低的延迟。
可扩展性:为对象存储带来了简单的缩放模型,通过添加更多集群可以扩展空间。
简单:极简主义是Minio的指导性设计原则,即可在几分钟内安装和配置。
与Amazon S3兼容:亚马逊云的S3 API(接口协议)是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。
数据安全:使用纠删码来保护数据免受硬件故障和无声数据损坏。
纠删码:是一种恢复丢失和损坏数据的数学算法,Minio默认采用Reed-Solomon code将数据拆分成N/2个数据块和N/2个奇偶校验块。这就意味着如果是16块盘,一个对象会被分成8个数据块、8个奇偶校验块,你可以丢失任意8块盘(不管其是存放的数据块还是校验块),你仍可以从剩下的盘中的数据进行恢复。
N/2+1块磁盘才能上传数据。
分布式MinIO快速入门
2、Minio的基础概念
Object:存储到Minio的基础对象,如文件、字节流、Anything...
Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
Drive:即存储数据的磁盘,在Minio启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive里。
Set:即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同的位置,一个对象存储在一个Set上。
一个对象存储在一个Set上。
一个集群划分为多个Set。
一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出。
一个Set中的Drive尽可能分布在不同的节点上。
3、Minio安装
3.1、Docker容器中安装
Docker 中安装Minio示例
3.2、Windows运行安装
要在 64 位 Windows 主机上运行 MinIO,请从以下 URL 下载 MinIO 可执行文件:
http://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
启动:D:\minio\data\为存储数据位置
minio.exe server D:\minio\data\
编写.bat文件启动
minio.exe server D:\minio\data\
浏览器访问:http://192.168.0.171:9000/
用户名/密码:minioadmin/minioadmin
4、分布式Minio优势
数据保护
分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot。
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如:一个16节点的Minio集群,每个节点16块硬盘,就算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服务器才能写数据。
一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
分布式Minio里的节点时间差不能超过3秒,你可以使用NTP来保证时间一致。
5、Minio客户端使用
MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹。
cat 显示文件和对象内容。
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
find 基于参数查找文件。
diff 对两个文件夹或者存储桶比较差异。
rm 删除文件和对象。
events 管理对象通知。
watch 监听文件和对象的事件。
policy 管理访问策略。
session 为cp命令管理保存的会话。
config 管理mc配置文件。
update 检查软件更新。
version 输出版本信息。
Minio客户端使用
下载mc.exe客户端等进行命令使用。
Minio admin使用
MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。
service 服务重启并停止所有MinIO服务器
update 更新更新所有MinIO服务器
info 信息显示MinIO服务器信息
user 用户管理用户
group 小组管理小组
policy MinIO服务器中定义的策略管理策略
config 配置管理MinIO服务器配置
heal 修复MinIO服务器上的磁盘,存储桶和对象
profile 概要文件生成概要文件数据以进行调试
top 顶部提供MinIO的顶部统计信息
trace 跟踪显示MinIO服务器的http跟踪
console 控制台显示MinIO服务器的控制台日志
prometheus Prometheus管理Prometheus配置
kms kms执行KMS管理操作
6、SpringBoot工程引入Minio
MinIO Java Client SDK提供简单的API来访问任何与Amazon S3兼容的对象存储服务。
官方Demo 找到examples下面都是demo
pom依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>me.tongfei</groupId>
<artifactId>progressbar</artifactId>
<version>0.5.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
</dependency>
上传下载例子minio在windows上上传和读取成功!
import java.io.InputStream;
import java.util.List;
import org.apache.commons.io.IOUtils;
import io.minio.MinioClient;
public class MinioDemo {
static String endpoint = "http://192.168.0.171:9000";
static String accessKey="minioadmin";
static String secretKey="minioadmin";
public static void main(String[] args) throws Exception {
//获取Minio的客户端对象
MinioClient client =new MinioClient(endpoint,accessKey,secretKey);
//先判断Bucket是否存在
String bucketName ="test666";
boolean exists = client.bucketExists(bucketName);
if (exists) {
//存在Bucket
System.out.println("Bucket already exists.");
}else {
client.makeBucket(bucketName);
}
//上传文件
client.putObject(bucketName, "/test1.txt", "D:\\test1.txt", null);
System.out.println("文件上传成功");
//文件下载
InputStream in = client.getObject(bucketName, "/test1.txt");
List<String> list = IOUtils.readLines(in,"UTF-8");
list.stream().forEach(o->System.out.println(o));
}
}
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。