MinIO 使用纠删码(erasure code)和校验和(check sum)来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法,MinIO 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很强大。
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 纠删码的设计目标是为了性能和尽可能的使用硬件加速。
位衰减又被称为数据腐化 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 是否可以正常读写。