Minio纠删码与存储级别
纠删码(erasure code
)概念
简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。举个最简单例子就是有两个数据(d1, d2),用一个校验和y(d1 + d2 = y
)即可保证即使丢失其中一个,依然可以还原数据。如丢失 d1 ,则使用 y - d2 = d1
还原,同理,d2 丢失或者y丢失,均可通过计算得出。
EC 的具体应用实现中, RS(Reed-Solomen)是 EC 的一种更简单快捷的实现,可以通过矩阵运算,还原数据。具体的数学矩阵运算及证明,可以参考文章《Erasure-Code-擦除码-1-原理篇》及《EC纠删码原理》。
Minio采用Reed-Solomon code(纠删码中的一种)将对象拆分成m份数据和n份奇偶校验块。
Minio中的纠删码
首先需要了解如下基本概念:
- Drive:即存储数据的磁盘,在 MinIO 启动时,以参数的方式传入。
- Erasure Set:即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Erasure Set(每个Erasure Set包含4到16个Drive),每个 Erasure Set 中的 Drive 分布在不同位置。一个对象存储在一个 Erasure Set 上。
Minio采用Reed-Solomon code纠删码实现数据的冗余。对象通过Hash均匀分布在所在的Erasure Set中。在Minio中用格式(EC:N),其中N表示EC(m+n),m为数据块的数量,n为校验块parity的数量。Minio的读操作,需要的磁盘数量为:Erasure Set中m个磁盘,写操作需要m+1个磁盘。
对于小文件(小于2M),数据和元数据都同时保存在对应的xl.meta的文件中。对应大文件的写入,会创建相应的目录,该目录下是对应的part的数据文件和元数据文件。
由上两图可知:每个bucket对应一个同名本地目录,每个对象也对应一个同名的目录,下面存数据和元数据。
Minio中的存储级别
Minio当前支持两种存储级别:Reduced Redundancy
和Standard
,通过对两种级别的设置来修改对象的Parity Drives (P)
(奇偶校验块)和Data Drives (D)
(数据块)的比例,让用户能够更好的控制磁盘使用率和容错性。
介绍
- STANDARD
STANDARD
存储级别包含比REDUCED_REDUNDANCY
存储级别更多的奇偶校验块,因此STANDARD
存储级别的奇偶校验块需要满足如下条件:
- 在未设置
REDUCED_REDUNDANCY
存储级别的情况下,STANDARD
存储级别的奇偶校验块需要大于等于2; - 在设置了
REDUCED_REDUNDANCY
存储级别的情况下,STANDARD
存储级别的奇偶校验块需要大于REDUCED_REDUNDANCY
存储级别的奇偶校验块数量 - 奇偶校验块的数量必须小于数据块,所以
STANDARD
存储级别的奇偶校验块不能大于N/2(N为Erasure Set
中的磁盘数量)
STANDARD
存储级别的奇偶校验块的默认值取决于Erasure Set
中的磁盘数量:
Erasure Set Size | Default Parity (EC:N) |
---|---|
5 or fewer | EC:2 |
6-7 | EC:3 |
8 or more | EC:4 |
补充说明:在RELEASE.2021-01-30T00-20-58Z
以前的版本中,STANDARD
存储级别的奇偶校验块默认为N/2(N为Erasure Set
中的磁盘数量)
- REDUCED_REDUNDANCY
REDUCED_REDUNDANCY
存储级别包含比STANDARD
存储级别更少的奇偶校验块,因此REDUCED_REDUNDANCY
存储级别的奇偶校验块需要满足如下条件:
- 在未设置
STANDARD
存储级别的情况下,REDUCED_REDUNDANCY
存储级别的奇偶校验块需要小于N/2 - 在设置了
STANDARD
存储级别的情况下,REDUCED_REDUNDANCY
存储级别的奇偶校验块需要小于STANDARD
存储级别的奇偶校验块数量 - 奇偶校验块的数量必须小于数据块,且
REDUCED_REDUNDANCY
存储级别的奇偶校验块需要小于STANDARD
存储级别的奇偶校验块数量,那么REDUCED_REDUNDANCY
存储级别的奇偶校验块需要大于等于2,所以Erasure Set
中的磁盘数量大于4的时候才支持REDUCED_REDUNDANCY
存储级别。
REDUCED_REDUNDANCY
存储级别的奇偶校验块默认值为:EC:2
使用
- 配置存储级别
有以下两种配置方式:
- 环境变量
export MINIO_STORAGE_CLASS_STANDARD=EC:4
export MINIO_STORAGE_CLASS_RRS=EC:2
设置以上环境变量并重启服务
mc admin
mc admin config set myminio/ storage_class standard="EC:4"
mc admin config set myminio/ storage_class rrs="EC:2"
# 重启minio服务
mc admin service restart myminio/
- 对象存储级别选取
在对象上传时,通过设置x-amz-storage-class
元数据为REDUCED_REDUNDANCY
或STANDARD
来为对象选择不同的存储级别,以下为python示例:
minioClient = Minio("localhost:9000", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", true)
metadata={'x-amz-storage-class': 'REDUCED_REDUNDANCY'}
# metadata={'x-amz-storage-class': 'STANDARD'}
minioClient.put_object(
"mybucket", "myobject", BytesIO(b"hello"),
metadata=metadata,
length=5
)
备注:
- 如果minio在启动前未自定义存储级别(storage class ),minio使用各模式存储级别的默认值进行对象储存。
- 当上传对象时,如果没有设置
x-amz-storage-class
元数据,minio使用STANDARD
模式的存储级别进行对象存储。
参考:
https://github.com/minio/minio/tree/master/docs/erasure/storage-class
https://github.com/minio/minio/tree/master/docs/config#storage-class
https://zhuanlan.zhihu.com/p/374939519
https://segmentfault.com/a/1190000022524583