209 lines
7.0 KiB
Markdown
209 lines
7.0 KiB
Markdown
|
## MinIO是什么?
|
|||
|
|
|||
|
![](https://lsky.hhdxw.top/imghub/2024/01/image-202401101704861743.png)
|
|||
|
|
|||
|
官方解释:MinIO 是一个基于Apache License v2.0开源协议的[对象存储](https://cloud.tencent.com/product/cos?from_column=20065&from=20065)服务。它兼容亚马逊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系统下,我们可以像这样安装:
|
|||
|
|
|||
|
```sh
|
|||
|
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)系统下,可以像这样安装:
|
|||
|
|
|||
|
```sh
|
|||
|
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文件数据的目录:
|
|||
|
|
|||
|
```sh
|
|||
|
sudo mkdir /mnt/minio
|
|||
|
```
|
|||
|
|
|||
|
然后创建一个minio使用的用户,并为此用户分配对应目录的访问权限:
|
|||
|
|
|||
|
```sh
|
|||
|
groupadd -r minio-user
|
|||
|
useradd -M -r -g minio-user minio-user
|
|||
|
chown minio-user:minio-user /mnt/minio
|
|||
|
```
|
|||
|
|
|||
|
接着我们需要创建Minio的配置文件:
|
|||
|
|
|||
|
```sh
|
|||
|
sudo vim /etc/default/minio
|
|||
|
```
|
|||
|
|
|||
|
编写以下内容到配置文件中:
|
|||
|
|
|||
|
```properties
|
|||
|
#系统管理员账号和密码
|
|||
|
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服务了:
|
|||
|
|
|||
|
```sh
|
|||
|
sudo systemctl enable minio.service
|
|||
|
sudo systemctl start minio.service
|
|||
|
```
|
|||
|
|
|||
|
### 使用Docker安装
|
|||
|
|
|||
|
对于各位小伙伴本地开发测试,这里更推荐使用Docker镜像安装,非常简单快捷,本地安装好Docker客户端之后,只需要执行以下命令就能快速部署:
|
|||
|
|
|||
|
```sh
|
|||
|
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已经为我们提供了封装好的依赖,我们只需要直接使用即可:
|
|||
|
|
|||
|
```xml
|
|||
|
<dependency>
|
|||
|
<groupId>io.minio</groupId>
|
|||
|
<artifactId>minio</artifactId>
|
|||
|
<version>8.3.9</version>
|
|||
|
</dependency>
|
|||
|
```
|
|||
|
|
|||
|
接着我们需要创建一个Minio客户端用于访问对象存储服务器:
|
|||
|
|
|||
|
```java
|
|||
|
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,这里我们先演示一下文件上传:
|
|||
|
|
|||
|
```java
|
|||
|
//首先找到我们需要上传的文件
|
|||
|
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方法完成上传操作
|
|||
|
```
|
|||
|
|
|||
|
这样就可以将文件上传到对象存储服务器中了。
|
|||
|
|
|||
|
接着是下载文件:
|
|||
|
|
|||
|
```java
|
|||
|
//填写下载相关的参数,使用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();
|
|||
|
```
|
|||
|
|
|||
|
最后是删除桶里的文件:
|
|||
|
|
|||
|
```java
|
|||
|
RemoveObjectArgs remove = RemoveObjectArgs.builder()
|
|||
|
.bucket("test") //设置需要删除文件的桶名称
|
|||
|
.object("666.jpg") //设置删除的文件名称
|
|||
|
.build();
|
|||
|
client.removeObject(remove); //删就完事
|
|||
|
```
|
|||
|
|
|||
|
### 服务器文件上传和下载
|
|||
|
|
|||
|
实例代码:
|
|||
|
|
|||
|
```java
|
|||
|
@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());
|
|||
|
}
|
|||
|
}
|
|||
|
```
|