1.分布式文件系统应用场景

互联网海量非结构化数据的存储需求

  • 电商网站:海量商品图片
  • 视频网站:海量视频文件
  • 网盘 : 海量文件
  • 社交网站:海量图片

1.1 Minio介绍

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非 常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而 一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

官网:https://min.io/  http://www.minio.org.cn/

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服 务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成 本。

对于中小型企业,如果不选择存储上云,那么 Minio 是个不错的选择,麻雀虽小,五脏俱全。当然 Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、 MicroSoft Azure。

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产 品。

Minio优点

  • 部署简单: 一个single二进制文件即是一切,还可支持各种平台。
  • minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;
  • 兼容Amazon S3接口,充分考虑开发人员的需求和体验;
  • 低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用 磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。
  • 读写性能优异

1.2 MinIO的基础概念

Object:存储到 Minio 的基本对象,如文件、字节流,Anything...

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.3 纠删码EC(Erasure Code)

MinIO 使用纠删码机制来保证高可靠性,使用 highwayhash 来处理数据损坏( Bit Rot Protection )。 关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m 份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失 效,仍然能通过剩下的数据还原出来。

1.4 存储形式

文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目 录,文件名下是 part.1 和 xl.meta(老版本,最新版本如下图),前者是编码数据块及检验块,后者是元数 据文件

1.5 存储方案

2. Minio环境搭建

官方文档:https://docs.min.io/docs/

中文文档:http://docs.minio.org.cn/docs/ (没有及时更新,容易被坑)

minio支持多种server启动模式

2.1 单机部署

minio server的standalone模式,即要管理的磁盘都在host本地。该启动模式一般仅用于实验环境、测 试环境的验证和学习使用。在standalone模式下,还可以分为non-erasure code modeerasure code mode

non-erasure code mode

在此启动模式下,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会 启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏 就表示数据丢失。

erasure code mode

此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server会自动 启用erasure code mode。erasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失 败。 erasure code启用后,要求传给minio server的endpoint(standalone模式下,即本地磁盘上的目 录)至少为4个。

基于centos7

wget -q http://dl.minio.org.cn/server/minio/release/linux-amd64/minio

chmod +x minio

#启动minio server服务,指定数据存储目录/mnt/data

./minio server /mnt/data

默认用户名密码minioadmin:minioadmin,修改默认用户名密码可以使用:

export MINIO_ROOT_USER=admin

export MINIO_ROOT_PASSWORD=12345678

默认的配置目录是${HOME}/.minio,可以通过--config-dir命令自定义配置目录:

./minio server --config-dir /mnt/config /mnt/data

控制台监听端口是动态生成的,可以通过--console-address ":port"指定静态端口

./minio server --console-address ":50000" /mnt/data

访问minio控制台: http://192.168.3.14:50000/dashboard

基于docker

对外暴露minio控制台的端口,通过--console-address ":50000"指定控制台端口为静态端口,MinIO自定义用户名密码

docker run -d -p 9000:9000 -p 50000:50000 --name minio -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=12345678"  -v /home/data/minio:/data  -v /home/data/minio/config:/root/.minio minio/minio server --console-address ":50000" /data

访问minio控制台: http://192.168.3.14:50000/dashboard

minio纠删码模式

Minio使用纠删码 erasure code 和校验和 checksum 来保护数据免受硬件故障和无声数据损坏。 即便 您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。

纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2 数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验 块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的 数据进行恢复。

使用Minio Docker镜像,在8块盘中启动Minio服务:

docker run -d -p 9000:9000 -p 50000:50000 -e "MINIO_ROOT_USER=admin"  -e "MINIO_ROOT_PASSWORD=12345678"  --name minio -v /mnt/config:/root/.minio    -v /home/data1:/data1 -v /home/data2:/data2  -v /home/data3:/data3  -v /home/data4:/data4  -v /home/data5:/data5  -v /home/data6:/data6  -v /home/data7:/data7  -v /home/data8:/data8  minio/minio server  --console-address ":50000"  /data{1...8}

2.2 分布式集群部署

分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不 同的节点上,分布式Minio避免了单点故障。

分布式存储可靠性常用方法

分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现 的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性 的方法主要有两类,一类是冗余法,一类是校验法。

冗余

冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢 复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可 靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是 采用此种方式实现,如 Hadoop 的文件系统(3个副本),Redis 的集群,MySQL 的主备模式等。

校验

校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个 作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或 更改,在数据传输和保存时经常用到,如 TCP 协议;二是恢复还原,通过对数据结合校验码,通过数学 计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID 技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。

分布式Minio优势

数据保护

分布式Minio采用 纠删码来防范多个节点宕机和位衰减 bit rot 。

分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

高可用

单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的 数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。

例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不 过你需要9台服務器才能写数据。

一致性

Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

运行分布式Minio

启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在 所有其它节点运行同样的命令。

  • 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。 为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境 变量。新版本使用MINIO_ROOT_USER&MINIO_ROOT_PASSWORD。
  • 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
  • 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
  • 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
  • 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。

略...(未实战,待补充)

2.3 Minio客户端使用

MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系 统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。

ls         列出文件和文件夹。
mb         创建一个存储桶或一个文件夹。
cat         显示文件和对象内容。
pipe         将一个STDIN重定向到一个对象或者文件或者STDOUT。
share         生成用于共享的URL。
cp         拷贝文件和对象。
mirror         给存储桶和文件夹做镜像。
find         基于参数查找文件。
diff         对两个文件夹或者存储桶比较差异。
rm         删除文件和对象。
events         管理对象通知。
watch         监视文件和对象的事件。
policy         管理访问策略。
config         管理mc配置文件。
update         检查软件更新。
version         输出版本信息。

部署客户端mc

 wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc

chmod +x mc

./mc --help

mv mc /usr/local/sbin/

配置mc

mc 将所有的配置信息都存储在 ~/.mc/config.json 文件中

# 查询mc host配置

mc config host ls

# 添加minio服务

mc config host add minio-server http://192.168.3.14:9000 admin 12345678

# 删除host

mc config host remove minio-server

mc命令使用

上传下载

# 查询minio服务上的所有buckets(文件和文件夹)
mc ls minio-server

# 下载文件
mc cp minio-server/tulingmall/fox/fox.jpg /tmp/

#删除文件
mc rm minio-server/tulingmall/fox/fox.jpg

#上传文件
mc cp zookeeper.out minio-server/tulingmall/

Bucket管理

# 创建bucket
mc mb minio-server/bucket01
# 删除bucket
mc rb minio-server/bucket02
# bucket不为空,可以强制删除 慎用
mc rb --force minio-server/bucket01
#查询bucket03磁盘使用情况

mc du minio-server/bucket03

mc admin使用

MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。

用户管理

mc admin user --help
#新建用户
mc admin user add minio-server fox
mc admin user add minio-server fox02 12345678
#查看用户
mc admin user list minio-server
#禁用用户
mc admin user disable minio-server fox02
#启用用户
mc admin user disable minio-server fox02
#查看用户信息
mc admin user info minio-server fox
#删除用户
mc admin user remove minio-server fox02

策略管理

policy命令,用于添加,删除,列出策略,获取有关策略的信息并为MinIO服务器上的用户设置策略。

mc admin policy --help
#列出MinIO上的所有固定策略
mc admin policy list minio-server
# 查看plicy信息
mc admin policy info minio-server readwrite

 添加新的策略

编写策略文件:/root/tulingmall.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::tulingmall"
]
},{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::tulingmall/*"
]
}
]
}

"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
]

 将tulingmall.json添加到策略数据库

# 添加新的策略
mc admin policy add minio-server tulingmall-admin /root/tulingmall.json
mc admin policy list minio-server

mc admin user add minio-server fox03 12345678
# 设置用户的访问策略
mc admin policy set minio-server tulingmall-admin user=fox03

测试:fox03/12345678 登录minio控制台http://192.168.3.14:50000/,只能操作tulingmall的bucket

3. Minio Java Client使用

package com.panghl;import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;import java.io.InputStream;
import java.io.OutputStream;/*** minio操作文件工具类*/
@Slf4j
public class MinioFileUtil {private static String endpoint = "http://10.147.17.170:9000";private static String accessKey = "admin";private static String secretKey = "12345678";private static String bucketName = "test";public MinioClient gainMinioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}/*** 删除指定的文件** @param filePath 要被删除的文件路径,不能为空(eg: 201403/1910585304069fdj.png)* @throws Exception*/public void deleteFile(String filePath) throws Exception {if (StringUtils.isBlank(filePath)) {log.error("要被删除的文件路径不能为空");return;}// 获取连接MinioClient minioClient = gainMinioClient();if (minioClient == null) {log.error("获取minio连接失败");return;}minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(filePath).build());}/*** 上传文件** @param filePath 要被上传文件的路径,不能为空(eg: 201403/1910585304069fdj.png)* @param ins      要被上传文件的输入流,不能为空*/public void uploadFile(String filePath, InputStream ins) throws Exception {if (StringUtils.isBlank(filePath)) {log.error("要被上传的文件路径不能为空");return;}if (ins == null) {log.error("要被上传的文件流不能为空");return;}// 获取连接MinioClient minioClient = gainMinioClient();if (minioClient == null) {log.error("获取minio连接失败");return;}minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filePath).stream(ins, ins.available(), -1).build());// 上传文件至指定的目录,Minio 7.0.2报错
//        minioClient.putObject(properties.getBucketName(), filePath, ins, new PutObjectOptions(ins.available(), -1L));//使用Minio6.0.11版本可以
//        minioClient.putObject(bucketName, objectNamePrefix + "/" + filePath,ins,Long.valueOf(ins.available()),"application/octet-stream");}/*** 获取指定文件的输入流 (PS:使用完毕之后记得关闭该输入流)** @param filePath 文件路径,不能为 (空eg: 201403/1910585304069fdj.png)* @return InputStream 文件流* @throws Exception*/public InputStream gainInputStream(String filePath) throws Exception {if (StringUtils.isBlank(filePath)) {log.error("文件下载路径不能为空");return null;}// 获取连接MinioClient minioClient = gainMinioClient();if (minioClient == null) {log.error("获取minio连接失败");return null;}return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filePath).build());}/*** 写出文件到指定的输出流** @param filePath     文件路径,不能为空 (eg: 201403/1910585304069fdj.png)* @param outputStream 要被写出的输出流* @throws Exception*/public void write2OutputStream(String filePath, OutputStream outputStream) throws Exception {InputStream ins = null;try {if (StringUtils.isBlank(filePath)) {log.error("文件下载路径不能为空");return;}if (outputStream == null) {log.error("输出流不能为空");return;}// 获取连接MinioClient minioClient = gainMinioClient();if (minioClient == null) {log.error("获取minio连接失败");return;}// 获取文件输入流//注意:filePath是:202049/bgmgdnhdm3eoujbt.txtins = gainInputStream(filePath);// input -> outputIOUtils.copy(ins, outputStream);} catch (Exception e) {throw e;} finally {if (ins != null) {ins.close();}}}}
package com.panghl;import io.minio.MinioClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.*;
import java.time.LocalDateTime;@SpringBootTest
class MinioApplicationTests {private MinioFileUtil minioFileUtil = new MinioFileUtil();//上传@Testvoid upload() throws Exception {String filePath = "C:\\Users\\phl04\\Desktop\\图片资源\\tx.jpg";InputStream ins = new FileInputStream(new File(filePath));minioFileUtil.uploadFile(filePath, ins);}//下载@Testvoid write2OutputStream() throws Exception {String filePath = "C:\\Users\\phl04\\Desktop\\图片资源\\tx.jpg";OutputStream ops = new FileOutputStream(new File("D:\\test.jpg"));minioFileUtil.write2OutputStream(filePath, ops);}//删除@Testvoid deleteFile() throws Exception {String filePath = "mybatis3.4.6中文开发手册.pdf";minioFileUtil.deleteFile(filePath);}}

4. 搭建项目中附件管理功能(实战)

整个项目已经推到gitee上,有需要的同学 可以拉下来看下,cv直接在项目中即可使用。(别忘了点star哦)

附件管理: 此项目可用于日常项目中文件上传下载预览等功能需求。

gitee代码地址:   https://gitee.com/pffett/attachment-management.git

分布式文件存储MinIO实战相关推荐

  1. K8S部署分布式文件存储minio两种部署方式

    一. 分布式文件存储系统有很多,比如hadoop的HDFS和FastDFS.今天部署minio文件系统. 二. 分布式文件存储minio GitHub官网和minio官网都有详细的文档 MinIO下载 ...

  2. 分布式文件存储MinIO、安装和使用

    1.MinIO简介 MinIO是高性能的对象存储,单个对象最大可达5TB.适合存储图片.视频.文档.备份数据.安装包等一系列文件.是一款主要采用Golang语言实现发开的高性能.分布式的对象存储系统. ...

  3. 开源分布式文件存储 Minio

    SpringBoot轻松整合Minio Spring Boot + minio 实现高性能存储服务

  4. 分布式文件存储MinIO试用对比总结

    介绍就不说了,官方有中文文档: https://docs.min.io/cn 说点个人感受. 首先,MinIO是兼容Amazon S3的,换句话说,MinIO可以伪装成Amazon S3,你可以用Am ...

  5. 分布式文件存储系统MinIO笔记

    文章目录 一.MinIO介绍 1.文件系统应用场景 2.MinIO介绍 3.MinIO优点 4.MinIO的基础概念 5.纠删码EC(Erasure Code) 6.存储形式 7.存储方案 二.Min ...

  6. 微服务系列:分布式文件存储之 MinIO 入门指南

    经过前面多篇文章我们学习了服务网关.服务调用.服务注册.服务监控等微服务系列的的相关知识,今天开始我们来学习一下分布式文件的相关知识. 首先我们从学习 MinIO 对象存储服务开始,后面还会学习下其他 ...

  7. 全栈开发之MinIO分布式文件存储集群

    背景 你们项目中关于上传的文件是存储在什么地方的? 我们的项目关于文件存储经过了这么一个演进过程: 静态资源目录:当时前后端不分离,直接在项目的静态资源目录,每次部署前,先备份资源目录,否则就会丢失掉 ...

  8. 分布式文件存储系统Minio使用总结

    分布式文件存储系统Minio使用总结 1.分布式文件系统应用: 1.1.Minlo 介绍: Minlo 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服 ...

  9. 大数据产品开发流程规范_大数据技术思想入门(三):分布式文件存储的流程

    如果你不喜欢阅读文字的话,可以选择滑到最后看 视频讲解 哟~~~ 进程和 RPC 在上一篇文章中,我们讲解了要解决好大数据集的存储问题,需要引入一个主从结构的集群,其中,主服务器用于存储元数据,从服务 ...

最新文章

  1. HDU 4540 威威猫系列故事――打地鼠(DP)
  2. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB
  3. (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例...
  4. 开发环境运行正常,发布服务器后提示HTTP 错误 403.14 - Forbidden
  5. [EntLib]UAB(Updater Application Block)下载
  6. 不要安排看代码的工作
  7. Atiitt 兼容性提升的艺术 attilax总结 目录 1. 兼容性产生的原因 2 1.1. Api变化 2 1.2. 需求的资源不满足 2 2. 兼容性的分类 2 2.1. Web方面的兼容性
  8. 使用Github上传本地项目代码
  9. 一次 TLS SNI 问题
  10. 6-1 另类循环队列 (30 分) 如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
  11. flowable工作流架构介绍及集成实现
  12. ceph mds启动流程
  13. 角色攻击、角色特殊动作
  14. IOS锁屏状态播放音乐时显示专辑信息和图片
  15. 小程序sketch_第2部分sketch3d设计应用程序
  16. 新手自媒体推广引流,你能运营好吗?
  17. 全球气象数据下载总结-CRU数据,ERA数据NCEP-2数据
  18. 2017年【计算机视觉机器学习人工智能】领域重要会议 汇总
  19. 字符串循环左移 详解
  20. 红旗桌面版本最新行使流动和结果解答100例-6

热门文章

  1. c++中set的介绍及用法
  2. 算法高级(5)-分布式系统选举算法及脑裂
  3. log4net AssemblyInfo.cs
  4. 中国移动研究院冯俊兰:基于移动通信网络运维中的多指标时空序列预测
  5. 简单实现二维码生成器
  6. Python黑客技术,攻击自动化
  7. 3款好用的多媒体播放器
  8. Notepad++整合C/C++编译器
  9. 【直通华为HCNA/HCNP系列R篇-10】OSPF路由配置与管理-王达-专题视频课程
  10. 周以真教授认为计算思维是运用计算机科学,计算思维与项目教学法