MinIO 分布式文件(对象)存储

  1. 简介
    MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品

官网地址:http://www.minio.org.cn/

  1. 下载
    官网下载(8.4.3版本):http://www.minio.org.cn/download.shtml
java 复制代码
1、拉取镜像(https://hub.docker.com/r/minio/minio/tags)

# 下载新版minio
docker pull minio/minio

# 或者下载指定版本的minio
docker pull minio/minio:RELEASE.2021-04-06T23-11-00Z  

2、创建容器

docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio server /data

# 或者指定镜像版本并创建容器
docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio:RELEASE.2021-04-06T23-11-00Z server /data

-p 9000:9000 ,端口映射
-e,环境变量
-d,后台运行
--name,给容器起名字
--restart=always,开机自启
-e "MINIO_ACCESS_KEY=minio",设置账号
-e "MINIO_SECRET_KEY=minio123",设置密码
-v 挂载数据卷
07
  1. 运行
    创建四个文件夹data0、data1、data2、data3,用存放文件。

「启动minio服务」

java 复制代码
# mac/linux
./minio server ./data0 ./data1 ./data2 ./data3
 
# windows
minio.exe server ./data0 ./data1 ./data2 ./data3
访问地址:http://127.0.0.1:9000/,默认账号和密码都是:minioadmin。
  1. 创建桶

在Minio和其他一些对象存储服务中,"桶"(Bucket)是一个顶层的容器,用于组织和管理存储的对象(Object)。可以将桶类比为文件系统中的文件夹,用于将一组相关的对象进行组织和分类。

每个桶在Minio中具有唯一的名称,并且可以根据需要创建多个桶。用户可以使用桶名称来访问和操作其中的对象。桶名称是全局唯一的,因此需要确保不同应用程序使用不同的桶名称,以避免冲突。

我们创建一个test的桶(bucket)。

  1. SpringBoot 集成 MinIO
    5.1 pom.xml
    添加如下minio依赖
java 复制代码
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.3</version>
</dependency>

5.2 MinioConfiguration

配置minio的地址、账号和密码,配置上传文件的大小1024M。

java 复制代码
@Configuration
public class MinioConfiguration {

    private static final String END_POINT = "http://localhost:9000";

    private static final String USERNAME = "minioadmin";

    private static final String PASSWORD = "minioadmin";

    @Bean
    public MinioClient minioClient() {
        return new MinioClient.Builder()
                .endpoint(END_POINT)
                .credentials(USERNAME, PASSWORD)
                .build();
    }

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofMegabytes(1024));
        factory.setMaxRequestSize(DataSize.ofMegabytes(1024));
        return factory.createMultipartConfig();
    }
}

5.3 MinioController

upload上传文件接口:传入参数bucket,文件保存到minio后会返回fileName。

getUrl获取文件访问链接接口:传入参数path和bucket,返回可以访问的链接(7天有效)。这里的path就是上传文件的返回值fileName。

java 复制代码
@RequestMapping("minio")
@RestController
public class MinioController {
    @Resource
    private MinioClient minioClient;

    @PostMapping(value = "upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String upload(@RequestPart("file") MultipartFile file,
                         @RequestParam("bucket") String bucket) {
        try {
            int idx = Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf(".");
            String suffix = file.getOriginalFilename().substring(idx + 1);
            String fileName = UuidUtils.generateUuid() + "." + suffix;

            // 保存文件
            minioClient.putObject(PutObjectArgs.builder()
                    .stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE)
                    .object(fileName)
                    .contentType(file.getContentType())
                    .bucket(bucket)
                    .build());
            return fileName;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    @GetMapping("getUrl")
    public String getUrl(@RequestParam(name = "path") String path,
                         @RequestParam("bucket") String bucket) {
        try {
            // 获取文件访问地址 7天失效
            String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket(bucket)
                    .object(path).
                    method(Method.GET)
                    .expiry(7, TimeUnit.DAYS).build());
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}

5.4 okhttp3版本不兼容

如果出现okhttp3版本不兼容的问题,需要在pom.xml的properties节点下加上版本号,如下:

java 复制代码
<okhttp3.version>4.8.1 </okhttp3.version>

1、删除自动恢复

可以测试删除其中一半的存放位置,它过一会儿就自动恢复了,比如删除data0和data1,几分钟它就自动重新创建了文件,并且里面的内容也恢复了。

2、文件夹

上传的单个文件变成了文件夹

3 分块存储

点击到里面单个文件被拆分成了许多个小块

相关推荐
材料苦逼不会梦到计算机白富美2 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王2 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情2 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
ZHOU西口4 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk4 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
yx9o10 小时前
Kafka 源码 KRaft 模式本地运行
分布式·kafka
Gemini199510 小时前
分布式和微服务的区别
分布式·微服务·架构
G丶AEOM10 小时前
分布式——BASE理论
java·分布式·八股
P.H. Infinity16 小时前
【RabbitMQ】03-交换机
分布式·rabbitmq
龙哥·三年风水18 小时前
群控系统服务端开发模式-应用开发-个人资料
分布式·php·群控系统