分布式存储
分布式存储中有三种概念(分类):
- 块存储:将多个硬件介质或者是多个虚拟介质通过一些手段连接,看起来就像是一个存储介质。如多个服务器组成块存储
- 因为是多个介质,所有可以实现并行写入,动态扩容等功能
- 不利于不同操作系统主机间介质的数据共享
- 成本比文件存储高
- 块存储适合数据库
- 文件存储:存取方式是直接通过文件路径对一个硬件介质进行读写(单服务器)。不需要关心文件存储系统的文件组织方式与结构
- 因为是一个物理主机,所以读写速度比不上块存储。不存在数据共享的问题
- 常见的有
FastDFS(轻量级分布式文件系统,基于c语言实现)
对象存储:兼顾文件存储利于共享和块存储速度快,易扩展的优点.。一般采用键值对存储方式,根据键快速找文件。对象存储一般不支持追加修改
-
Windows安装
windows下直接下载
exe``64位的版本即可- 安装的时候建立一个文件夹,将exe程序放入其中,该文件夹自动作为
MINIO_HOME(即minio的根目录)
- 安装的时候建立一个文件夹,将exe程序放入其中,该文件夹自动作为
- 启动:进入MINIO_HOME,执行
minio.exe server ./data。启动后打开localhost:9000进入控制台。默认的用户名与密码都是minioadmin -
借助WinSW启停MinIO
上面的方式启动时可能会报注册失败的错误(这可能根windows版本有关)。这时需要借助WinSw进行启停Minio
- 将WinSW程序放在Minio_home下,并重命名位
systemctl.exe 然后在minio的根目录下位winsw创建一个配置文件,命名为
systemctl.xml- 该配置文件的作用是winsw以什么命令启停minio
```xml
minio-server MinIO Server MinIO Server
%BASE%\minio.exe server %BASE%\data %BASE%\logs roll ```- 该配置文件的作用是winsw以什么命令启停minio
```xml
然后执行如下命令以安装minio服务,安装成功后就可以在windows的服务里看到minio ```shell
安装服务。开机启动,当前未启动,重启后生效。
systemctl install
通过 windows 的 sc 命令,将启动规则调整为手动启动。
sc config minio-server start= demand
sc config minio-server start= auto
sc config minio-server start= disabled
如果需要解除安装,首先将服务停止,然后
systemctl uninstall
查看状态
systemctl status
启动服务
systemctl start
停止服务
systemctl stop
<a name="poa9i"></a>## Linux下的安装- 执行如下操作<a name="CHYAi"></a>## docker安装```shelldocker pull minio/miniodocker run \--rm \--name minio-9000 \-v /mnt/data:/data \-p 9000:9000 \minio/minio \server /data
使用MinIO
控制台使用
- 进入控制台后,可以创建一个存储桶,桶里面可以上传文件。文件详情可以查看文件大小,最后一次修改时间。还可以下载文件,或者分享文件(即得到一个下载链接,分享还可以设置过期时间)
- 存储桶即相当于一个文件夹
- 桶可以设置公共或者私人。公共的可以直接通过类似
**http://ip:9000/桶名/文件名**的方式进行下载; 如果是私人的则按照前面的方式是无法下载的,需要通过接口/控制台获取带一系列参数的外链- 注意外链是公共ip地址,即便是本地安装的也无法通过
**127.0.0.1**访问文件
- 注意外链是公共ip地址,即便是本地安装的也无法通过
- 桶可以设置公共或者私人。公共的可以直接通过类似
- 在一个桶里重复上传同名文件,新文件会进行覆盖老文件(sdk根控制台里是一个原理)
依赖
```xmlcom.squareup.okhttp3 okhttp 4.8.1
//下面的版本需要大于4.8.1以上的okhttp,而spring cloud自带的和minio集成引入的都没有这么高,因此需要上面手动引入高版本
<a name="QWT1P"></a>
# 使用MinIO Java SDK
- 还有很多获取
```java
// 构建一个连接,可以提取为配置bean
MinioClient minioClient = MinioClient.builder()
.endpoint("http://127.0.0.1:9000")
.credentials("minioadmin", "minioadmin")
.build();
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket("img").build());
if (isExist) {
System.out.println("Bucket already exists.");
} else {
// 如果桶不存在就创建该桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket("asiatrip").build());
}
// 构造一个输入流
File file = new File("C:\\Users\\Lw\\Desktop\\浙统云外网OA_V2.0.0系统测试报告20220601.docx");
InputStream inputStream = new FileInputStream(file);
//设置要存储的桶,文件名,文件类型,文件流
//不设置文件类型自动识别类型
PutObjectArgs args = PutObjectArgs.builder()
.bucket("img")
//如果是桶下面还有目录,就在对象名设置这里添加路径。如桶下面还有多级目录img/2022
那就img/2022/浙统云外网.docx img前面有无/都可以
//获取外链,删除,查询文件信息等也是如此
.object("浙统云外网.docx")
.contentType("image/png")
.stream(inputStream, inputStream.available(), -1) //available获取流的字节数,适用于本地读取,网络文件流可能是分批的
.build();
//开始上传
minioClient.putObject(args);
GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(expires) // 单位:秒
.build();
try {
//url里有一个参数是过期时间,可以让用户打开过期的文件时不是进入minio的错误页面,而是重定向到自定义过期页面
return minioClient.getPresignedObjectUrl(args);
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidResponseException | InvalidKeyException | NoSuchAlgorithmException | IOException | XmlParserException | ServerException e) {
throw new RuntimeException(e);
}
RemoveObjectArgs args = RemoveObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build();
minioClient.removeObject(args);
StatObjectArgs args = StatObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build();
try {
return minioClient.statObject(args);
// args.??? 可以获取到一系列文件信息
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
throw new RuntimeException(e);
}
