分布式存储

分布式存储中有三种概念(分类):

  • 块存储:将多个硬件介质或者是多个虚拟介质通过一些手段连接,看起来就像是一个存储介质。如多个服务器组成块存储
    • 因为是多个介质,所有可以实现并行写入,动态扩容等功能
    • 不利于不同操作系统主机间介质的数据共享
    • 成本比文件存储高
    • 块存储适合数据库
  • 文件存储:存取方式是直接通过文件路径对一个硬件介质进行读写(单服务器)。不需要关心文件存储系统的文件组织方式与结构
    • 因为是一个物理主机,所以读写速度比不上块存储。不存在数据共享的问题
    • 常见的有FastDFS(轻量级分布式文件系统,基于c语言实现)
  • 对象存储:兼顾文件存储利于共享和块存储速度快,易扩展的优点.。一般采用键值对存储方式,根据键快速找文件。对象存储一般不支持追加修改

    • 成本还是比文件存储更高
    • oss:即第三方提供的云对象存储服务
    • 常见的有MinIO

      MinIO

      简介

  • 基于Golang编写,轻量,性能也不错

    Windows安装

  • windows下直接下载exe``64位的版本即可

    • 安装的时候建立一个文件夹,将exe程序放入其中,该文件夹自动作为MINIO_HOME(即minio的根目录)
  • 启动:进入MINIO_HOME,执行minio.exe server ./data。启动后打开localhost:9000进入控制台。默认的用户名与密码都是minioadmin
  • 关闭:关闭命令行窗口或者ctrl+c进行关闭

    借助WinSW启停MinIO

  • 上面的方式启动时可能会报注册失败的错误(这可能根windows版本有关)。这时需要借助WinSw进行启停Minio

  • 将WinSW程序放在Minio_home下,并重命名位systemctl.exe
  • 然后在minio的根目录下位winsw创建一个配置文件,命名为systemctl.xml

    • 该配置文件的作用是winsw以什么命令启停minio ```xml minio-server MinIO ServerMinIO Server

    %BASE%\minio.exe

    server %BASE%\data

    %BASE%\logs roll ```

  • 然后执行如下命令以安装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

  1. <a name="poa9i"></a>
  2. ## Linux下的安装
  3. - 执行如下操作
  4. <a name="CHYAi"></a>
  5. ## docker安装
  6. ```shell
  7. docker pull minio/minio
  8. docker run \
  9. --rm \
  10. --name minio-9000 \
  11. -v /mnt/data:/data \
  12. -p 9000:9000 \
  13. minio/minio \
  14. server /data

使用MinIO

控制台使用

  • 进入控制台后,可以创建一个存储桶,桶里面可以上传文件。文件详情可以查看文件大小,最后一次修改时间。还可以下载文件,或者分享文件(即得到一个下载链接,分享还可以设置过期时间)
  • 存储桶即相当于一个文件夹
    • 桶可以设置公共或者私人。公共的可以直接通过类似**http://ip:9000/桶名/文件名**的方式进行下载; 如果是私人的则按照前面的方式是无法下载的,需要通过接口/控制台获取带一系列参数的外链
      • 注意外链是公共ip地址,即便是本地安装的也无法通过**127.0.0.1**访问文件
  • 在一个桶里重复上传同名文件,新文件会进行覆盖老文件(sdk根控制台里是一个原理)

    依赖

    ```xml com.squareup.okhttp3 okhttp 4.8.1

//下面的版本需要大于4.8.1以上的okhttp,而spring cloud自带的和minio集成引入的都没有这么高,因此需要上面手动引入高版本

io.minio minio 8.3.9

<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);
        }