前言:
项目中客户不愿意掏钱买oss,无奈只能给他免费大保健来一套。本篇文章只是记录验证可行性,毕竟minio太少文档了,参考着官网来。后面还会再出一套验证集群部署的文章。
一、资料
- MinIO官网: MinIO | S3 Compatible Storage for AI
- MinIO中文官网: MinIO | 用于AI的S3 & Kubernetes原生对象存储
- MinIO官方GitHub: GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.
- MinIO官方文档:
- 中文: MinIO对象存储 Kubernetes — MinIO中文文档 | MinIO Kubernetes中文文档 (tmd,内容跟英文版比,较落后,版本对不上,配置参数名都不一样,很坑)
- 英文: MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes
1、什么是对象存储?
关于对象存储,我们可以看下 阿里云OSS 的解释。
对象存储服务OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
对象存储最大的优势就在于它可以存储大容量的非结构化数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。对于大多数的企业来说,这可以说是最为理想的存储媒介了。
对于业务已在公有云上的企业来说,使用公有云提供的 OSS 服务,可以很好的节省存储的成本,且一般都提供易接入的 SDK,以阿里云的OSS 服务为例,在存储介质的上层封装可标注的 RESTful API 接口,使用起来十分方便。
但是对于一些没有选择业务上云或者想要下云的企业来说,要使用公有云的 OSS,在公网带宽方面就需要有一定的投入,毕竟需要通过公网传输,带宽太小,传输速度就会慢,且在传输过程中数据的安全性和完整性也有损失的风险,走专线的费用又十分昂贵,不实在。
这种情况下,MinIO 就是一个不错的选择,麻雀虽小,五脏俱全,企业可以以此快速构建自己内部的对象存储服务。
2、什么是 MinIO?
Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如 NodeJS、Redis、MySQL等。
1)MinIO 的应用场景
如下图,MinIO 的应用场景除了可以作为私有云的对象存储服务来使用,也可以作为云对象存储的网关层,无缝对接 Amazon S3 或者 MicroSoft Azure 。
MinIO 应用场景.png
2)特点
- 高性能:
作为一款高性能存储,在标准硬件条件下,其读写速率分别可以达到 55Gb/s 和 35Gb/s。并而 MinIO 支持一个对象文件可以是任意大小,从几kb到最大5T不等。 - 可扩展:
不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心。 - 云原生:
容器化、基于K8S的编排、多租户支持。 - Amazon S3兼容:
使用 Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK 和 AWS CLI 访问Minio服务器。 - 可对接多种后端存储:
除了Minio自己的文件系统,还支持 DAS、 JBODs、NAS、Google云存储和 Azure Blob存储。 - SDK支持:
- GO SDK: https://github.com/minio/minio-go
- JavaSDK: https://github.com/minio/minio-java
- PythonSDK: https://github.com/minio/minio-py
- Lambda计算:
Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。 - 图形化界面
有操作页面。 - 功能简单:
不容易出错,快速启动。 - 支持纠删码:
MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据。
3)存储机制
Minio 使用纠删码 erasure code和校验和 checksum。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。
校验和
保护数据免受硬件故障和无声数据损坏
纠删码
纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
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列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。
minio 存储机制1.png
RS最多能容忍m个数据块被删除。 数据恢复的过程如下:
(1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。(图2、3)
(2)由于B' 是可逆的,记B'的逆矩阵为 (B'^-1),则B' * (B'^-1) = I 单位矩阵。两边左乘B' 逆矩阵。 (图4、5)
(3)得到如下原始数据D的计算公式 。
minio 存储机制2.png
(4)对D重新编码,可得到丢失的编码
二、开始验证搭建单机
minio支持多种server启动模式:
2.1 单机部署 (学习用,无备份)(注意,只要指定目录一致,基于docker、原始、k8s部署都可以同一个服务)
minio server的standalone模式,即要管理的磁盘都在host本地。该启动模式一般仅用于实验环境、测
试环境的验证和学习使用。在standalone模式下,还可以分为non-erasure code mode和erasure
code mode。
non-erasure code mode
在此启动模式下,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会
启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏
就表示数据丢失。
erasure code mode
此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server会自动
启用erasure code mode。erasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失
败。 erasure code启用后,要求传给minio server的endpoint(standalone模式下,即本地磁盘上的目
录)至少为4个。
2.1.1基于centos7
操作系统 | CPU架构 | 地址 |
GNU/Linux国内 | 64-bit Intel | http://dl.minio.org.cn/server/minio/release/linux-amd64/minio |
GNU/Linux国外 | 64-bit Intel | https://dl.minio.io/server/minio/release/linux-amd64/minio |
①使用wget下载
wget -q http://dl.minio.org.cn/server/minio/release/linux-amd64/minio (经常访问不到,看天吃饭) |
自己的服务器: http://122.9.200.201:9000/erasurecode/minio
②为下载的minion添加执行权限,变成可执行文件
chmod +x minio
③启动minio server服务,指定数据存储目录/mnt/data (若/mnt/data 目录不存在,要先手动新建一个)
./minio server /mnt/data
④默认用户名密码minioadmin:minioadmin,修改默认用户名密码可以使用:
export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=12345678 |
⑤默认的配置目录是${HOME}/.minio,可以通过--config-dir命令自定义配置目录:
./minio server --config-dir /mnt/config /mnt/data |
⑥控制台监听端口是动态生成的(也就是每次重启,端口都不一样),可以通过--console-address ":port"指定静态端口
./minio server --console-address ":9001" /mnt/data |
⑦访问minio控制台: http://47.109.88.153:50000/dashboard
2.1.2基于docker ①查找镜像,并拉取,查看是否拉取成功(可以不做,创建容器时docker自己去下载就好了)
②创建并启动一个守护式进程 #创建将来的数据存放文件夹,及配置文件夹
然后发现容器创建成功了,但是没有运行成功,查看docker日志,提示密码要8位及以上
删除容器
重新再来一遍
|
ok,成功了。
需要注意的是api的访问接口是9000,控制台访问是9001
进入docker容器目录:
docker exec -it minio-single /bin/sh
③访问控制台 MinIO Console
④上传资源后访问(记得设计桶权限为public)然后随便玩了