Note/环境/安装教程/Minio.md

7.0 KiB
Raw Permalink Blame History

MinIO是什么

官方解释MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口非常适合于存储大容量非结构化的数据例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等而一个对象文件可以是任意大小从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

MinIO有哪些优势

1. 开发文档全面

MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档。。

官网文档地址:https://docs.min.io/cn/

2.高性能

MinIO号称是目前速度最快的对象存储服务器。在标准硬件上对象存储的读/写速度最高可以高达183 GB/s和171 GB/s。对象存储可以作为主存储层用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。

MinIO用作云原生应用程序的主要存储和传统对象存储相比云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。

3.容器化集成方便

MinIO提供了与k8s、etcd、docker等主流容器化技术深度集成方案。

安装MinIo服务

想要安装Minio有两种方案第一种是直接在服务器上安装还有一种是使用Docker快速部署。

官方文档:https://www.minio.org.cn/docs/cn/minio

直接安装

安装包下载页面:https://dl.min.io/server/minio/release/我们需要选择好对应架构和系统的安装包比如Ubuntu/Debian系统下我们可以像这样安装

wget https://dl.min.io/server/minio/release/linux-amd64/minio_20230831153116.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

在CentOS/Redhat(RHEL)系统下,可以像这样安装:

wget https://dl.min.io/server/minio/release/linux-amd64/minio-20230831153116.0.0.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm

安装完成后我们需要创建一个用于存放minio文件数据的目录

sudo mkdir /mnt/minio

然后创建一个minio使用的用户并为此用户分配对应目录的访问权限

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/minio

接着我们需要创建Minio的配置文件

sudo vim /etc/default/minio

编写以下内容到配置文件中:

#系统管理员账号和密码
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=password
#设置用于存储数据的目录
MINIO_VOLUMES="/mnt/minio"
#项目接口访问地址
MINIO_SERVER_URL="http://0.0.0.0:9000"
#配置其他选项,比如后台管理系统的地址
MINIO_OPTS="--console-address 0.0.0.0:9090"

配置完成之后就可以启动Minio服务了

sudo systemctl enable minio.service
sudo systemctl start minio.service

使用Docker安装

对于各位小伙伴本地开发测试这里更推荐使用Docker镜像安装非常简单快捷本地安装好Docker客户端之后只需要执行以下命令就能快速部署

docker run -p 9000:9000 -p 9090:9090 --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=minio" \
     -e "MINIO_SECRET_KEY=password" \
     -v database:/data \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

非常方便快捷。


使用Java操作对象存储

前面我们搭建好了对象存储服务,接着就可以开始愉快地使用了。

基本使用

Minio已经为我们提供了封装好的依赖我们只需要直接使用即可

<dependency>
     <groupId>io.minio</groupId>
     <artifactId>minio</artifactId>
     <version>8.3.9</version>
</dependency>

接着我们需要创建一个Minio客户端用于访问对象存储服务器

MinioClient client = MinioClient.builder()
        .endpoint("http://localhost:9000")  //对象存储服务地址注意是9000那个端口
        .credentials("minio", "password")   //账户直接使用管理员
        .build();

对于Java的相关操作可以说非常全面包含对桶的操作、对象操作等等文档地址https://www.minio.org.cn/docs/cn/minio/linux/developers/java/API.html这里我们先演示一下文件上传

//首先找到我们需要上传的文件
File file = new File("/Users/nagocoler/Downloads/test.jpg");
//构造一个输入流用于文件传输
FileInputStream stream = new FileInputStream(file);
//填写上传的相关参数使用PutObjectArgs的Builder来完成
PutObjectArgs put = PutObjectArgs.builder()
        .bucket("test")   //设置需要上传的桶名称
        .object("666.jpg")  //设置上传后保存的文件名称
        .stream(stream, file.length(), -1)  //配置流以及大小还有分片大小
        .build();
client.putObject(put);   //使用putObject方法完成上传操作

这样就可以将文件上传到对象存储服务器中了。

接着是下载文件:

//填写下载相关的参数使用GetObjectArgs来完成
GetObjectArgs get = GetObjectArgs.builder()
        .bucket("test")   //设置需要下载的桶名称
        .object("666.jpg")  //设置下载后保存的文件名称
        .build();
GetObjectResponse response = client.getObject(get);
//使用输出流保存下载的文件到本地
FileOutputStream stream = new FileOutputStream("/Users/nagocoler/Downloads/download.png");
stream.write(response.readAllBytes());
stream.close();

最后是删除桶里的文件:

RemoveObjectArgs remove = RemoveObjectArgs.builder()
        .bucket("test")   //设置需要删除文件的桶名称
        .object("666.jpg")   //设置删除的文件名称
        .build();
client.removeObject(remove);  //删就完事

服务器文件上传和下载

实例代码:

@RestController
@RequestMapping("/")
public class FileController {

    @Resource
    MinioClient client;

    @PostMapping("upload")
    public String upload(@RequestParam("file") MultipartFile file) throws Exception {
        InputStream stream = file.getInputStream();
        String name = UUID.randomUUID().toString();
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket("test")
                .object("upload/"+name)
                .stream(stream, file.getSize(), -1)
                .build();
        client.putObject(args);
        return name;
    }

    @GetMapping("file/{name}")
    public void file(@PathVariable("name") String name,
                     HttpServletResponse response) throws Exception{
        GetObjectResponse object = client.getObject(GetObjectArgs.builder().bucket("test").object("upload/"+name).build());
        ServletOutputStream stream = response.getOutputStream();
        stream.write(object.readAllBytes());
    }
}