MinIO分布式文件存储

一、分布式文件系统

问题引出

  • 对于一个网站系统,若为降低成本投入,将文件存储服务和网站系统部署在同一台服务器中,访问量不大,基本不会有问题,但访问量逐渐升高,网站文件资源读取逐渐频繁,单机服务器可能难以承载较大的请求量,可能会出现网站打不开,甚至系统异常等问题。
  • 解决方案:采用云存储服务,将访问很频繁的文件资源服务,由本地改成云厂商提供的文件存储服务,比如阿里云 OSS、腾讯云、等等,迁移之后,网站的访问压力会得到极大的释放,服务也会变得更加稳定。
  • 采用免费开源的 fastDFS 工具来作为文件存储服务器,虽然性能不错,但软件安装环境非常复杂,且没有完整的技术文档,大部分都是公司或者网友自己总结的文档,维护起来非常困难。
  • 问题:云存储服务大部分都是收费的,日积月累也是一笔巨款。

分布式文件系统

定义:分布式文件系统(Distributed File System,DFS)是一种允许文件通过网络在多台主机上共享的文件系统,它通过计算机网络将若干计算机组织起来共同存储海量文件,并接收海量用户的请求‌。‌

优点:‌

  • 高性能‌:文件的数据分片允许系统并行读写数据,提高数据访问性能。多个节点同时处理不同的数据块,加快数据的传输和处理速度。
  • 可扩展性‌:分布式存储在多个节点上分布存储文件块,当需要增加存储容量时,可以简单地添加更多的节点,实现系统的无缝扩展。
  • 容错性‌:数据的冗余备份保证了系统的容错性。即使某个节点发生故障,文件的数据仍然可以从其他节点中恢复,确保数据的可用性和完整性。

二、MinIO简介

1、官方定义

MinIO 是一种高性能、S3 (Simple Storage Service)(亚马逊,类似与国内的oss)兼容的对象存储。它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。MinIO拥有开源 GNU AGPL v3 (开源许可证)和商业企业许可证的双重许可。

2、MinIO特点

  1. 简单
    简单性是百万兆次级数据基础设施的基础 - 无论是在技术上还是在操作上。MinIO使用和部署非常简单,没有其他对象存储可以让您在最快的时间内实现下载到生产环境的部署。
  2. 高性能
    MinIO 是世界上最快的对象存储,没有之一。在 32 个 NVMe 驱动器节点和 100Gbe 网络上发布的 GET/PUT 结果超过 325 GiB/秒和 165 GiB/秒。
  3. Kubernetes云原生
    通过原生 Kubernetes 运营商集成,MinIO 支持公共云、私有云和边缘云上所有主要的 Kubernetes 发行版。

三、SpringBoot集成MinIO

1、Linux环境部署MinIO

  1. 下载可执行文件:wget https://dl.minio.io/server/minio/release/linux-amd64/minio
    wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
  2. 赋予可执行权限:chmod +x minio
  3. 启动MinIO服务:

启动方式1:
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"

MINIO_ROOT_USER 指定minio用户名
MINIO_ROOT_PASSWORD 指定minio密码
/mnt/data 数据上传的数据目录
–console-address “:9001” minio控制台监听的地址和端口,ip可以省略

启动方式2:
./minio server /mnt/data --console-address “:9001”

默认的密码是:minioadmin、minioadmin

启动方式3:(后台启动)
./minio server /mnt/data --console-address “:9001” &

可能出现的问题

问题①WARN: Detected Linux kernel version older than 4.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x linux kernel version for best performance
警告:检测到的Linux内核版本早于4.0版本,此内核版本存在一些已知的潜在性能问题。MinIO建议至少使用4.x linux内核版本以获得最佳性能。
问题②打不开minio管理页面的原因:未对端口开放防火墙
解决办法:关闭防火墙或者开放端口
放行端口:firewall-cmd --zone=public --add-port=9001/tcp --permanent
查看端口开放情况:firewall-cmd --list-ports
重新加载防火墙:firewall-cmd --reload(放行后要重新加载防火墙)

关闭NinIO服务

  1. 前台启动:ctrl+c关闭
  2. 后台启动:查看正在运行的minio进程信息:ps -ef | grep minio
    kill 进程

2、docker环境部署MinIO

  1. 拉取Minio镜像:docker pull minio/minio
  2. 启动minio服务:
    docker run -p 9000:9000 --name minio \ -p 9001:9001 \ -e "MINIO_ACCESS_KEY=minio" \ -e "MINIO_SECRET_KEY=minio123" \ -v /opt/minio/data:/data \ -v /opt/minio/config:/root/.minio \ minio/minio server /data \ --console-address ":9001"

3、SpringBoot集成MinIO

1. 导入minio依赖:

    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.5.14</version>
    </dependency>

maven仓库地址:https://mvnrepository.com/
2. 配置Minio客户端信息
MinioConfig类

@Configuration
public class MinioConfig {
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint("http://ip:9000")
                .credentials("minio", "minio123")
                .build();
    }
}

3. 对bucket(文件夹)的操作

1、判断一个bucket是不是存在,返回true或false
minioClient.bucketExists(BucketExistsArgs.builder().bucket("bucket发的名字").build());
2、创建一个bucket,创建失败会抛出异常
minioClient.makeBucket(MakeBucketArgs.builder().bucket("文件夹的名称").build());
3、查看所有的bucket
List<Bucket> buckets = minioClient.listBuckets(); buckets.forEach(bucket -> { System.out.println(bucket.name() + "-----" + bucket.creationDate()); });
4、删除bucket,删除失败会抛异常
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("bucket名字").build());

注意事项:

minIO时间与主机时间不一致导致bug :
The difference between the request time and the current time is too large
date 查看当前的时间
客户端和服务端时间同步:
安装 utpdate yum install ntpdate -y
通过命令进行同步 nptdate pool.ntp.org
或通过修改时区让时间同步
执行两条命令:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock

  1. 对object(文件)常见的操作
1、上传一个文件
minioClient.putObject(PutObjectArgs.builder().
        bucket("bucket的名字").
        object(filename).         //这里的file为MultipartFile类型的文件
        //文件流,文件的大小,缓冲区填-1
        stream(file.getInputStream(), file.getSize(), -1).
        build();//上传文件           
//第二种方法上传文件              
minioClient.uploadObject(UploadObjectArgs.builder().                             bucket("bucket桶的名称").object("文件名称").filename("文件url").build())
2、检查文件的状态,判断文件是不是存在指定的bucket中,不存在就报错
minioClient.statObject(StatObjectArgs.builder()
                .bucket("test")
                .object("testFile2.jpg")
                .build());
3、生成可以访问的路径,带后缀的签名串
如果bucket是私有的,要是想访问就要加上后缀签名,不然不能访问
String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
   .bucket("")
   .object("")
   .expiry(10, TimeUnit.SECONDS)//设置10秒内有效
  //.method必须带上,不然报错                                         
   .method(Method.GET)
   .build());
4、下载指定bucket中的文件,GetObjectResponse 就是一个输入流
GetObjectResponse object = minioClient.getObject(GetObjectArgs.builder()
                .bucket("test")
                .object("testFile2.jpg")
                .build());
5、删除指定bucket中的文件
minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket("test")
                .object("testFile2.jpg")
                .build());//删除指定bucket中的object

四、MinIO集群部署

Minio集群搭建步骤:

1、准备4台机器(至少4台机器,根据minio的架构设计,只要有N/2个节点在正常,可以读数据,(N/2)+1个节点正常可以写数据。这里用4台虚拟机。使用xshell连上4台虚拟机。

在这里插入图片描述
在这里插入图片描述

2、每台机器添加一块磁盘(minio不能使用linux的root磁盘)

在这里插入图片描述

3、将添加的磁盘进行格式化为xfs格式:mkfs.xfs /dev/sdb
使用lsblk命令查看磁盘情况,可以看到4台机器都有/dev/sdb磁盘,执行格式化命令mkfs.xfs /dev/sdb

在这里插入图片描述

4、挂载磁盘(mount将sdb磁盘挂载到minio的存储目录)
mkdir -p /opt/minio/data 创建文件夹
mount /dev/sdb /opt/minio/data 挂载磁盘
lsblk 查看是不是成功

在这里插入图片描述
如果不挂载后面会报错:
Error: Drive http://192.168.80.145:9000/opt/minio/data/data2 returned an unexpected error: major: 8: minor: 3: drive is part of root drive, will not be used, please investigate - drive will be offline (*fmt.wrapError)

5、每台机器安装好minio(安装在/usr/local/minio目录下)

参考上面linux的安装命令

6、编写shell脚本(确保/opt/minio/data/data1和data2存在)

在这里插入图片描述

#!/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.80.145/opt/minio/data/data1 \
http://192.168.80.145/opt/minio/data/data2 \
http://192.168.80.132/opt/minio/data/data1 \
http://192.168.80.132/opt/minio/data/data2 \
http://192.168.80.134/opt/minio/data/data1 \
http://192.168.80.134/opt/minio/data/data2 \
http://192.168.80.147/opt/minio/data/data1 \
http://192.168.80.147/opt/minio/data/data2

脚本内容复制到start.sh中,并赋予start.sh可执行权限,chmod +x start.sh

在这里插入图片描述

注意事项:

1、防火墙要开放9001端口(或者关闭防火墙)
systemctl status firewalld 查看防火墙的状态
systemctl stop firewalld 关闭防火墙
start.sh文件脚本的内容不能出现错误

7、运行脚本
在/opt/minio目录下执行 ./start.sh命令启动脚本


启动成功,可以访问这四个控制台。
在这里插入图片描述
整体的架构就是这样的:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server:只有MDF文件,如何附加数据库

第一步&#xff1a;先新建一个同名数据库&#xff0c;然后停止sql服务&#xff0c;删除新建数据库.ldf文件。 第二步&#xff1a;将要附加的数据库的.mdf文件覆盖刚新建的.mdf文件&#xff0c;并重启sql服务。 第三步&#xff1a;这时数据库DATA目录下只有一个.mdf文件&#xf…

《HTML 的变革之路:从过去到未来》

一、HTML 的发展历程 图片: HTML 从诞生至今&#xff0c;经历了多个版本的迭代。 &#xff08;一&#xff09;早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准&#xff0c;提供了表格、文字绕排和复杂数学元素显示等新特性&#xff0c;但因实现复杂且缺乏浏览器…

机器视觉与OpenCV--01篇

计算机眼中的图像 像素 像素是图像的基本单位&#xff0c;每个像素存储着图像的颜色、亮度或者其他特征&#xff0c;一张图片就是由若干个像素组成的。 RGB 在计算机中&#xff0c;RGB三种颜色被称为RGB三通道&#xff0c;且每个通道的取值都是0到255之间。 计算机中图像的…

网络安全创新实验

一、网络拓扑设计 二、网络主机概况 本实验一共包含4台虚拟机&#xff0c;分别为攻击机attacker&#xff0c;网关gateway&#xff0c;内网普通用户主机pc&#xff0c;内网服务器server&#xff0c;四台主机的详细信息如下表所示&#xff1a; 名称操作系统IP地址网络模式作用攻…

y3编辑器教学5:触发器2 案例演示

文章目录 一、探索1.1 ECA1.1.1 ECA的定义1.1.2 使用触发器实现瞬间移动效果 1.2 变量1.2.1 什么是变量1.2.2 使用变量存储碎片收集数量并展现 1.3 if语句&#xff08;魔法效果挂接&#xff09;1.3.1 地形设置1.3.2 编写能量灌注逻辑1.3.3 编写能量灌注后&#xff0c;实现传送逻…

016 在路由器上配置 DHCP

配置路由器端口IP地址 将路由器的端口地址配置好&#xff0c; 左边的网络地址是 192.168.1.0 右边的网络地址是 192.168.2.0 配置路由器的DHCP服务 打开命令窗口&#xff0c;进入特权模式 进入全局配置 conf t创建一个DHCP地址池&#xff1b; po1 是地址池的名称&#xf…

恋爱脑学Rust之并行之旅:Rayon介绍和使用

文章目录 一、开启爱情的依赖之旅&#xff08;安装 Rayon&#xff09;二、甜蜜瞬间的并行享受&#xff08;基本数据并行操作&#xff09;&#xff08;一&#xff09;共享美好时光&#xff08;par_iter 方法&#xff09;&#xff08;二&#xff09;分块珍藏回忆&#xff08;par_…

【数据库系列】PostgreSQL 数据库连接

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

吸烟抽烟行为识别数据集-超高识别率,支持YOLO,COCO,VOC格式的标注,10162张各种姿势场景下的吸烟图片

吸烟抽烟行为识别数据集-超高识别率&#xff0c;支持YOLO&#xff0c;COCO,VOC格式的标注&#xff0c;10162张各种姿势场景下的吸烟图片 数据集分割 训练组91&#xff05; 9279图片 有效集5&#xff05; 507图片 测试集4% 376图片 预处理 自动定…

【开源】基于SpringBoot框架的房屋租赁系统 (计算机毕业设计)+万字毕业论文 T020

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

C++20 标准概念

1. 所有标准概念的概述 “类型和对象基本概念”表列出了类型和对象的基本概念。 “范围、迭代器和算法概念”表列出了范围、视图、迭代器和算法的概念。 “辅助概念”表列出的概念主要用作其他概念的构建块&#xff0c;通常不会让应用程序开发者直接使用。 头文件和命名空间 …

git的卸载与安装

目录 一、Git的卸载 二、Git的安装 2.1.1 官网下载 2.1.2 镜像下载 ​编辑 2.2 安装 2.3 检验否安装成功 三、Git使用配置 一、Git的卸载 1.找到程序&#xff0c;卸载程序 2.找到Git&#xff0c;右键卸载 卸载完成&#xff01; 二、Git的安装 2.1.1 官网下载 网址&…

科技赋能电影,互动电影开启电影新格局

近年来&#xff0c;科技赋能电影&#xff0c;让电影越来越精彩&#xff0c;也越来越多元。层出不穷的新技术新类型&#xff0c;不断丰富着电影视听语言的表现形式&#xff0c;也为观众带来更多具有交互性和个性化的观影体验。进昂互动科技在推出全球首部院线互动电影《夜班》之…

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

操作系统:虚拟存储系统

目录 1、外存资源管理 外存空间划分 进程与外存对应关系 2、虚拟页式存储系统 3、 淘汰算法&#xff08;重点&#xff09;P217 最佳淘汰算法&#xff08;OPT&#xff09; 先进先出(FIFO) 最近最少使用算法&#xff08;LRU&#xff09; 最近不用的先淘汰(LNU) 最不经常…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

手机实时提取SIM卡打电话的信令声音--社会价值(一、方案解决了什么问题)

手机实时提取SIM卡打电话的信令声音 --社会价值(一、方案解决了什么问题) 一、前言 这段时间&#xff0c;我们在技术范围之外陷入了一个自证或者说下定义的怪圈&#xff0c;即要怎么样去介绍或者描述&#xff1a;我们是一个什么样的产品。它在当前这个世界上&#xff0c;处于…

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…