概述

Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。区别于分布式存储系统,minio的特色在于简单、轻量级,对开发者友好,认为存储应该是一个开发问题而不是一个运维问题。


存储架构


Minio 针对不同应用场景也设置了对应的存储架构:


单主机,单硬盘模式

该模式下,Minio 只在一台服务器上搭建服务,且数据都存在单块磁盘上,该模式存在单点风险,主要用作开发、测试等使用


 ---   --


单主机,多硬盘模式

该模式下,Minio 在一台服务器上搭建服务,但数据分散在多块(大于 4 块)磁盘上,提供了数据上的安全保障


minio --config-dir ~/tenant1 server --address :9001 /disk1/data/tenant1 /disk2/data/tenant1 /disk3/data/tenant1 /disk4/data/enant1


多主机、多硬盘模式(分布式)

该模式是 Minio 服务最常用的架构,通过共享一个 access_key 和 secret_key, 在多台(2-32)服务器上搭建服务,且数据分散在多块(大于 4 块,无上限)磁盘上,提供了较为强大的数据冗余机制(Reed-Solomon 纠删码)。


export MINIO_ACCESS_KEY=<TENANT1_ACCESS_KEY>
export MINIO_SECRET_KEY=<TENANT1_SECRET_KEY>
minio --config-dir ~/tenant1 server --address :9001 http://192.168.10.11/data/tenant1 http://192.168.10.12/data/tenant1 http://192.168.10.13/data/tenant1 http://192.168.10.14/data/tenant1


数据安全


Minio 使用了 Reed-Solomon 纠删码和校验和来保护数据免受硬件故障和无声数据损坏。


Reed-Solomon 纠删码


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


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


此外,针对不同应用所需的数据安全级别不同,Minio 还提供了存储级别(Storage Class)的配置,调整数据块和校验块的比例,做到对空间的最佳使用。



比如在将比例调整为 14:2 后,存储 100M 的数据占用的空间仅为 114M。


位衰减保护


位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption, 是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。针对这一问题,最新的 Minio 采用了 HighwayHash 算法计算校验和来防范位衰减,根据测试结果,其可以实现 10GB/s 的处理速度。


文件的修复


得益于 Reed-Solomon 纠删码,Minio 可以更加灵活的对文件进行修复。目前,Minio 提供了全量、bucket、文件夹、文件等各个粒度的修复操作:





相比一般的 RAID 方式,Minio 可以在非常小的粒度下对文件进行修复操作,灵活性有了很大提高。


Minio 的相关操作


Minio 提供了客户端以及 sdk 以对系统和数据进行操作,目前 sdk 有 java、js、python、go 以及. NET 版本。


其中,Minio 客户端提供了一系列类 UNIX 命令,它主要是对 Minio 服务进行管理


而 sdk 则主要提供了对 bucket 以及文件对象的操作,java 应用可通过 maven 引入依赖。


Minio 提供的其他一些功能


Minio 还提供了一些辅助功能以方便使用,比如其自带了一个管理界面,实现对文件等的操作。


另外,它还支持集成 prometheus,用以监控 CPU、硬盘、网络等数据
此外,它也提供了一些通知机制来记录具体的操作,目前主要支持 AMQP,Redis,MySQL,Kafka,ES,Webhooks 等


总结


Minio 作为一个分布式存储系统,学习成本较低,安装运维简单,基本属于开箱即用,且 sdk 支持较为完善,可以尝试作为分布式存储需求的解决方案。


参考资料:


https://docs.minio.io/docs/
https://blog.minio.io/highwayhash-fast-hashing-at-over-10-gb-s-per-core-in-golang-fee938b5218a
https://blog.csdn.net/wangsiman/article/details/80101654
http://tech.dianwoda.com/2018/12/04/fen-bu-shi-cun-chu-xi-tong-miniojian-jie/