官网地址
https://min.io/
官网文档
https://docs.min.io/docs/minio-quickstart-guide.html
下载地址
https://dl.min.io/
基础概念
Object:存储到Minio的基本对象,如文件、字节流 Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。 Drive:即存储数据的磁盘,在MinIO启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive里。 Set :即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同位置。一个对象存储在一个Set上。(For example: {1...64} is divided into 4 sets each of size 16.) ? ? 一个对象存储在一个Set上 ? ? 一个集群划分为多个Set ? ? 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出 ? ? 一个SET中的Drive尽可能分布在不同的节点上
部署篇
单机部署
1、下载完minio文件需要执行
chmod +x minio
2、编写启动脚本
touch miniostart
chmod +x miniostart
vi miniostart
3、脚本内容
###############1个节点1个盘,单机模式,磁盘坏了会丢失数据##############
#####minoi账号
export MINIO_ROOT_USER=admin
#####minio密码
export MINIO_ROOT_PASSWORD=12345678
#####后台启动,如果根目录下没有miniodata1这个文件夹,minio会自动创建该文件夹,启动之后miniodata1文件夹下会生成一个.minio.sys的隐藏文件夹,用于存储minio的相关配置信息
nohup /minio/minio server --address ":9000" --console-address ":50001" /miniodata1 > /minio/minio-9000.log 2>&1 &
4、保存退出执行脚本查看启动日志
./miniostart
tail -f minio-9000.log
正常没有报error就可以通过127.0.0.1要改成minio服务的ip http://127.0.0.1:9000 或者 http://127.0.0.1:50001 访问,这个9000和50001就是在脚本里指定的端口号,输入账号密码就可以进入管理主页了
进入之后可以创建一个Bucket,比如说我添加了一个hello的bucket 那这时候在miniodata1目录下会出现一个hello的文件夹 首页上点浏览按钮进入到hello中可以上传一个文件,比如上传了一个helloworld.txt 这时候在/miniodata1/hello下会出现一个helloworld.txt文件 说明单机单磁盘的部署上传的文件会以本身文件的方式存储
单机部署对机器性能、磁盘要求比较高,适合文件数量不大的场景, 建议再部署一台单机,形成主备,防止出现单点故障,主备可以使用minio的mc-mirror实现,也可以通过运维手段同步文件夹内容,看场景和对故障的容忍程度处理 参考文档 https://docs.min.io/minio/baremetal/reference/minio-mc/mc-mirror.html#command-mc-mirror
单机多磁盘部署
注意,如果之前是单机单磁盘,是无法直接升级成单机多磁盘的,minio最少有4块磁盘才会开启纠删码方式存储,纠删码模式可以在少于一半磁盘丢失的情况下恢复数据, 由于存储方式不同导致启动时无法从单磁盘直接升级成纠删码模式,所以建议直接按照纠删码模式部署, 再把之前的文件导入到新文件系统中,导入方式可以借助rclone工具、mc工具,或者其他手段,最终文件导入到新系统中即可。
脚本如下
###############1个节点4块盘,单机模式,4磁盘同时坏了2个以上磁盘会丢失数据,只坏2个磁盘minio可以自动恢复数据##############
#####minoi账号
export MINIO_ROOT_USER=admin
#####minio密码
export MINIO_ROOT_PASSWORD=12345678
#####后台启动,如果根目录下没有miniodata1、miniodata2、miniodata3、miniodata4这个4文件夹,minio会自动创建,本机IP是10.0.110.120时配置如下,注意120...120和1...4中间都是三个点
nohup /minio/minio server --address ":9000" --console-address ":50001" http://10.0.110.{120...120}:9000/miniodata{1...4} > /minio/minio-9000.log 2>&1 &
单机扩容方案
单机扩容就是多挂磁盘,minio会根据扩容脚本中指定的磁盘存储方案自动协调文件应该上传到那一组磁盘中,恢复也是按照这一组的策略恢复
脚本如下
###############1个节点4块盘,单机模式,4磁盘同时坏了2个以上磁盘会丢失数据,只坏2个磁盘minio可以自动恢复数据##############
#####minoi账号
export MINIO_ROOT_USER=admin
#####minio密码
export MINIO_ROOT_PASSWORD=12345678
#####后台启动,可以发现就是加一组 http://10.0.110.{120...120}:9000/miniodata{1...4}
nohup /minio/minio server --address ":9000" --console-address ":50001" http://10.0.110.{120...120}:9000/miniodata{1...4} http://10.0.110.{120...120}:9000/miniodata{5...8} http://10.0.110.{120...120}:9000/miniodata{9...12} > /minio/minio-9000.log 2>&1 &
集群方案,多节点
单机性能有限,minio通常部署多节点,脚本大致相同,只是需要把所有挂载的磁盘在启动时都指定一下【具体就是http://10.0.110.{120...123}:9000/miniodata{1...4}把IP修改一下】,minio会自动在集群中协调资源进行相应文件操作 注意,实际使用中发现任何一个节点挂掉都会导致服务不可用,所以建议给每个节点都做备份
Java操作minio实现上传下载
参考文档 https://docs.min.io/docs/java-client-quickstart-guide.html
maven pom文件中引入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.0</version>
</dependency>
上传下载代码
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import io.minio.BucketExistsArgs;
import io.minio.DownloadObjectArgs;
import io.minio.GetObjectArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.ObjectWriteResponse;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
public class MinioTest {
/** minio地址 */
private static final String MINIO_HOST = "http://10.0.110.120:9000";
/** minio账号 */
private static final String MINIO_ROOT_USER = "admin";
/** minio密码 */
private static final String MINIO_ROOT_PASSWORD = "12345678";
/** minio bucket名称 */
private static final String MINIO_BUCKET = "hello";
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, IllegalArgumentException, IOException {
try {
// 创建一个minio客户端
MinioClient minioClient = MinioClient.builder().endpoint(MINIO_HOST).credentials(MINIO_ROOT_USER, MINIO_ROOT_PASSWORD).build();
// 检查bucket是否存在
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(MINIO_BUCKET).build());
if (!found) {
// 创建一个bucket
minioClient.makeBucket(MakeBucketArgs.builder().bucket(MINIO_BUCKET).build());
} else {
System.out.println("bucket 已存在");
}
// 上传文件,最终文件存储在abc文件夹下helloworld.html中,abc文件夹没有的话会自动创建,文件夹可以设置多级比如abc/def/xyz
String fileName = "abc/helloworld.html";
// 上传文件,本地文件的路径
String filePath = "/home/helloworld.html";
ObjectWriteResponse uploadObject = minioClient.uploadObject(UploadObjectArgs.builder().bucket(MINIO_BUCKET).object(fileName).filename(filePath).build());
System.out.println("文件helloworld.html已经上传到hello这个bucket中" + String.format("【etag:%s,存储位置:%s】", uploadObject.etag(), uploadObject.object()));
// 假设minio中有文件abc/helloworld.html
// 下载到本地文件夹/home/download中,文件夹一定要存在才能保存成功
String localFilePath = "/home/download/helloworld.html";
// 该方法没有返回值,仅存储文件到本地
minioClient.downloadObject(DownloadObjectArgs.builder().bucket(MINIO_BUCKET).object(fileName).filename(localFilePath).build());
// 该方法返回一个输入流,需要自行保存到本地或者输出到浏览器
InputStream in = minioClient.getObject(GetObjectArgs.builder().bucket(MINIO_BUCKET).object(fileName).build());
System.out.println("下载成功!文件size:" + in.available());
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
}
}
}
|