MinIO
一、概述
1.1 minIO是什么?
MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。(早前流行的还有FastDFS)
据官方介绍,单个对象最大可存储5T,非常适合存储海量图片、视频、日志文件、备份数据和容器、虚拟镜像等。
- 采用golang语言编译
- 客户端和用户端交互采用http和https用户协议
1.2 为什么选择minIO?
- 安装部署简单
- 自带UI界面,操作简单,开箱即用
- 性能优秀,对象读写速度极快
- 支持云原生容器化部署
- 支持全部主流的SDK支持,java py等
- 兼容亚马逊S3 API(便于后续继续迁移到更大的云厂商
- 官方文档很完整
1.3 基础概念
1.3.1 Object 存储对象
存储到minIO的基本对象,包括文件、字节流、任何类型…
1.3.2 Buckets 桶
对象和关联配置的分组。
- 不同的项目可以使用Bucket进行区分
- 每个项目中不同的功模块,还可以在项目内部创建不同的目录
1.3.3 cluster 集群
汇集到单个存储资源中的一组驱动器和一个或多个 MinIO 服务器进程。See also: tenant.
1.3.4 Drive 驱动
即存储数据的磁盘,在minIO启动时,以参数的方式传入。
minIO所有的对象数据都会存储在Drive里。
1.3.5 Set 集合
即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set——每个Set的Drive分布在不同位置。
- 一个对象存储在一个Set上。
- 一个集群又划分多个Set
- 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出。
- 一个Set中的Drive尽可能的分布在不同的节点上。
1.3.3 Console 控制台
用于与 MinIO 部署或租户交互的图形用户界面 (GUI)。
其他概念具体看官方文档https://www.minio.org.cn/docs/minio/container/glossary.html#
1.4 纠删码EC (Erasure Code)
官方解释 : MinIO 纠删码是一种数据冗余和可用性功能,允许 MinIO 部署在集群中多个驱动器或节点丢失的情况下自动动态重建对象。
纠删码提供对象级修复,其开销显着低于 RAID 或复制等相邻技术。
简单理解:
minio存储文件会通过纠删码进行冗余。
比如一个原文件进行存储后,会经过纠删码优化(压缩)后存储到其他位置。
开启纠删码模式后,miniIO可以实现低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存一个1m的文件,实际占用空间为2m)。
具体的原理先不展开
二、MinIO基于Docker快速部署
这里参考的版本较早,接下来会结合官方最新的英文文档,记录部署流程。
英文:https://min.io/docs/
中文:https://www.minio.org.cn/docs/cn/minio/kubernetes/upstream/index.html
2.0 快速记录指令
# 镜像拉取
docker pull minio/minio;# 创建环境变量文件
touch /etc/default/minio
vi /etc/default/minio# 输入账号密码
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=自己改密码MINIO_VOLUMES="/mnt/data"#保存# 启动容器
docker run \-p 9001:9000 -p 9091:9090 \-v 路径也要自己设置:/mnt/data \-v /etc/default/minio:/etc/config.env \-e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \--name "minio" \minio/minio server --console-address ":9090"
docker-compose
version: '3'
services:minio_local1:image: minio/miniocommand: server --console-address ":9090"container_name: minioenvironment:MINIO_CONFIG_ENV_FILE: /etc/config.envports:- "9001:9000"- "9091:9090"volumes:- ./data:/mnt/data- /etc/default/minio:/etc/config.env
2.1 拉取最新的稳定版镜像
拉取镜像
docker pull minio/minio
2.2 创建环境变量文件
在 处创建环境变量文件/etc/default/minio
。
vi /etc/default/minio
需要配置的内容如下:
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-meMINIO_VOLUMES="/mnt/data"# MINIO_SERVER_URL="http://minio.example.net:9000"
基本的注释如下:
- MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 设置了 MinIO 服务器的 root 帐户。该用户拥有最高权限。
- 没有配置时默认值为:
minioadmin:minioadmin
。当然,官方推荐不使用默认值,无论任何环境。 - MINIO_VOLUMES 设置用于 MinIO 服务器的存储卷或路径。
- MINIO_SERVER_URL 设置与 MinIO 服务器一起使用的本地计算机的主机名。MinIO 假设您的网络控制层可以正确将此主机名解析为本地计算机
- 手动配置MINIO_SERVER_URL :请将该值替换为本地计算机的正确主机名和 MinIO 服务器的端口(否则默认为 9000)。
配置后如下:
2.3 创建并运行容器
docker运行指令
docker run -dt \-p 9001:9000 -p 9091:9090 \-v PATH:/mnt/data \-v /etc/default/minio:/etc/config.env \-e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \--name "minio_local1" \minio/minio server --console-address ":9090"
成功启动打印日志可以查看:
访问9090端口,登陆控制台即可查看到:
三、Minio Client 快速入门指南
MC和linux指令类似,为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹。
cat 显示文件和对象内容。
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
find 基于参数查找文件。
diff 对两个文件夹或者存储桶比较差异。
rm 删除文件和对象。
events 管理对象通知。
watch 监听文件和对象的事件。
policy 管理访问策略。
session 为cp命令管理保存的会话。
config 管理mc配置文件。
update 检查软件更新。
version 输出版本信息。
3.1 安装Minio Client
64-bit Intel
curl https://dl.min.io/client/mc/release/linux-amd64/mc \--create-dirs \-o $HOME/minio-binaries/mcchmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/mc --help
更多安装方式:https://min.io/docs/minio/linux/reference/minio-mc.html?ref=docs
3.2 配置MC,连接到minIO
# 查看当前已配置的服务器
mc config host ls# 添加服务器配置
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> <API-SIGNATURE># 举个例子 mc config host add minio-local1 http://localhost:9000 通行码 秘钥
-
提示如下即可成功,输入指令测试
3.3 几个基础指令
mc的大部分指令都有很完整的案例,使用–help参数即可查看详细
3.3.1 上传下载文件
- ls-查看目录
- cp- 复制文件(下载文件,上传文件
- mv 移动文件
- rm 删除文件
举个例子
mc ls minio-local1/first-bucket
# 下载文件
mc cp minio-local1/first-bucket/pom.xml /home
# 上传文件
mc cp docker-compose.yml minio-local1/first-bucket
3.3.2 Bucket-桶管理
-
mb 创建桶
-
rb 删除桶
- 要强制删除 需要加上参数 --force 【慎用!!】
-
du 查询使用情况
举个例子
# 创建几个桶
root@VM-12-17-ubuntu:/home/nexus3# mc mb minio-local1/new-bucket
Bucket created successfully `minio-local1/new-bucket`.
root@VM-12-17-ubuntu:/home/nexus3# mc mb minio-local1/new-bucket2
Bucket created successfully `minio-local1/new-bucket2`.
root@VM-12-17-ubuntu:/home/nexus3# mc mb minio-local1/new-bucket3
Bucket created successfully `minio-local1/new-bucket3`.
root@VM-12-17-ubuntu:/home/nexus3# mc mb minio-local1/new-bucket4
Bucket created successfully `minio-local1/new-bucket4`.# 删除几个桶root@VM-12-17-ubuntu:/home/nexus3# mc rb minio-local1/new-bucket4
Removed `minio-local1/new-bucket4` successfully.
root@VM-12-17-ubuntu:/home/nexus3# mc rb minio-local1/new-bucket2
Removed `minio-local1/new-bucket2` successfully.
3.99 MC Admin使用
MinIO 客户端 “mc” 命令行工具提供命令 用于在 MinIO 部署上执行管理任务的命令。
现在一般用界面代替,不详细看了
官方文档地址:https://min.io/docs/minio/linux/reference/minio-mc-admin.html
四、TODO 分布式集群部署
4.1、MinIO的EC码和文件存储结构
4.1.1 EC 快速理解
Minio使用纠删码erasure code
和校验和checksum
来保护数据免受硬件故障和无声数据损坏。
即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
4.1.2 什么是Erasure Code?
纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。
这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很NB,感兴趣的同学请翻墙google。
4.1.3 为什么EC有用?
纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。
而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,回复速度很快,而RAID是作用在卷级别,数据恢复时间很长。
Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。
Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。