> 文章列表 > 【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

文章目录

  • MinIO
  • 对象存储的概念
    • 计算机数据存储系统-架构模式
    • 对象存储的优势
    • 常见的对象存储系统/服务(Object Storage Service,OSS)
  • MinIO
    • 简介
    • 特点
    • 高级特性
    • 小结
  • MinIO部署
    • 基于 linux Binary 部署 MinIO Server
    • MinIO数据组织结构
    • MinIO Client
    • **基于 Docker 部署 MinIO Server**
    • 基于 Kubernetes 部署 MinIO Server
  • MinIO JAVA客户端使用
    • 业务系统中文件上传的基本流程
    • MinIO JAVA客户端使用要点
  • Minio的高级概念
    • 高级概念
    • 纠删码(erasure code /EC):纠删码是一种用以恢复 丢失和损坏数据的数学算法,也是一种编码技术
      • **基于单节点纠删码模式部署**
    • 位衰减
    • 高可用

MinIO

对象存储的概念

计算机数据存储系统-架构模式

  1. 文件存储:文件存储将数据存储和整理到文件夹中,类似于保存在办公室纸质文件系统中的物理文件,如果需要某个文件中的信息,则需要知道哪个房间、文件柜、抽屉、文件夹和文件名称。文件存储使用这种分层目录结构将数据及元数据以文件的形式进行存储。
  2. 块存储:块存储在文件存储的基础上提升了性能,它将文件拆分为多个单独的块并单独存储。块存储系统会为每个原始数据块分配一个唯一标识符,当您需要访问完整的文件时,系统将使用唯一标识符将数据块重组为完整的文件。块存储不需要单一的数据路径,因此您可以将其存储在最方便的位置,并且在需要时仍然能够快速检索。
  3. 对象存储:它将数据划分为对象并存储在结构扁平的数据环境中【存储池】,对象包含全部数据、唯一标识符和详细元数据,对象存储最适合非结构化数据的静态存储【一次写入多次读取】;对象存储不需要目录、文件夹和其他复杂的分层结构,但却不适合用来存储不断变化的动态数据,因为修改动作需要重写整个对象。

对象存储的优势

  1. 可伸缩性强:可以轻松横向扩容对象存储的容量【只需添加存储设备即可】
  2. 复杂性低:对象存储没有文件夹或目录,也就不具有层次结构系统的大多数复杂性
  3. 易于搜索:元数据是对象的一部分,使您无需借助单独的应用即可轻松搜索和导航
  4. 具有弹性:对象存储可以自动复制数据并存储在多个设备和多个地理位置。这有助于防范服务中断和数据丢失,并可为灾难恢复策略提供支持
  5. 成本效益高:对象存储在设计时考虑了成本因素,与基于文件和块的系统相比,能够以更低的价格存储大量数据

常见的对象存储系统/服务(Object Storage Service,OSS)

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

MinIO

简介

  1. Minio是一个轻量级的、开源的、高性能的对象存储服务,非常适合存储大容量非结构化的数据,比如:图片,视频,日志文件,备份数据,容器/虚拟机镜像等,单个对象大小支持从几KB到5T不等。
  2. 兼容亚马逊 S3 API【全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准】
  3. 基于Golang语言开发,主要作者Anand Babu Periasamy是GlusterFS 的初始开发者,minio在设计上汲取了GlusterFS 的相关经验与教训,系统复杂度上作了大量简化,足够轻量。

github项目

官方站点

中文站点

特点

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

高级特性

  1. 远程备份/灾难恢复:提供了主动/被动跨区域的数据复制,可用于灾难恢复
  2. 加密:MinIO 对存储在磁盘上和通过网络传输的数据进行加密。 加密方案支持现代行业标准加密算法(例如AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC),加密粒度为对象级加密,并兼容S3 加密语义
  3. 自动化数据管理接口:提供了命令行界面(CLI)和应用程序编程界面(API),以及直观的控制台图形用户界面(GUI)
  4. 对象不变:MinIO能保护数据不被删除(意外或故意),MinIO 支持对对象锁定、保留、治理和合规性, 对象锁定可以与 MinIO 版本控制结合使用,以确保数据不变性并消除数据篡改或破坏的风险
  5. 完善的身份和访问机制:有完善的对象存储身份管理和外部身份控制,以及对象存储访问管理机制
  6. 可扩展性:具备可伸缩性,支持横向扩展

小结

  1. 开源、轻量、高性能的对象存储服务,适合存储大量的非结构化数据
  2. 兼容S3 API,原生支持Kubernetes,
  3. 提供了灾备、数据加密、数据备份、安全控制、数据管理等特性
  4. 扩展性强,易于使用

MinIO部署

基于 linux Binary 部署 MinIO Server

参考文档:
https://github.com/minio/minio#gnulinux
http://www.minio.org.cn/docs/minio/linux/index.html
http://www.minio.org.cn/docs/minio/linux/reference/minio-server/minio-server.html

MinIO数据组织结构

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

租户:用以隔离存储资源【一个minio实例代表了一个租户】
Bucket (桶):若干个对象的逻辑抽象,是盛装对象的容器
用户:在租户下面创建的用于访问不同桶的账号

MinIO Client

mc:minio 命令行工具,提供了UNIX命令(如ls、cat、cp、mv和diff)的现代替代方案,同时支持本地MinIO服务和Amazon s3兼容的云存储服务

参考:http://www.minio.org.cn/docs/minio/linux/reference/minio-mc.html#command-quick-reference

mc部署参考文档:http://www.minio.org.cn/docs/minio/linux/reference/minio-mc.html#quickstart

基于 Docker 部署 MinIO Server

参考文档:
http://www.minio.org.cn/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html

基于 Kubernetes 部署 MinIO Server

参考文档:
http://www.minio.org.cn/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html

MinIO JAVA客户端使用

一般:可以以 “应用” 来划分 桶 (主用户、订单)
在每个应用下,可以进行folder的划分(比如:图片、CSS、JS)

1.参考官方站点(中文翻译站点同步有延迟):https://min.io/docs/minio/linux/developers/minio-drivers.html
2.使用如下maven坐标导入

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

3.基于官方Quickstart Guide:https://min.io/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart
4.Java Client API Reference:https://min.io/docs/minio/linux/developers/java/API.html

业务系统中文件上传的基本流程

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

MinIO JAVA客户端使用要点

1.业务系统中是前端先跟本地系统对接,由后端服务对接MinIO
2.对应API的使用参考官方站点:

JAVA API官方文档

Minio的高级概念

高级概念

Drive

可理解为minio的数据存储磁盘,minio server /disk1/data /disk2/data

Set

一组Drive的集合,有如下特点:

​ 一个集群划分为一个或多个Set

​ 一个 SET 中的 Drive 尽可能分布在不同的节点上

​ 一个 Set 包含的 Drive 数量是固定的,默认由系统根据集群规模自动计算得出

​ 一个对象存储在一个Set上

纠删码(erasure code /EC):纠删码是一种用以恢复 丢失和损坏数据的数学算法,也是一种编码技术

  1. 简单来说就是:纠删码可通过将 n 份原始数据,增加 m 份校验数据,并能通过 n+m 份中的任意 n 份数据,还原为原始数据。即如果有任意小于等于 m 份的数据失效,仍然能通过剩下的数据还原出来
  2. Minio 采用 Reed-Solomon code(里德-所罗门类纠删码) 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复

Erasure Sets:一组Drive,MinIO 将纠删码对象写入其中。MinIO 在erasure set 上随机且均匀地分布给定对象的数据和奇偶校验块
1.MinIO 根据Server Pool中节点和驱动器的总数自动计算Erasure Sets的数量和大小,minio支持最小为2,最大为16,一经确定无法修改

基于单节点纠删码模式部署

参考文档:
https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-multi-drive.html

位衰减

​ 位衰减(bit rot):又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了HighwayHash 基于哈希的校验和来防范位衰减

高可用

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