首页 > 其他分享 >Minio基础

Minio基础

时间:2024-04-04 20:00:45浏览次数:34  
标签:存储 删码 Minio Object 基础 json 数据

MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用Golang编写,专为私有云、公有云和混合云环境设计。它是兼容Amazon S3 API的,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。

1.部署方式

Minio 提供了两种部署方式:单机部署和分布式,两种部署方式都非常简单,其中分布式部署还提供了纠删码功能来降低数据丢失的风险。
当然如果我们只有一台机器,但是想用纠删码的功能,也可以直接配置使用多个本地盘

minio server /data1 /data2 /data3 ... /data8

2.基础概念

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

Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。

Minio 的一些内部概念,以分布式部署为例:

Drive:部署 Minio 时设置的磁盘,Minio 中所有的对象数据都会存储在 Drive 里。

Set:一组 Drive 的集合,Minio 会自动根据 Drive 数量,将若干 Drive 划分为多个 Set(For example: {1...64} is divided into 4 sets each of size 16.)

3.上传对象

分布式模式下,上传文件的最终实现在 xlObjects.putObject() 中。xlObjects 就是前面提到的 Set,xlObjects.putObject()会将上传的文件存储到 Set 下的每个 Drive 中。下面我们就来分析下我们上传的文件,究竟是怎么上传到 Drive 下的。

2.1 划分 DataDrives & ParityDrives
文件上传的第一步,就是将 Set 下的所有 Drives 划分为 dataDrives 和 parityDrives。

DataDrives :纠删码中的数据盘,用来存储 Object 原始数据。

ParityDrives:纠删码中的冗余盘,用来存储 Object 计算出来的冗余数据。

Minio 纠删码的默认配置为 1 : 1,即数据盘和冗余盘个数相同,所以我们真正可用的存储空间,只有我们总空间的一半大小。

2.2 划分 Blocks
对于上传的 Object,Minio 会将其划分为多个 Block 来计算纠删码。

如果 Object Size > 10 MB,那么每个 block 的大小就是 10 MB。
如果 Object Size < 10 MB,如果也划分一个 10 MB 的 block 就太浪费空间了,所以分配一个大小刚好为 Object Size 的 block 就够了。
2.3 读取 Object 上传流
读取上传流逻辑在 Erasure.Encode()中Minio 会串行从上传流中读取数据,填到一个 Buffer 中,Buffer 的大小刚好为 2.2 确定的 Block 大小。

2.4 纠删码编码
每读取一块 Block,Minio 就会对其进行纠删码编码,生成 data shards 和 parity shards。 编码逻辑在Erasure.EncodeData()中。

因为一个 Set 中有多个 Drive(DataDrives + ParityDrives),所以 Minio 会先将一块 Block 按照 Drives 数量,划分为多个小块,这些小块在 Minio 中叫做 Shards。比如一个 Block 是 10MB, 而 Set 里有 16 个 Drive(8 DataDrives + 8 ParityDrives),此时 Minio 会将 Block 按照 10 MB / 8 DataDrives 的方式,将数据划分到 8 个 Data Shards,并额外再创建 8 个 空 Shards,用来存储编码后的冗余数据

接着 Minio 就会对 Data Shards 进行纠删码编码,并将编码后的冗余数据存储到前面创建的 8 个空 Shards 中,也就是 parity shards 中。

2.5 数据落盘
经过 2.4 的编码之后,我们得到了 Block 最终需要落盘的数据。

落盘的逻辑在 parallelWriter.Write()中。parallelWriter 看名字就知道,是并行 Writer。不过parallelWriter 本身并不直接写数据,它只是多个 writer 的一个并行封装。

for i := range p.writers {
	if p.writers[i] == nil {
		p.errs[i] = errDiskNotFound
		continue
	}

	wg.Add(1)
	go func(i int) {
		defer wg.Done()
		_, p.errs[i] = p.writers[i].Write(blocks[i])
		if p.errs[i] != nil {
			p.writers[i] = nil
		}
	}(i)
}

如上所示,parallelWriter 为每个 writer 分配了一个 block(注意,这里的 block 其实是上面所说的 shard),并为每个 writer 开启一个协程,并行写入数据。

那么这里的 writer 是什么呢?就是 minio 的每个磁盘的 writer。对于每块磁盘,minio 都会封装一个 writer 用来写入数据。

minio 除了用纠删码来保护数据,还采用了 Bitrot 技术。

Bitrot 是指位衰减,是指存储在存储介质中的数据的性能和完整性的缓慢恶化。它也被称为比特衰变、数据腐烂、数据衰变和静默数据损坏。
可以说纠删码是用来保证 Object 的每个 Block 的数据正确和可恢复的,而 Bitrot 技术是用来检验磁盘数据的正确性的。

纠删码技术比较复杂,但是 Bitrot 技术就比较简单了,具体逻辑在 streamingBitrotWriter 中。本质就是在写数据之前,先计算好数据的 hash,然后将 hash 先写入磁盘,再写入需要存储的数据。这样读取数据时,就可以通过重新计算 hash,和原始写入的 hash进行一致性比较,来判断数据是否有损坏。

上传文件时,Minio 不是直接上传到 object 在磁盘的最终存储目录的,而是先写到一个临时目录,等所有数据都写到临时目录后,Minio 才会进行 rename 操作,将 object 数据存储到最终存储目录。

2.6 Meta 数据落盘
除了 Object 数据,Minio 还会针对 object 生成 meta 数据,并以 json 格式,存储到每个磁盘下(和 Object 数据同一目录)。Meta 格式如下:

// A xlMetaV1 represents xl.json metadata header.
type xlMetaV1 struct {
Version string json:"version" // Version of the current xl.json.
Format string json:"format" // Format of the current xl.json.
Stat statInfo json:"stat" // Stat of the current object xl.json.
// Erasure coded info for the current object xl.json.
Erasure ErasureInfo json:"erasure"
// MinIO release tag for current object xl.json.
Minio struct {
Release string json:"release"
} json:"minio"
// Metadata map for current object xl.json.
Meta map[string]string json:"meta,omitempty"
// Captures all the individual object xl.json.
Parts []ObjectPartInfo json:"parts,omitempty"
}

标签:存储,删码,Minio,Object,基础,json,数据
From: https://www.cnblogs.com/lwx11111/p/18114540

相关文章

  • 第6天:基础入门-抓包技术&HTTPS协议&APP&小程序&PC应用&WEB&转发联动
    第六天一、抓包技术-HTTP/S-Web&APP&小程序&PC应用想要抓包都必须要配置代理和端口,这些工具只能抓取HTTP/S协议的数据,走其他协议的数据抓不了有些APP具有代理检测功能,若发现你开启了代理,直接无法访问APP1.Web网页:安装完抓包软件之后,需要在软件上导出CA证书,在浏览器上......
  • javascript常见100问|前端基础知识|问ajax-fetch-axios-区别请用 XMLHttpRequestfetch
    00-开始前端基础知识HTMLCSSJSHTTP等基础知识是前端面试的第一步,基础知识不过关将直接被拒。本章将通过多个面试题,讲解前端常考的基础知识面试题,同时复习一些重要的知识点。为何要考察扎实的前端基础知识,是作为前端工程师的根本。基础知识能保证最基本的使用,即招聘......
  • 【Linux】网络基础常识
    文章目录1.网络常识1.0dhcp协议1.1ip地址,mac地址是什么?1.2你拿着手机是如何连接上wifi的?1.3数据,流量是什么?手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点上网的原理?1.5固定电话打电话的原理?智能手机打手机电话/语音电话/视频电话的原理?1.62g,5g有什......
  • Python企业面试题1 —— 基础篇
    1.b、B、KB、MB、GB的关系?b----位(bit)B----字节(一个字节等于8位)1B=8bit1KB=1024B1MB=1024KB1GB=1024MB2.PE8规范1.使用4个空格而不是tab键进行缩进。2.每行长度不能超过79。3.使用空行来间隔函数和类。4.必要时候,在每一行下写注释。5.......
  • 前端学习<四>JavaScript基础——03-常量和变量
    常量(字面量):数字和字符串常量也称之为“字面量”,是固定值,不可改变。看见什么,它就是什么。常量有下面这几种:数字常量(数值常量)字符串常量布尔常量自定义常量数字常量数字常量非常简单,直接写数字就行,不需要任何其他的符号。既可以是整数,也可以是浮点数。例如: //不......
  • 01-ARM64体系结构基础知识
    本章思考题ARMv8体系结构处理器包含多少个通用寄存器?答:提供31个64位宽的通用寄存器,可以减少对栈的访问,从而提高性能。AArch64执行状态包含多少个异常等级?它们分别有什么作用?答:定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。请简述PSTATE寄存器中NZCV标志位的含义。答:如下表所......
  • 第01章 JavaWeb基础
    B/S架构是Brower/Server的缩写,即浏览器/服务器结构。在这种结构中,客户端不需要开发任何用户界面,而是通过浏览器(如IE,Firefox,Chrome,Safari等等)向服务器发送请求,由服务器进行处理后将响应结果返回浏览器,最后浏览器将结果内容展示出来。我们写的JavaWeb程序是在服务器端运行的。W......
  • Java登陆第三十七天——VUE3响应式基础、条件渲染、列表渲染
    响应式数据什么是响应式数据? 当数据发生改变时,DOM树的内容,会和数据同步更新。 vue3不是自动响应式数据,需要经过函数处理得到响应式数据对象。ref和reactive这两个函数都会返回响应式数据对象,但也有不同。refref通常用于将一个基本类型转为响应式数据对象。基本类型包括:数......
  • Vue基础知识:声明式导航---导航链接router-link,router-link是什么,怎么用?router-link-ac
    router-link是什么?vue-router提供的一个全局组件,router-link(用于取代a标签)router-link怎么用?router-link的好处?1.能够跳转,能高亮(自带激活时的类名)1.能跳转,配置to属性指定路径(必须)。本质还是a标签,to不需要多加#既然已经有了a标签,为什么还有加一个router-link标签呢?......
  • QT基础(B站自学笔记)
    1.程序运行原理#include"mainwindow.h"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindoww;//创建窗口对象ww.show();//显示窗口returna.exec();//进入事件循环}2.QOBJECT宏#ifndef......