MinIO学习笔记

MinIO学习笔记

  • MinIO简介
  • Springboot整合Minio
  • MinIO中的Bucket、Object
    • MinioClient的常用API:操作bucket
    • MinioClient的常用API:操作对象
  • MinIO集群部署
    • 纠删码模式部署
    • 单机多磁盘的纠删码模式部署
    • 分布式集群部署
  • Nginx

视频学习地址

MinIO简介

MINIO干什么用的: AI数据基础设施的对象存储

在这里插入图片描述

  • 为人工智能系统提供数据支持,数据存储
  • 对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据
  • MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
  • 对象存储系统通常通过基于HTTP或HTTPS协议的API(应用程序编程接口)进行数据读写;

MINIO是使用go语言进行开发的。

MinIO具有双重许可:

  • 开源GNU AGPL v3;(完全免费)
  • 商业企业许可证;(收费)

在下载的时候就可以选择免费的AGPL许可。

在这里插入图片描述

MINIO的下载(LINUX版本):

wget https://dl.min.io/server/minio/release/linux-amd64/minio #下载
chmod +x minio #赋予可执行权限
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"  #MINIO服务启动
  • MINIO_ROOT_USER:指定MinIO的用户名;
  • MINIO_ROOT_PASSWORD:指定MinIO的密码;
  • /mnt/data:指定MinIO服务器用于存储数据的目录;
  • console-address ":9001" :指定MinIO控制台的监听地址和端口

使用Docker启动运行MinIO

  • 拉取镜像
docker pull minio/minio
  • 启动MinIO容器:
docker run -p 9000:9000 -p 9001:9001 minio/minio server /mnt/docker/data --console-address :9001

Springboot整合Minio

  1. 导入依赖
        <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency>
  1. 编写config配置类
package com.example.springboot_demo.config;import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinIOConfig {@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint("http://192.168.114.128:9000").credentials("minioadmin","minioadmin").build();}
}
  1. 编写service
package com.example.springboot_demo.service;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;@Service
public class MinIOService {@Autowiredprivate MinioClient minioClient;public void testMinioClient(){System.out.println(minioClient);}
}
  1. 写测试代码
package com.example.springboot_demo;import com.example.springboot_demo.service.MinIOService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class SpringbootDemoApplicationTests {@AutowiredMinIOService minIOService;@Testvoid contextLoads() {minIOService.testMinioClient();}}
  1. 控制台输出
    在这里插入图片描述

过程中可能碰到的问题看这


MinIO中的Bucket、Object

  • Bucket是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
  • Object是存储到MinIO的基本对象,对用户而言,相当于文件;

MinIO是线程安全的

MinioClient的常用API:操作bucket

  • bucketExists()
    用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;
    @Autowiredprivate MinioClient minioClient;@Testvoid test01() throws Exception {boolean isBuketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myfile").build());//判断myfile bucket是否存在System.out.println(isBuketExists);}
  • makeBucket()
    用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test02() throws Exception{//创建一个myfile的bucketminioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());}

登录http://ip地址:9001可以看到新添加的myfile
在这里插入图片描述

  • listBuckets()
    用于列出用户有权访问的所有存储桶,返回存储桶的列表;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test03() throws Exception{List<Bucket> bucketList = minioClient.listBuckets();bucketList.forEach(bucket -> {System.out.println(bucket.name()+"--"+bucket.creationDate());});}
  • removeBucket()
    用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test04() throws Exception{minioClient.removeBucket(RemoveBucketArgs.builder().bucket("myfile").build());}

MinioClient的常用API:操作对象

  • putObject()
    用于上传文件到指定的存储桶;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test06() throws Exception{File file = new File("F:\\pic.jpg");minioClient.putObject(PutObjectArgs.builder().bucket("myfile").object("test.jpg").stream(new FileInputStream(file),file.length(),-1).build());//bucket("myfile"):存到哪个bucket//object("test.jpg):存储的名字//stream(new FileInputStream(file),file.length(),-1)//Few FileInputStream(file):输入流//file.length():输入流的长度//-1:开启缓冲区的大小,-1表示系统自己设定缓冲区大小}
  • statObject()
    用于检查指定的对象(文件)的状态;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test07() throws Exception{StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket("myfile").object("test.jpg").build());System.out.println(statObjectResponse);}
  • getPresignedObjectUrl()
    用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
    @Testvoid  test08() throws Exception{String objectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket("myfile").object("test.jpg").method(Method.GET).build());System.out.println(objectUrl);}

输出:
192.168.114.129:9000/myfile/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-A……
若想通过192.168.114.129:9000/myfile/test.jpg访问文件,需要修改权限
.
方式一:在web管理后台修改;(访问策略修改为 public)
bucket->myfile->Summary->Access Policy->public
在这里插入图片描述
方式二:通过客户端API修改;

   @Testvoid  test02() throws Exception{minioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());String policyJsonString = " \"{\"Version\":\"2012-10-17\",\"Statement\\\":[{\\\"Sid\\\":\\\"PublicRead\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"*\\\"},\\\"Action\\\":[\\\"s3:GetObject\\\"],\\\"Resource\\\":[\\\"arn:aws:s3:::\" + bucketName + \"/*\\\"]}]}\";";minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket("myfile").config(policyJsonString).build());}
  • getObject()
    用于从指定的存储桶中下载文件;
    @Testvoid  test09() throws Exception{GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket("myfile").object("test.jpg").build());}
  • listObjects()
    用于列出指定存储桶中的所有对象(文件);
    @Testvoid  test010() throws Exception{Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket("myfile").build());listObjects.forEach(itemResult->{try {Item item = itemResult.get();System.out.println(item.objectName());} catch (Exception e) {e.printStackTrace();}});}
  • removeObject()
    用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;
    @Testvoid  test011() throws Exception{minioClient.removeObject(RemoveObjectArgs.builder().bucket("myfile").object("test.jpg").build());}

MinIO集群部署

纠删码模式部署

  • 纠删码(Erasure Code)简称EC,是一种数据保护方法,也是一种算法;
  • MinIO对纠删码模式的算法进行了实现,采用Reed-Solomon code(简称RScode)纠错码将对象拆分成N/2数据和N/2奇偶校验块,Reed Solomon利用范德蒙矩阵(Vandermonde matrix)、柯西矩阵(Cauchy matrix)的特性来实现;
  • 将数据拆分为多个数据块和多个校验块,分散存储在不同的磁盘上,即使在部分磁盘损坏或丢失的情况下,也可以通过剩余的数据块和校验块恢复出原始数据
    • 举个例子,现在有12块磁盘,一个对象数据会被分成6个数据块、6个奇偶校验块,你可以损坏或丢失任意6块磁盘(不管其是存放的数据块还是奇偶校验块),仍可以从剩下的磁盘中恢复数据。

单机多磁盘的纠删码模式部署

  • 执行命令:lsblk
    lsblk是Linux中的一个命令,用于列出所有可用的块设备(数据存储设备,如硬盘、闪存驱动器)的信息,如设备名称、大小、挂载点等;
  • 添加一块磁盘(通过虚拟机VM进行添加);
  • 输入命令,将添加的磁盘格式化为xfs格式:mkfs.xfs /dev/sdb
  • 输入命令,将磁盘挂载到minio的存储目录:mount /dev/sdb /opt/minio/data
  • 再查看一下:lsblk
  • 启动纠删码模式:/usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12}

后台启动纠删码模式命令:
nohup /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12} > /opt/minio/data/minio.log 2>&1 &

  • nohup:
    这是一个Unix命令,用于运行另一个命令在后台,并且忽略挂起(HUP)信号,也就是即使你退出了终端或关闭了会话,该命令也会继续运行;
  • > /opt/minio/data/minio.log:
    这部分是将标准输出(stdout)重定向到 /opt/minio/data/minio.log 文件,这意味着 MinIO 服务器的所有正常输出(如启动信息、状态更新等)都会被写入到这个日志文件中;
  • 2>&1: 这部分是将标准错误输出(stderr)重定向到标准输出(stdout),即输出到 /opt/minio/data/minio.log 文件,这样,无论是标准输出还是错误输出,都会被写入到同一个日志文件中;
  • &: 这个符号是在命令的末尾,用于将命令放到后台执行,也就是即使你启动了 MinIO 服务器,你的终端或 shell 会话也不会被阻塞,你可以继续执行其他命令;

分布式集群部署

单机多磁盘的纠删码模式问题:
如果这台机器宕机了,那么minio就不能对外提供服务了;

MinIO集群搭建步骤:(多节点多磁盘)

  • 准备4台机器;(根据MinIO的架构设计,至少需要4个节点来构建集群,这是因为在一个N节点的分布式MinIO集群中,只要有N/2节点在线,数据就是安全的,同时,为了确保能够创建新的对象,需要至少有N/2+1个节点,因此,对于一个4节点的集群,即使有两个节点宕机,集群仍然是可读的,但需要有3个节点才能写数据;)
  • 每台机器添加一块磁盘;(minio集群需要独占磁盘块,不能使用Linux的root磁盘块)
  • 将添加的磁盘格式化为xfs格式:mkfs.xfs /dev/sdb
  • 将磁盘挂载到minio的存储目录:mount /dev/sdb /opt/minio/data
  • 每台机器上安装好minio;(我们这里是安装在 /usr/local/minio 目录下,版本统一)
  • 关闭防火墙systemctl stop firewalld
  • 进入到cd /opt/minio/文件夹下,创建磁盘文件mkdir data1 data2 data3 data4
  • 创建执行脚本vim start.sh,输入:
#!/bin/bash
export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=minioadmin
/usr/local/minio/minio server --config-dir /etc/minio --address :9000 --console-address :9001 \
http://192.168.11.128/opt/minio/data/data1 http://192.168.11.128/opt/minio/data/data2 \
http://192.168.11.128/opt/minio/data/data3 http://192.168.11.128/opt/minio/data/data4 \
http://192.168.11.129/opt/minio/data/data1 http://192.168.11.129/opt/minio/data/data2 \
http://192.168.11.129/opt/minio/data/data3 http://192.168.11.129/opt/minio/data/data4 \
http://192.168.11.130/opt/minio/data/data1 http://192.168.11.130/opt/minio/data/data2 \
http://192.168.11.130/opt/minio/data/data3 http://192.168.11.130/opt/minio/data/data4 \
http://192.168.11.131/opt/minio/data/data1 http://192.168.11.131/opt/minio/data/data2 \
http://192.168.11.131/opt/minio/data/data3 http://192.168.11.131/opt/minio/data/data4 &

上面脚本,创建了4个节点,每个节点有4个磁盘块

  • 给脚本赋权限:chmod 744 start.sh
  • 执行脚本:./start.sh

执行好上诉步骤,我们搭建了包含4个节点16个磁盘的分布式集群。接下来,需要搭建一个Nginx服务器,用于负载均衡。外界通过访问Nginx服务器来获取对象。
在这里插入图片描述


Nginx

Nginx服务器

  • Nginx 是一个高性能的web服务器;(服务器)
  • Nginx 是俄罗斯人Igor Sysoev用C语言开发的,第一个版本0.1.0发布于2004年10月4日;
    • 商业版本:http://www.nginx.com
    • 开源版:http://nginx.org
    • 下载:wget http://nginx.org/download/nginx-1.24.0.tar.gz

安装步骤:(在某一个节点上进行即可,假设在ip地址为X.X.X.X的主机上进行配置)

  • Nginx的安装需要Linux安装相关的几个库,否则配置和编译会出现错误;
    yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

  • Nginx服务器正式安装:

    • 解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.24.0.tar.gz
    • 切换至解压后的nginx主目录,执行命令:cd nginx-1.24.0
    • 在nginx主目录nginx-1.24.0下执行命令:./configure --prefix=/usr/local/nginx
      (其中–prefix是指定nginx安装路径)
    • 执行命令进行编译:make
    • 执行命令进行安装:make install
  • Nginx启动

    • 启动nginx执行命令:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
      (其中-c是指定配置文件)
    • 检查Nginx是否启动:通过查看进程:ps -ef | grep nginx
    • Nginx重启
      /usr/local/nginx/sbin/nginx -s reload
  • Nginx关闭

    • 优雅关闭Nginx:
      找出nginx的进程号:ps -ef | grep nginx
      执行命令:kill -QUIT 主pid
      其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
      优雅关闭会将已经进来的请求处理完后再关闭;
    • 快速关闭Nginx:
      找出nginx的进程号:ps -ef | grep nginx
      执行命令:kill -TERM 主pid
      快速关闭会直接关闭,已经进来的请求也不会处理;(暴力方式)
  • Nginx配置检查
    当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx的配置文件conf/nginx.conf是否正确:
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

  • Nginx负载均衡

    • vim nginx.conf
    • 在http模块配置upstream:
upstream api { server  192.168.11.128:9000; server  192.168.11.129:9000;  server  192.168.11.130:9000;  server  192.168.11.131:9000;  
} 
upstream webui { server  192.168.11.128:9001; server  192.168.11.129:9001;  server  192.168.11.130:9001;  server  192.168.11.131:9001;  
} 
    • 在server模块里配置:
server{listen  80;server_name  localhost;
location /{#root html;#index index.html   index.html;proxy_set_header Host $http_host;proxy_set_header Server MinIO;proxy_set_header Accept-Ranges bytes;proxy_pass http://api;#这里的api对应upstream后面的名字
}
}
    • 另起server(即不在上面那个server里写了)
server{listen  5000;server_name  localhost;
location /{proxy_pass http://webui;#这里的webui对应upstream后面的名字
}
}

后面只需要访问http://X.X.X.X:80就可以访问minio的API了,可视化界面需要访问http://X.X.X.X:5000。默认情况下会采取轮询的方式来依次访问各个节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/705096.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人非线性系统反馈线性化与解耦

机器人非线性系统的反馈线性化和解耦是控制理论中的两个重要概念&#xff0c;它们分别用于简化系统分析和设计过程&#xff0c;提高控制系统的性能。 首先&#xff0c;反馈线性化是一种将非线性系统转化为线性系统的技术。在机器人控制中&#xff0c;由于机器人本身是一个强耦…

什么是最大路径?什么是极大路径?

最近学习中&#xff0c;在这两个概念上出现了混淆&#xff0c;导致了一些误解&#xff0c;在此厘清。 最大路径 在一个简单图G中&#xff0c;u、v之间的距离 d ( u , v ) min ⁡ { u 到 v 的最短路的长度 } d(u,v) \min \{ u到v的最短路的长度 \} d(u,v)min{u到v的最短路的…

20231911 2023-2024-2 《网络攻防实践》实践九报告

1.实践内容 1.1 缓冲区 缓冲区是内存空间的一部分&#xff0c;在内存中预留了一定的存储空间&#xff0c;用来暂时保存输入和输出等I/O操作的一些数据&#xff0c;这些预留的空间就叫做缓冲区。 1.2 shellcode shellcode是一段用于利用软件漏洞而执行的代码&#xff0c;也可以…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 数三角

//枚举顶点。 //不存在等边三角形 #include<bits/stdc.h> using namespace std; #define int long long const int n2e311; int a,b,c,l[n],r[n]; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a;for(int i1;i<a;i){cin>>…

【初阶数据结构】带头双向循环链表讲解

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录与初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

开源连锁收银系统哪个好

针对开源连锁收银系统的选择&#xff0c;商淘云是一个备受关注的候选。商淘云以其功能丰富、易于定制和稳定性等优势&#xff0c;吸引了众多企业和开发者的关注。下面将从四个方面探讨商淘云开源连锁收银系统的优势&#xff1a; 首先&#xff0c;商淘云提供了丰富的功能模块。作…

报错:(idea端口被占用)Web server failed to start. Port 9090 was already in use.

cmd里面输入&#xff1a; netstat -ano|findstr "9090" 可以看到pid是9644 然后再打开任务管理器

卷轴分红商城模式:适用于多种的商业营销模式

卷轴分红商城模式是一种基于区块链技术的去中心化积分商城系统&#xff0c;通过智能合约和数字资产分红实现积分流通和价值回馈&#xff0c;适用于多种场景。 什么是卷轴分红商城模式&#xff1a; 这是一个去中心化的积分商城系统&#xff0c;消费者在商城消费时&#xff0c;可…

GDPU 竞赛技能实践 天码行空 期末小测

1. 除法&#xff08;原题&#xff09; &#x1f468;‍&#x1f3eb; 实验二&#xff1a;1.简单枚举 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好为数字0&#xff5e;9的一个排列&#xff08;可以有前导0&a…

终于搞懂Linux 设备树中的#address-cells,#size-cells 和reg 属性

目录 一、前置知识 1. 处理器平台2. reg 属性的基本格式3. reg 属性的作用 reg 用法 二、#address-cells 和 #size-cells 属性 1. 示例1 2. 示例23. 示例3 一、前置知识 要理解#address-cells和#size-cell 这两个属性&#xff0c;就要先了解 reg属性。 1. 处理器平台 下…

上班族兼职新篇章:10大实战攻略,轻松年赚1-20万

对于众多上班族而言&#xff0c;如何在工作之余赚取额外收入&#xff0c;开启自己的第一份副业&#xff0c;已成为许多人心中的疑问。每个人的才能和兴趣点不尽相同&#xff0c;但都有机会找到适合自己的兼职方式。接下来&#xff0c;就让我们一起探索这10大实战攻略&#xff0…

Zynq UltraScale+ MPSoC 配置存储器器件

Zynq UltraScale MPSoC 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Zynq UltraScale MPSoC 器件执行擦除、空白检查、编程和验证等配置操 作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列…