分布式文件系统 minio

分布式文件存储系统 Minio

Minio

1、简介

Minio 是一个基于 Apache License v2.0 开源协议的对象存储服务,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

Minio 是一个非常轻量的服务,可以很简单的和其它应用结合,类似 NodeJS,Redis 或者 MySQL

2、Minio 优点

  • 部署简单:一个 single 二进制文件即是一切,还可支持各种平台
  • minio 支持海量存储,可按 zone 扩展(原 zone 不受影响),支持单个对象最大 5TB
  • 兼容 Amazon S3 接口,充分考虑开发人员的需求和体验
  • 低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个 1M 的数据对象,实际占用磁盘空间为 2M),但在任意 n/2 块的 disk 损坏的情况下依然可以读出数据(n 为一个纠删码集合(Erasure Coding Set)中的 disk 数量)并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的
  • 读写性能优异

3、基本概念

  • Object:存储到 Minio 的基本对象,如文件、字节流、Anything …
  • Bucket:用来存储 Object 的逻辑空间,每个 Bucket 之间的数据是相互隔离的,对于客户端而言,就相当于一个存放文件的顶层文件夹
  • Drive:即存储数据的磁盘,在 Minio 启动时,以参数的方式传入,Minio 中所有的对象数据都会存储在 Drive 里
  • Set:即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set,每个 Set 中的 Drive 分布在不同位置。
    • 一个对象存储在一个 Set 上
    • 一个集群划分为多个 Set
    • 一个 Set 包含的 Drive 数量是固定的,默认由系统根据集群规模自动计算得出
    • 一个 Set 中的 Drive 尽可能分布在不同的节点上

4、纠删码 EC(Erasure Code)

Minio 使用纠删码来保证高可靠性,使用 highwayhash 来处理数据损坏(Bit Rot Protection)

纠删码:是一种恢复丢失和损坏数据的算法,Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。通过数学计算,把丢失的数据进行还原,可以将 n 份原始数据,增加 m 份数据,并通过 n + m 份中的任意 n 份数据,还原为原始数据,即如果有任意小于等于 m 份的数据失效,仍然能通过剩下的数据还原出来

5、存储形式

文件对象上传到 Minio,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目录,文件名下时 part.1 和 xl.meta,前者是编码数据块,后者是元数据文件

6、docker 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 单盘启动
docker run -d \
-p 9000:9000 \
-p 9003:9003 \
--name minio\
-v /docker/minio/data:/data \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio" \
minio/minio server /data --console-address ":9003"

# 多盘启动
docker run -d \
-p 9000:9000 \
-p 9003:9003 \
--name minio\
-v /docker/minio/data1:/data1 \
-v /docker/minio/data2:/data2 \
-v /docker/minio/data3:/data3 \
-v /docker/minio/data4:/data4 \
-v /docker/minio/data5:/data5 \
-v /docker/minio/data6:/data6 \
-v /docker/minio/data7:/data7 \
-v /docker/minio/data8:/data8 \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio" \
minio/minio server /data{1...8} --console-address ":9003"

docker-compose file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3"
services:
# minio
minio:
# 容器名称,根据部署的版本修改
container_name: minio
# 镜像,根据部署的版本修改
image: minio/minio
command: server /data --console-address ":9003"
# 目录映射
volumes:
- /home/docker/minio/data:/data
# 挂载位置(镜像和宿主机器之间时间保持一致)
- /etc/localtime:/etc/localtime
# 端口映射,需要跟配置文件中的一致,不推荐映射不一致
ports:
- "9000:9000"
- "9003:9003"
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123
# 重启类型
# restart: always
privileged: true

7、分布式集群

分布式 Minio 可以将多块硬盘(甚至在不同机器上)组成一个对象存储服务,由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障

1
minio server http://host{1...n}/export{1...m}

8、分布式存储可靠性常用方法

分布式存储,关键的点在于数据的可靠性,即保证数据的完整、不丢失、不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。

8.1、冗余

冗余法是最简单最直接的方法,即对存储的数据进行副本备份,当数据出现丢失、损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了数据库可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。

8.2、校验

校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。

  1. 校验:通过对数据进行校验和计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如 TCP 协议
  2. 恢复还原:通过对数据的校验码进行数据计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID 技术,纠删码(Erasure Code)技术等

9、分布式 Minio 的优势

9.1、数据保护

  • 分布式 Minio 采用纠删码来防范多个节点宕机和位衰减 bit rot
  • 分布式 Minio 至少需要 4 个硬盘,使用分布式 Minio 自动引入纠删码功能

9.2、高可用

  • 单机 Minio 服务存在单点故障,相反,如果是一个有 N 块硬盘的分布式 Minio,只要有 N/2 硬盘在线,数据就是安全的,不过,至少需要有 N/2 + 1 个硬盘来创建新的对象

9.3、一致性

  • Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型

10、分布式 Minio

启动一个分布式 Minio 实例,只需要把硬盘位置作为参数传给 minio server 命令即可,然后需要在所有其它节点运行同样的命令。

  • 分布式 Minio 里所有的节点需要有同样的 access 密钥和 secret 密钥,这样这些节点才能建立联接,为了实现这个,需要在 minio server 命令之前,先将 access 密钥和 secret 密钥 export 为环境变量
  • 分布式 Minio 使用的磁盘必须是干净的,里面没有数据
  • 分布式 Minio 里的节点时间差不能超过 3 秒,可以使用 NTP 来保证时间一致

8 个节点,每个节点一块盘,每个节点都需要运行以下命令:

1
2
3
4
5
6
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
http://192.168.1.13/export3 http://192.168.1.14/export4 \
http://192.168.1.15/export5 http://192.168.1.16/export6 \
http://192.168.1.17/export7 http://192.168.1.118/export8 \
  • Copyrights © 2022-2023 hqz

请我喝杯咖啡吧~

支付宝
微信