MinIO实战

news2024/12/24 3:57:24

1.简介

MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。

2.部署

2.1单机器单节点(docker)

官网教程:https://min.io/docs/minio/container/index.html

mkdir -p ~/minio/data
docker run \
   -p 9000:9000 \
   -p 9090:9090 \
   --name minio \
   -v ~/minio/data:/data \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   quay.io/minio/minio server /data --console-address ":9090"

2.2单机器多节点(docker-compose)

参考:https://blog.csdn.net/ac1992122633/article/details/124135515

docker-compose.yaml

version: '3.7'

# 所有容器通用的设置和配置
x-minio-common: &minio-common
  image: minio/minio
  command: server --console-address ":9001" http://minio{1...4}/data
  expose:
    - "9000"
  # environment:
    # MINIO_ROOT_USER: minioadmin
    # MINIO_ROOT_PASSWORD: minioadmin
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

# 启动4个docker容器运行minio服务器实例
# 使用nginx反向代理9000端口,负载均衡, 你可以通过9001、9002、9003、9004端口访问它们的web console
services:
  minio1:
    <<: *minio-common
    hostname: minio1
    ports:
      - "9001:9001"
    volumes:
      - ./data/data1:/data

  minio2:
    <<: *minio-common
    hostname: minio2
    ports:
      - "9002:9001"
    volumes:
      - ./data/data2:/data

  minio3:
    <<: *minio-common
    hostname: minio3
    ports:
      - "9003:9001"
    volumes:
      - ./data/data3:/data

  minio4:
    <<: *minio-common
    hostname: minio4
    ports:
      - "9004:9001"
    volumes:
      - ./data/data4:/data

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

2.3多机器多节点(docker)

https://www.jianshu.com/p/62be21930f97
https://www.jianshu.com/p/f1f56fe9f479

docker run -d --name minio \
-p 9000:9000  \
-p 9001:9001  \
--restart=always  --net=host \
-e MINIO_ACCESS_KEY=minio \
-e MINIO_SECRET_KEY=123456 \
-v /home/minio/config:/root/.minio \
-v /home/minio/data1:/data1 \
-v /home/minio/data2:/data2 \
-v /home/minio/data3:/data3 \
-v /home/minio/data4:/data4 \
minio/minio server http://minio{1...2}/data{1...4} \
--console-address ":9001"

3.java

https://min.io/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>MinIO</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MinIO</name>
    <description>MinIO</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.10.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib -->
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>1.3.70</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

FileUploader

package com.example.minio;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class FileUploader {
    public static void main(String[] args)
            throws IOException, NoSuchAlgorithmException, InvalidKeyException {
        try {
            // Create a minioClient with the MinIO server playground, its access key and secret key.
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint("http://10.86.97.145:9000")
                            .credentials("ROOTNAME", "CHANGEME123")
                            .build();

            // Make 'asiatrip' bucket if not exist.
            boolean found =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket("asiatrip").build());
            if (!found) {
                // Make a new bucket called 'asiatrip'.
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("asiatrip").build());
            } else {
                System.out.println("Bucket 'asiatrip' already exists.");
            }

            // Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
            // 'asiatrip'.
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("asiatrip")
                            .object("asiaphotos-2015.zip")
                            .filename("D:/Desktop/minIO-test.zip")
                            .build());
            System.out.println(
                    "'D:/Desktop/minIO-test.zip' is successfully uploaded as "
                            + "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }
    }
}

4.使用

https://www.cnblogs.com/lwqstyle/p/16587503.html

5.资源访问

https://www.shuzhiduo.com/A/Ae5RNEk35Q/

chmod +x mc
./mc config host add minio http://minio1:9000 minio(MINIO_ROOT_USER) 123456(MINIO_ROOT_PASSWORD) --api S3v4
./mc anonymous set public minio/ebrms(mc policy set public minio连接名称/桶名)

6.适用场景

Minio对象存储系统适用于大文件场景,海量小文件的场景下并不适合。

  • Minio的类似于glusterfs是一个无中心元数据服务器的设计。其index还是依赖底层本地文件系统,导致当bucket 保存大量对象时, bucket list操作很慢。
  • Minio目前只支持EC的模式。
    ①针对大文件的场景比较合适,由于设计简单,能发挥出磁盘等硬件的性能。目前看到的minio的应用场景也主要是替代HDFS的大数据的场景。
    ②EC默认推荐的配置是EC(M+N),其中M=N的模式,也就是数据盘和冗余盘相等的模式。例如 EC(4+4),EC(8+8)等模式,这种配置磁盘空间的利用率只有50%左右。对于大文件,大容量的情况,似乎空间浪费还是比较严重。社区后续也支持自己设置EC的模式,考虑到可靠性,目前官方不推荐使用。
    ③针对海量小文件场景,EC显然不合适,无论是元数据还是数据存储模式都不合适,性能比较差,空间利用率比较差。
  • Minio的扩容也只支持集群扩容。并且新的集群只能存储新创建的bucket的数据。这对应用来说很不友好。
  • 故障恢复:在单个集群里,节点或者磁盘都是固定的,不能动态的增加。所以磁盘或者节点失效后需要管理员人工介入,及时更换新的磁盘或者修改未能成功启动的磁盘,然后管理员通过命令才能在后台恢复数据。
  • 其它对象存储的功能支持的比较全: 存储分级,生命周期,WORM,压缩加密,多版本,桶策略,桶复制等功能。

7.性能测试

7.1 minIO

https://max.book118.com/html/2022/0412/6121130212004133.shtm
请添加图片描述

7.2 fastDFS

https://www.jianshu.com/p/c084ed1057c9
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js编程

Node.js编程 一、实验目的与要求 实验任务 用户信息增删改查 掌握数据库软件的安装了解集合、文档的概念掌握使用mongoose创建集合的方法创建集合掌握对数据库中的数据进行增删改查操作 二、实验任务和步骤 实验1. 用户信息增删改查 需求说明 (1)搭建网站服务器&#xf…

第十章 降维与度量学习

10.1 k近邻学习 k近邻学习&#xff08;kNN&#xff09;是一种常用的监督学习方法&#xff0c;其工作机制非常简单&#xff1a;给定测试样本&#xff0c;基于某种距离度量找出训练集中与其最靠近的k个训练样本&#xff0c;然后基于这k个邻居的信息来进行预测。 k近邻学习似乎与…

2022 计网复习计算题【太原理工大学】

期末复习汇总&#xff0c;点这里&#xff01;https://blog.csdn.net/m0_52861684/category_12095266.html?spm1001.2014.3001.5482 三、计算题 1. 假定 1km 长的 CSMA/CD 网络的数据率为 1Gb/s&#xff0c;设信号在网络上的传播速率为 200000km/s。求能够使用此协议的最短帧长…

java swing(GUI) MySQL实现的学生选课成绩管理系统源码+运行教程

今天给大家演示一下由Java swing mysql实现的一款学生选课成绩信息管理系统&#xff0c;主要实现的功能有&#xff1a;学生教师信息管理、年级班级信息管理、课程信息管理、选课、成绩录入功能、成绩统计功能&#xff0c;实现学生、教师、管理员三个角色的登录&#xff0c;三个…

【计算机图形学入门】笔记1:图形学概述

前言&#xff1a;今天开始开启一个新篇章的学习&#xff0c;那就是games101闫令琪老师讲的《现代计算机图形学入门》课程&#xff0c;我会根据闫老师每节课讲的内容记录重点笔记&#xff0c;每节课都会整理一篇发布出来&#xff0c;希望自己可以坚持下去&#xff0c;从图形学小…

可视化音视频分析工具:好用工具大集锦,快转发给你兄弟看看丨音视频工具

&#xff08;本文基本逻辑&#xff1a;音画原始数据分析工具介绍 → 编码数据分析工具介绍 → 封装格式分析工具介绍&#xff09; 工欲善其事&#xff0c;必先利其器。在音视频开发中&#xff0c;为了方便、快捷、直观的分析音视频数据&#xff0c;最好能有一些可视化的分析工…

《爱在 ZStack Cube 超融合》三部曲

一、始于初识&#xff1a;很高兴见到你 这一天东川路最靓的仔打开了 ZStack Cube 宝盒 &#xff0c;这可能是我们的第一次相遇&#xff0c;我们相谈甚欢&#xff0c;相遇恨晚。 我的名字是 ZStack Cube&#xff0c;一个基于超融合架构的云平台。我拥有3300、5300、7300、7300…

Acwing_98

题目链接 考察知识点&#xff1a; 坐标变换、递归、分治。 核心问题&#xff1a;计算出点的坐标。 策略是递归算出子图形中的坐标&#xff0c;再进行平移得到当前图形中的坐标。 采用下图方式建立坐标系&#xff1a;原点在中心。 前置知识&#xff1a; (x,y)(x,y)(x,y) 逆时…

ResNet18实现——MNIST手写数字识别(突破0.995)

1.简单CNN改进 简单的CNN实现——MNIST手写数字识别 该部分首先对我前面的工作进行了改进&#xff0c;然后以此为基础构建ResNet18去实现MNIST手写数字识别。 1.改进要点&#xff1a; 1.利用nn.Sequential&#xff08;&#xff09;自定义块结构&#xff0c;增加可读性和方便…

Spring - 什么是spring?

好久没更新博客了&#xff0c;今天小更一波。 学习java已经有一段时间了&#xff0c;今天将接触Spring框架技术。 什么是Spring? spring 中文意思就是 春天&#xff0c;实际上spring 是真的给软件行业带来了春天。 使用spring的好处&#xff1f; spring可以解决企业级开发…

眼内衍射透镜的设计与分析

1. 摘要 如今&#xff0c;多焦点眼内透镜移植已广泛用于白内障的治疗。作为其优势特点之一&#xff0c;衍射眼内透镜为病患提供了很好的远近景性能。这种透镜经常在Zemax OpticStudio 中采用binary2面型进行设计。在本示例中&#xff0c;我们阐述了如何将初始设计导入VirtualLa…

嵌入式开发--RS-485通讯的问题

嵌入式开发 RS-485通讯的问题RS-485说明接口芯片硬件连接CubeMX设置代码编写引脚定义使能串口中断函数发送数据接收数据有一个问题&#xff0c;多收了一个数数据线上的波形问题分析问题解决RS-485说明 RS-485一般简称485总线&#xff0c;是最常用的工业总线之一&#xff0c;一…

LeetCode简单题之回环句

题目 句子 是由单个空格分隔的一组单词&#xff0c;且不含前导或尾随空格。 例如&#xff0c;“Hello World”、“HELLO”、“hello world hello world” 都是符合要求的句子。 单词 仅 由大写和小写英文字母组成。且大写和小写字母会视作不同字符。 如果句子满足下述全部条…

从 0 开始学习 Git + GitHub

文章目录一、GitHub创建仓库二、安装Git客户端1、安装2、配置身份三、为Github账户设置SSH key1、生成ssh key2、GitHub 新建SSh key3、测试连接是否成功四、上传本地项目到Github方法一&#xff1a;方法二&#xff1a;master分支到main分支迁移五、Git常用命令git initgit sta…

共享主机安全吗(以及如何保护它)?

共享主机是在一台服务器上存储多个网站的主机。通常&#xff0c;您的资源(例如 CPU、内存、数据库和带宽)会在用户之间溢出。由于它非常适合流量低的网站&#xff0c;且因具成本效益&#xff0c;共享主机相当普遍。如果您是博主和小型企业&#xff0c;则很有可能会选择共享主机…

聊聊我常用的5款动态数据可视化工具

视频当道的时代&#xff0c;数据可视化自然也要动起来。 我常用的动态可视化工具主要有Tableau、Echarts、Flourish、Python这几个&#xff0c;另外一个地图可视化神器kepler.gl&#xff0c;是技术群小伙伴的分享。 这五款可视化工具差异很大&#xff0c;在各自领域都是学霸级…

Grafana 快速配置可视化面板

一、如何快速搭建部署Grafana CSDNhttps://mp.csdn.net/mp_blog/creation/editor/128199952 二、快速配置可视化面板 1.新建数据源 首次新建数据源、首次新建看板 2.选择数据源类型 3.配置数据库 地址、账号、密码 备注&#xff1a;新建的数据源都可以在添加看板作为选项进…

Odoo丨如何在明细行中添加复选框?

最近&#xff0c;在项目实际业务中遇到需要对明细订单添加复选框和按钮进行操作的需求。 起初在拿到需求时&#xff0c;我联想到Odoo默认tree视图是有复选框和操作按钮的功能&#xff0c;于是查看了源码&#xff0c;确认了这个想法。 因为这个是属于字段中one2many 关系属性来…

【DPDK】dpdk样例源码解析之五:dpdk-rss

本篇文章介绍DPDK-RSS相关的功能&#xff0c;RSS是网卡提供的分流机制&#xff0c;简单讲就是一个HASH值&#xff0c;如果使用DPDK收包&#xff0c;开启RSS后&#xff0c;会根据配置项将数据包分流到不同的收包队列&#xff0c;用来是实现负载均衡。 通过DPDK-L3FWD样例&#…

关于Pytorch下载并进行部署

目录 1.关于Pytorch 2.Pytorch环境部署前提条件 3.部署方法 4.测试 1.关于Pytorch PyTorch是一个开源的Python机器学习库&#xff0c;基于Torch&#xff0c;用于计算机视觉、自然语言处理等应用程序。 2017年1月&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&…