Minio 纠删码

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

什么是纠删码?

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

RS code 编码数据恢复原理

RS编码以word为编码和解码单位,大的数据块拆分到字长为w(取值一般为8或者16位)的word,然后对word进行编解码。 数据块的编码原理与word编码原理相同,后文中以word为例说明,变量Di, Ci将代表一个word。

把输入数据视为向量D=(D1,D2,..., Dn), 编码后数据视为向量(D1, D2,..., Dn, C1, C2,.., Cm),RS编码可视为如下(图1)所示矩阵运算。

图1最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。

RS最多能容忍m个数据块被删除。 数据恢复的过程如下:

(1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。(图2、3)

(2)由于B' 是可逆的,记B'的逆矩阵为 (B'^-1),则B' * (B'^-1) = I 单位矩阵。两边左乘B' 逆矩阵。 (图4、5)

(3)得到如下原始数据D的计算公式 。如下图:

        

(4)对D重新编码,可得到丢失的编码。

为什么纠删码有用?

纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 MinIO 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 MinIO 纠删码是作用在对象级别,可以一次恢复一个对象,而 RAID 是作用在卷级别,数据恢复时间很长。 MinIO 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。MinIO 纠删码的设计目标是为了性能和尽可能的使用硬件加速。

什么是位衰减 bit rot 保护?

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

示例

以纠删码模式运行 MinIO,如下:

(1)在12个盘中启动 MinIO 服务。如下:

[root@localhost minio]# ./minio server /root/tmp/data1 /root/tmp/data2 /root/tmp/data3 /root/tmp/data4 /root/tmp/data5 /root/tmp/data6 /root/tmp/data7 /root/tmp/data8 /root/tmp/data9 /root/tmp/data10 /root/tmp/data11 /root/tmp/data12
No credential environment variables defined. Going with the defaults.
It is strongly recommended to define your own credentials via environment variables MINIO_ROOT_USER and MINIO_ROOT_PASSWORD instead of using default values
Formatting 1st pool, 1 set(s), 12 drives per set.
WARNING: Host local has more than 4 drives of set. A host failure will result in data becoming unavailable.
Status:         12 Online, 0 Offline. 
Endpoint: http://192.168.31.210:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://127.0.0.1:9000               
RootUser: minioadmin 
RootPass: minioadmin 

Browser Access:
   http://192.168.31.210:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://127.0.0.1:9000              

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://192.168.31.210:9000 minioadmin minioadmin

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately by setting 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment values
IAM initialization complete

(2)使用 MinIO Docker 镜像,在 8 块盘中启动 MinIO 服务。如下:

docker run -p 9000:9000 --name minio \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

可以随意拔掉硬盘,看 MinIO 是否可以正常读写。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号