未分类 · 2023年3月24日 0

minio 分布式解决方案【】

1.架构设计。

MinIO 将对象分成块,并在每个块之间均匀分布 驱动器在擦除集。 MinIO 可以继续无缝地服务于读取和 尽管丢失了任何单个驱动器,但仍会发出写入请求。 在最高 冗余级别,MinIO 可以以最低的性能处理读取请求 尽管损失了多达一半 (N/2) 的总驱动器部署
下面采用最低4个节点,每个节点四块盘  4节点共计块16盘(下面用一块盘创建四个目录模拟4块磁盘)

设计流程:先部署2节点8盘的minio 集群,之后测试实现扩容4节点16盘的minio


2.部署
2-1.务器规划,前期准备
每个节点四块盘 4节点共计块16盘(下面用一块盘创建四个目录模拟4块磁盘),并配置好本地host解析

测试双节点集群:
IP            Hostname

10.10.3.249    minio1
10.10.3.250    minio2
测试扩容使用:
10.10.3.251    minio3
10.10.3.252    minio4
minio数据磁盘
把数据磁盘格式化为xfs 格式  (mkfs.xfs )
df -h 
[root@minio3 minio]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G  122M  3.7G   4% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/xvda3      495G  1.9G  493G   1% /
/dev/xvda2      497M  142M  356M  29% /boot
/dev/xvda6      498M   16K  498M   1% /boot/efi
tmpfs           781M     0  781M   0% /run/user/0
/dev/xvdb1      200G   53M  200G   1% /data/minio
  
格式化 数据盘
mkfs.xfs  /dev/xvdb1

创建minio数据目录,挂载数据磁盘到数据目录
mkdir  -p /data/minio{1..4}
mount /dev/xvdb1 /data
并写入到/etc/fstab文件实现永久挂载
vim /etc/fstab 
略

2-2 首先下载MinIO

wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 添加可执行权限
chmod +x minio

2-3配置 minio

export MINIO_ROOT_USER=minio         #minio管理员用户
export MINIO_ROOT_PASSWORD=minio123  #管理员密码

2-4.安装mc客户端,配置环境变量

首先要下载mc客户端,下载地址如下:
cd /root
curl -o  http://dl.minio.org.cn/client/mc/release/linux-amd64/mc

echo export PATH=$PATH:/root/ >> /etc/profile
source /etc/profile

2-5.编写minio启动脚本,并配置service启动

#minio 启动脚本
[root@minio2 data]# cat /app/run_minio.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123
/app/minio server  http://minio{1...2}:9000/data/minio{1...4}

vim /etc/systemd/system/minio.service
#配置service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
#EnvironmentFile=-/etc/default/minio.conf
WorkingDirectory=/app/
ExecStart=/app/run_minio.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启动minio 集群

systemctl daemon-reload
systemctl restart minio
systemctl enable minio
systemctl status minio  #查看状态是否正常

2-6
使用mc客户端命令
详细信息见官方文档(http://docs.minio.org.cn/docs/master/minio-client-quickstart-guide)

ls       列出文件和文件夹。
mb       创建一个存储桶或一个文件夹。
cat      显示文件和对象内容。
pipe     将一个STDIN重定向到一个对象或者文件或者STDOUT。
share    生成用于共享的URL。
cp       拷贝文件和对象。
mirror   给存储桶和文件夹做镜像。
find     基于参数查找文件。
diff     对两个文件夹或者存储桶比较差异。
rm       删除文件和对象。
events   管理对象通知。
watch    监听文件和对象的事件。
policy   管理访问策略。
session  为cp命令管理保存的会话。
config   管理mc配置文件。
update   检查软件更新。
version  输出版本信息。

2-7 检查可用性,创建存储

1. 根据格式创建一个存储
例:mc config host add     [--api API-SIGNATURE]
[root@minio1 ~]# mc config host add minio http://minio1:9000 minio minio123 --api s3v4
2.查看创建的存储
[root@minio1 ~]# mc config host ls
gcs
  URL       : https://storage.googleapis.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v2
  Path      : dns

local
  URL       : http://localhost:9000
  AccessKey :
  SecretKey :
  API       :
  Path      : auto

minio       #刚才创建的存储
  URL       : http://minio1:9000    
  AccessKey : minio
  SecretKey : minio123
  API       : s3v4
  Path      : auto

play
  URL       : https://play.min.io
  AccessKey : Q3AM3UQ867SPQQA43P2F
  SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  API       : S3v4
  Path      : auto

s3
  URL       : https://s3.amazonaws.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v4
  Path      : dns

3.检查存储节点以及可用性
[root@minio1 ~]# mc admin info minio
●  minio1:9000
   Uptime: 4 hours
   Version: 2022-05-08T23:50:31Z
   Network: 2/2 OK     
   Drives: 4/4 OK       
   Pool: 1st

●  minio2:9000
   Uptime: 4 hours
   Version: 2022-05-08T23:50:31Z
   Network: 2/2 OK
   Drives: 4/4 OK
   Pool: 1st

4.在存储中创建bucket 
#在minio 上创建一个名叫 mybucket 的存储桶
[root@minio1 ~]# mc mb   minio/mybucket
Bucket created successfully `minio/mybucket`.

5.给mybucket 存储上上传图片资源或其他资源
[root@minio1 tmp]# mc cp  test.jpg minio/mybucket
/tmp/test.jpg:         83.44 KiB / 83.44 KiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 6.05 MiB/s 0s



6.在存储中查看资源

注:在纠删码模式下再上传文件,可以发现每个磁盘路径中都保存了一份原始文件
和纠删码数据,这样就可以实现一定的冗余,保障数据恢复
[root@minio1 data]# tree /data/
/data/
├── minio1
│   ├── mybucket
│   │   └── test.jpg
│   │       └── xl.meta
│   ├── test
│   │   └── test.txt
│   │       └── xl.meta
│   └── test1
│       ├── jg.jpg
│       │   └── xl.meta
│       └── minio.tar.gz
│           ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
│           │   ├── part.1
│           │   └── part.2
│           └── xl.meta
├── minio2
│   ├── mybucket
│   │   └── test.jpg
│   │       └── xl.meta
│   ├── test
│   │   └── test.txt
│   │       └── xl.meta
│   └── test1
│       ├── jg.jpg
│       │   └── xl.meta
│       └── minio.tar.gz
│           ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
│           │   ├── part.1
│           │   └── part.2
│           └── xl.meta
├── minio3
│   ├── mybucket
│   │   └── test.jpg
│   │       └── xl.meta
│   ├── test
│   │   └── test.txt
│   │       └── xl.meta
│   └── test1
│       ├── jg.jpg
│       │   └── xl.meta
│       └── minio.tar.gz
│           ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
│           │   ├── part.1
│           │   └── part.2
│           └── xl.meta
└── minio4
    ├── mybucket
    │   └── test.jpg
    │       └── xl.meta
    ├── test
    │   └── test.txt
    │       └── xl.meta
    └── test1
        ├── jg.jpg
        │   └── xl.meta
        └── minio.tar.gz
            ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
            │   ├── part.1
            │   └── part.2
            └── xl.meta


xl.meta 为元数据信息
part.* 为校验数据信息

7. 测试数据恢复
#删除一块盘中的所有数据,不要再生产环境尝试*****
[root@minio1 ~]# ll /data/minio4/
total 0
drwxr-xr-x 3 root root 22 May 23 16:29 mybucket
drwxr-xr-x 3 root root 22 May 23 16:29 test
drwxr-xr-x 4 root root 40 May 23 16:29 test1
[root@minio1 ~]# rm -rf /data/minio4/*
查看对象存储里的信息
[root@minio1 ~]# tree /data/minio4
/data/minio4

0 directories, 0 files
[root@minio1 ~]# tree /data/minio3/
/data/minio3/
├── mybucket
│   └── test.jpg
│       └── xl.meta
├── test
│   └── test.txt
│       └── xl.meta
└── test1
    ├── jg.jpg
    │   └── xl.meta
    └── minio.tar.gz
        ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
        │   ├── part.1
        │   └── part.2
        └── xl.meta
可以看到minio4盘中的数据已经删除了(模拟故障)
下面我们来恢复数据
执行:
[root@minio1 ~]# mc admin heal -r minio/test1
 ◓  test1/minio.tar.gz
    0/2 objects; 27 MiB in 1s
    ┌────────┬───┬─────────────────────┐
    │ Green  │ 5 │ 100.0% ████████████ │
    │ Yellow │ 0 │   0.0%              │
    │ Red    │ 0 │   0.0%              │
    │ Grey   │ 0 │   0.0%              │
    └────────┴───┴─────────────────────┘
[root@minio1 ~]# mc admin heal -r minio/test
 ◓  test/test.txt
    0/1 objects; 4 B in 1s
    ┌────────┬───┬─────────────────────┐
    │ Green  │ 4 │ 100.0% ████████████ │
    │ Yellow │ 0 │   0.0%              │
    │ Red    │ 0 │   0.0%              │
    │ Grey   │ 0 │   0.0%              │
    └────────┴───┴─────────────────────┘
[root@minio1 ~]# mc admin heal -r minio/mybucket
 ◓  mybucket/test.jpg
    0/1 objects; 83 KiB in 1s
    ┌────────┬───┬─────────────────────┐
    │ Green  │ 4 │ 100.0% ████████████ │
    │ Yellow │ 0 │   0.0%              │
    │ Red    │ 0 │   0.0%              │
    │ Grey   │ 0 │   0.0%              │
    └────────┴───┴─────────────────────┘
[root@minio1 ~]# tree /data/minio4/
/data/minio4/
├── mybucket
│   └── test.jpg
│       └── xl.meta
├── test
│   └── test.txt
│       └── xl.meta
└── test1
    ├── jg.jpg
    │   └── xl.meta
    └── minio.tar.gz
        ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
        │   ├── part.1
        │   └── part.2
        └── xl.meta

8 directories, 6 files
可以看到,刚才删除的桶和桶内的数据已经恢复。



到此为止,两节点8盘minio部署完成。

3.minio集群扩容。
对等扩容

首先,MinIO的极简设计理念使得MinIO分布式集群并不支持向集群中添加单个节点并进行自动调节的扩容方式,这是因为加入单个节点后所引发的数据均衡以及纠删组划分等问题会为整个集群带来复杂的调度和处理过程,并不利于维护。因此,MinIO提供了一种对等扩容的方式,即要求增加的节点数和磁盘数均需与原集群保持对等。

例如原集群包含2个节点4块磁盘,则在扩容时必须同样增加2个节点4块磁盘(或为其倍数),以便系统维持相同的数据冗余SLA,从而极大地降低扩容的复杂性。在扩容后,MinIO集群并不会对全部的4个节点进行完全的数据均衡,而是将原本的2个节点视作一个区域,新加入的2节点视作另一区域,当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内仍旧通过哈希算法确定对应的纠删组进行最终的存放。此外,集群进行一次对等扩容后,还可依据扩容规则继续进行对等扩容,但出于安全性考虑,集群的最大节点数一般不得超过32个。
所以下面在用两台服务器对上面的2节点4磁盘服务器进行扩容
10.10.3.251 minio3
10.10.3.252 minio4
设置好hostname、hosts等,安装minio 如上 2-2和2-3

1.修改run_minio.sh 启动文件
[root@minio1 ~]# cat /app/run_minio.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123
/app/minio server   http://minio{1...2}:9000/data/minio{1...4}   
http://minio{3...4}:9000/data/minio{1...4}

2.四个节点都修改完后,重启minio服务。
systemctl restart minio
systemctl enable minio
3.检查minio集群状态
[root@minio3 ~]# mc admin info minio
●  minio1:9000
   Uptime: 3 hours
   Version: 2022-05-08T23:50:31Z
   Network: 4/4 OK
   Drives: 4/4 OK
   Pool: 1st

●  minio2:9000
   Uptime: 3 hours
   Version: 2022-05-08T23:50:31Z
   Network: 4/4 OK
   Drives: 4/4 OK
   Pool: 1st

●  minio3:9000
   Uptime: 3 hours
   Version: 2022-05-08T23:50:31Z
   Network: 4/4 OK
   Drives: 4/4 OK
   Pool: 2nd

●  minio4:9000
   Uptime: 3 hours
   Version: 2022-05-08T23:50:31Z
   Network: 4/4 OK
   Drives: 4/4 OK
   Pool: 2nd

扩容完成。

4.存储机制

在对象存储里,元数据包括 account(用户), bucket, bucket index等信息。Minio没有独立的元数据服务器,在minio里都保存在底层的本地文件系统里。

在本地文件系统里,一个bucket对应本地文件系统中的一个目录。一个对象对应bucket目录下的一个目录(在EC的情况下对应多个part文件)。目录下保存者对象相关的数据和元数据。

数据存储EC

Minio目前数据仅支持EC的数据读写模式,不支持副本模式,也不支持一个集群内的扩容。在Minio的设计里,一个独立的集群中的节点数量和磁盘的数量是都是固定的,后续不能增加。只能以Federation的方式整个集群为单位扩容。

Minio把4~16个磁盘组成一个Erasure Set,每个Erasure Set包含4~16个磁盘,最少4个磁盘,最大16个磁盘,最小需要4个节点。磁盘均匀分布在所有的节点上。

例如:4个节点,每个节点8个磁盘。 每个Erasure Set 最大16个磁盘,总共32个磁盘的集群创建2个Erasure Set。每个节点取4块磁盘构成一个独立的Erasure Set中。对象在Erasure Set 中通过Hash均匀分布在所有的Erasure Set中。

 ── minio4
    ├── test
    │   └── test.txt
    │       └── xl.meta
    └── test1
        ├── minio.tar.gz
        │   ├── e5b55abd-d65e-47b2-967d-3b8f8cc25918
        │   │   ├── part.1
        │   │   └── part.2
        │   └── xl.meta
        └── q.jpg
            └── xl.meta
当前集群中有2个bucket:test1和test   
test1中有2个对象:分别是 "minio.tar.gz","q.jpg"
minio.tar.gz是20M的大文件,通过mc cp上传到集群中,有2个part,分别为part.1和part.2文件。
q.jpg文件是一个小图片文件,大小为357.9KB。
可以清晰的看到,每个bucket对应一个同名本地目录,每个对象也对应一个同名的目录,下面存数据和元数据。
对应小文件,数据和元数据都保存在 xl.meta的元数据文件中。
对应大文件的写入,会创建相应的目录,该目录下是对应的part的数据文件和元数据。

5.minio 4节点16盘 分布式高可用部署(一台节点部署两个minio进程)
上述已经部署了2节点8盘的分布式minio -也完成了扩容。因项目需求 需要启动两个minio分布式架构。后续再新加的磁盘上再添加minio集群。

前期准备与上面相同,因部署了一个service启动minio集群,接下来的集群需要修改默认端口,并用脚本的方式启动。

前期minio 和mc 都已经安装完毕 
需要按照2-1 来给新盘格式化并挂载 ,并模拟一个节点四块盘来创建目录。
完成2-1准备工作后启动新的minio集群,启动脚本如下。
5-1.编写启动脚本
cat /app/run_minio_2.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123
nohup /app/minio server  http://minio{1...4}:9002/data2/minio{1...4} 
--address=0.0.0.0:9002 --console-address ":9003" >> /app/minio_2.log 2>&1 &
四个节点都更改后启动脚本

5-2.查看日志检查服务状态
没有报错后查看资源信息
5-3.新建云存储别名,并检查健康状态
mc config host add minio_2 http://minio1:9002 minio minio123 --api s3v4
mc admin info minio_2  #查看节点健康状态

5-4 下面用web页面进行展示
新部署的集群是4节点16磁盘

image.png

创建bucket 输入创建的bucket 名称

尝试上传文件(文件上传成功)

image.png

此时已经满足需求。

6.可用性测试
上述以纠删码模式运行 minio_2 默认可丢失一般磁盘,下面我们对其进行测试

6-1 破坏测试
删除 /data2/ 目录下所有文件 查看日志

image.png

可以看到日志出现报错,找不到/data2/minio1 ,然后尝试修复。

image.png

目录和文件均已修复。

6-2

7.后期项目如何调用minio
MinIO Java Client SDK提供简单的API来访问对象存储服务。
需要再代码中配置 MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象。
详细配置请研发人员查看官方文档。
http://docs.minio.org.cn/docs/master/java-client-quickstart-guide

打赏 赞(0) 分享'
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏