minio
# Minio
# 官方文档
官网:https://min.io/ (opens new window)
中文:http://minio.org.cn/ (opens new window)
# 什么是 MinIo ?
人工智能数据基础设施的对象存储。
人工智能数据:
- 文本数据:新闻报道、社交媒体文章、博客......
- 语音数据:音频形式存储的数据,语音 mp3 文件......
- 图像数据:各种图片......
- 视频数据:各种视频、电影......
- 非结构化数据:没有明确结构的数据,比如社交评论、日志文件......
特征:
- 为人工智能系统提供数据支持,数据存储;
- 对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据;
- MinIO 存储的【元数据】主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
- 对象存储系统通常通过基于 HTTP 或 HTTPS 协议的 API(应用程序编程接口)进行数据读写;
minio 版权许可:
- MinIO 具有双重许可:
- 开源 GNU AGPL v3;(完全免费)
- 商业企业许可证;(收费)
- 兼容亚马逊 S3 云存储服务接口;
# MInIo 环境部署
# 环境准备
- Github:https://github.com/minio (opens new window)
- Gitee:https://gitee.com/mirrors/minio (opens new window)
- Linux 下载:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
- 赋予可执行权限:
chmod +x minio
或者chmod 744 minio
- minio 可执行程序怎么使用:minio [FLAGS] COMMAND [ARGS...]
- 赋予可执行权限:
# 启动 MInIo
执行命令:
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
或者:
./minio server /mnt/data --console-address ":9001"
后台启动(&结束):
./minio server /mnt/data --console-address ":9001" &
指令解析:
MINIO ROOT USER
指定 MinIO 的用户名;MINIO ROOT PASSWORD
指定 MinIO 的密码;/mnt/data
指定 MinIO 服务器用于存储数据的目录;console-address ":9001"
指定 MinIO 控制台的监听地址和端口(只写:
表示 MinIO 服务器监听所有地址上的 9000 端口)- 尾部加上与字符(
&
)代表后台启动
# MinIo 关闭
查询 MinIO 进程:ps -ef | grep minio
后台启动的 MinIO 如何关闭(杀死进程):kill pid
前台启动的 MinIO 如果关闭:ctrl + c
# 使用 Docker 启动 MinIo
# 安装 Docker
安装Docker | 沉梦听雨的编程指南 (cmty256.github.io) (opens new window)
# 拉取 MinIo 镜像
使用 Docker 镜像启动 MinIO
1、搜索 MinIO 镜像:docker search minio
2、拉取 MinIO 镜像:docker pull minio/minio
3、启动 MinIO 容器:docker run -p 9000:9000 -p 9001:9001 minio/minio server /mnt/docker/data --console-address :9001
(会出现默认账密)
# 官方文档示例:https://min.io/docs/minio/container/index.html
mkdir -p ~/software/minio/data
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-v ~/software/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
quay.io/minio/minio server /data --console-address ":9001"
2
3
4
5
6
7
8
9
10
11
解析:
上面的示例是这样工作的:
mkdir
在主目录中创建一个新的本地目录。~/software/minio/data
-p
选项告诉mkdir
命令要创建指定路径中的所有父目录,即使其中的一些父目录不存在也会创建。如果省略-p
选项,而其中的某些父目录不存在,则mkdir
命令将会报错。docker run
启动 MinIO 容器。-p
将本地端口绑定到容器端口。-name
为容器创建名称。-v
将文件路径设置为容器使用的持久卷位置。 当MinIO将数据写入/data
时,该数据会镜像到本地路径~/minio/data
, 使其能够在容器重新启动时保持持久化。 您可以设置任何具有读取、写入和删除权限的文件路径来使用。-e
分别设置环境变量(用户名和密码)。quay.io/minio/minio
是一个 Docker 镜像的名称,表示从 Quay.io 镜像仓库中拉取的 MinIO 镜像。server /data
是运行在容器内部的 MinIO 命令,它告诉 MinIO 服务器在容器启动时将/data
目录作为数据存储目录,并且开始以服务器模式运行
查看已安装的镜像:docker images
删除镜像:docker rmi minio/minio
(默认会有个别名,rm
等价于 rmi
)
# Windows 下启动 MinIo
- 下载 windows 版的 MinIO:https://dl.min.io/server/minio/release/windows-amd64/minio.exe (opens new window)
- 进入到 minio.exe 所在的目录:执行
minio.exe server D:\dev\MinIO\data
启动 minio 服务,其中D:\software\MinIO\data
是 MinIO 存储数据的目录路径 - 在浏览器输入:http://localhost:9000/ (opens new window),登录 MinIO 服务器 web 管理后台
- 默认用户名密码都是 minioadmin
# Spring Boot 集成 MinIO 开发
官方文档:
- https://min.io/docs/minio/linux/developers/minio-drivers.html (opens new window)
- 软件开发工具包(SDK) — MinIO中文文档 | MinIO Linux中文文档 (opens new window)
- Java快速指南 — MinIO中文文档 | MinIO Linux中文文档 (opens new window)
- Java Client API Reference — MinIO Object Storage for Linux (opens new window)
# 操作步骤
1、建项目;
2、加依赖;(目前没有 **-minio-starter
的依赖)
3、配文件;
4、写代码;
5、去运行;
# MinIO 中的 Bucket、Object
- Bucket 是存储 Object 的逻辑空间,每个 Bucket 之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
- Object 是存储到 MinIO 的基本对象,对用户而言,相当于文件;
# MinioClient 的常用 API
# 操作桶
bucketExists()
:用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;makeBucket()
:用于创建一个新的存储桶(bucket),需要指定存储桶的名称,无返回值,创建失败会抛出异常;listBuckets()
:用于列出用户有权访问的所有存储桶,返回存储桶的列表;removeBucket()
:用于删除一个已存在的存储桶(bucket),无返回值,删除失败会抛出异常;
报错: The difference between the request time and the server's time is too large.
请求时间与服务器时间之间的差异太大。
解决(同步一下 Linux 时间): 1、yum install ntpdate -y(这里的"-y"是指yum)
2、ntpdate pool.ntp.org
# 操作对象
putObject()
:用于上传文件到指定的存储桶;statObject()
:用于检查指定的对象(文件)的状态;getPresignedObjectUrl()
:用于生成一个对象(文件)的签名 URL,以便可以通过 HTTP 访问;getObject()
:用于从指定的存储桶中下载文件;listObjects()
:用于列出指定存储桶中的所有对象(文件);removeObject()
:用于删除指定存储桶中的对象,需要指定【存储桶名称】和【对象键】;
上传到 MinIO 服务器上的文件是否可以通过 http://ip:9000/存储桶/文件名 (opens new window) 直接访问?
默认情况下是不能直接访问的;
http://192.168.11.128:9000/myfile/test.jpg (opens new window)
方式一:
- 在 web 管理后台修改;(访问策略修改为 public)
方式二:
- 通过客户端 API 修改;
// 访问策略配置 json 串,版本号需根据官方的来(web 管理后台有)
String policyJsonString = "{\"Version\" : \"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicRead\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
2
3
# Vue3 + SpringBoot3 + Minio 实践
# Vue
Vue 是一款 Web 前端 JavaScript 框架;
官网:https://vuejs.org/ (opens new window)
# 前端运行环境和工具
1、node.js 是一个开源跨平台的 JavaScript 运行时环境,可以理解成 java 中的 jdk
;
官网:https://nodejs.org/ (opens new window)
2、npm 是 JavaScript 依赖包管理工具,可以进行前端项目的打包、依赖下载等,可以理解成 java 中的 maven
;
官网:https://www.npmjs.com/ (opens new window)
3、Vite 是快速构建前端 Vue 项目的脚手架,可以理解为开发 Spring Boot 的 Spring Initializr 快速构建工具
;
官网:https://cn.vitejs.dev/ (opens new window)
如表格所示:
前端 Vue | 后端 Java |
---|---|
node.js | jdk |
npm | maven |
vite | Spring Initializr |
# 安装 Node.js
下载:https://nodejs.org (opens new window)
安装:解压即完成安装;(使用的是 zip 压缩包)
Nodejs环境变量配置
1、在 D:\software\node-v20.12.0-win-x64
下创建 2 个文件夹:
node_global (依赖库)
node_cache (缓存)
2、在 D:\software\node-v20.12.0-win-x64
目录下 cmd
进入命令行窗口,执行:
npm config set prefix "D:\software\node-v20.12.0-win-x64\node_global"
npm config set cache "D:\software\node-v20.12.0-win-x64\node_cache"
2
3
3、查看有没有设置成功:
npm config get prefix
npm config get cache
2
3
4、配置环境变量 Path,在 Path 变量中添加如下路径:
D:\software\node-v20.12.0-win-x64
D:\software\node-v20.12.0-win-x64\node_global
2
3
在任意目录打开 windows 窗口查看是否配置成功:
node -v
npm -v
2
3
注:Node.js 已经自带 npm,安装 Node.js 时即已安装了 npm,故不需要再安装 npm;
# Vue 工程运行流程分析
// 运行的入口
main.js
从vue框架导入createApp函数功能;
import { createApp } from 'vue'
// 从一个单文件组件中导入根组件;
import App from './App.vue';
// 创建一个vue对象;
const app = createApp(App);
// 挂载到项目首页的 <div id="app"></div> 这个 id 下;
app.mount('#app')
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 element-plus
安装依赖
npm install element-plus --save
- 其中
--save
表示将安装包信息写入package.json
的dependencies
中; - 在
dependencies
中,那么项目打包就会依赖到该模块; - 如果项目打包时不需要依赖该模块,则使用
--save-dev
,它会将安装包信息写入devDependencies
下,表示项目开发时需要依赖该模块,项目打包发布则不需要依赖该模块;
在 main.js 中导入
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)
跨域处理
源头:http://localhost:5173 目的地:http://localhost:8080/api/users
- 协议不同
- 域名不同
- 端口不同
三个里面只要有任何一个不同就是跨域;
解决方法
- 在每个 Controller 上加入 @CrossOrigin 注解解决跨域;
- 编写配置文件统一处理;
- 网关处统一处理。
# MinIO 集群部署
# 纠删码模式部署
- 纠删码(Erasure Code)简称 EC,是一种数据保护方法,也是一种算法;
- MinIO 对纠删码模式的算法进行了实现,采用 Reed-Solomon code(简称RScode)纠错码将对象拆分成 N/2 数据和 N/2 奇偶校验块,Reed Solomon 利用范德蒙矩阵(Vandermonde matrix)、柯西矩阵(Cauchy matrix)的特性来实现;
- 即将数据拆分为多个数据块和多个校验块,分散存储在不同的磁盘上,即使在部分磁盘损坏或丢失的情况下,也可以通过剩余的数据块和校验块恢复出原始数据;
- 举个例子,现在有 12 块磁盘,一个对象数据会被分成 6 个数据块、6 个奇偶校验块,你可以损坏或丢失任意 6 块磁盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的磁盘中恢复数据,牛不牛?