minio分布式集群搭建完全教程(纠删码,数据恢复)

minio 专栏收录该内容
1 篇文章 1 订阅

minio存储

单机测试

minio对象存储:

编译安装:

minio 服务器安装

git clone https://gitee.com/mirrors/minio.git
cd minio
go build
cp minio /usr/local/bin/

minio客户端安装

git clone git clone https://github.com/minio/mc.git
cd mc
go build
cp mc /usr/local/bin/
单机性能测试:

启动minio服务器

root@ubuntu:/home/work/minio# minio server data
Endpoint:  http://10.1.30.31:9000  http://172.17.0.1:9000  http://172.30.0.1:9000  http://127.0.0.1:9000        
AccessKey: minioadmin 
SecretKey: minioadmin 

Browser Access:
   http://10.1.30.31:9000  http://172.17.0.1:9000  http://172.30.0.1:9000  http://127.0.0.1:9000        

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://10.1.30.31:9000 minioadmin minioadmin

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'

mc客户端写入数据

root@ubuntu:/home/work/minio# dd if=/dev/zero of=random bs=10M count=1024

1024+0 records in
1024+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 56.3821 s, 190 MB/s
root@ubuntu:/home/work/minio# 
root@ubuntu:/home/work/minio# ll random 
-rw-r--r-- 1 root root 10737418240 Oct 27 16:58 random
root@ubuntu:/home/work/minio# mc cp ./random data/
./random:                 10.00 GiB / 10.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.09 GiB/s 9s
root@ubuntu:/home/work/minio# ll /home/work/minio/data/
total 10485772
drwxr-xr-x 3 root root        4096 Oct 27 17:00 ./
drwxr-xr-x 6 root root        4096 Oct 27 16:57 ../
drwxr-xr-x 6 root root        4096 Oct 27 16:47 .minio.sys/
-rw-r--r-- 1 root root 10737418240 Oct 27 17:00 random
root@ubuntu:/home/work/minio# ll /home/work/minio/data/ -h
total 11G
drwxr-xr-x 3 root root 4.0K Oct 27 17:00 ./
drwxr-xr-x 6 root root 4.0K Oct 27 16:57 ../
drwxr-xr-x 6 root root 4.0K Oct 27 16:47 .minio.sys/
-rw-r--r-- 1 root root  10G Oct 27 17:00 random
root@ubuntu:/home/work/minio#

linux文件系统拷贝性能测试

root@ubuntu:/home/work/minio# rm random 
root@ubuntu:/home/work/minio# ll
total 28
drwxr-xr-x  7 root root 4096 Oct 27 17:18 ./
drwxr-xr-x  5 root root 4096 Oct 27 16:26 ../
drwxr-xr-x  3 root root 4096 Oct 27 17:00 data/
drwxr-xr-x  3 root root 4096 Oct 27 16:55 dir1/
drwxr-xr-x  2 root root 4096 Oct 27 16:58 dir2/
drwxr-xr-x  8 root root 4096 Oct 27 17:13 mc/
drwxr-xr-x 12 root root 4096 Oct 27 16:33 minio/
root@ubuntu:/home/work/minio# time cp data/random .

real	0m8.067s
user	0m0.064s
sys	0m8.002s
root@ubuntu:/home/work/minio#

挂载
准备密码文件:

echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
chmod 600 ${HOME}/.passwd-s3fs

挂载:

root@ubuntu:/home/work/minio# ls /mnt/
root@ubuntu:/home/work/minio# s3fs data/
.minio.sys/ random      
root@ubuntu:/home/work/minio# s3fs data /mnt/
s3fs: credentials file /root/.passwd-s3fs should not have others permissions.
root@ubuntu:/home/work/minio# chmod 600 /root/.passwd-s3fs 
root@ubuntu:/home/work/minio# s3fs data /mnt/
root@ubuntu:/home/work/minio# 

写入测试:

root@ubuntu:/home/work/minio# cd /mnt/
root@ubuntu:/mnt# time dd if=/dev/zero of=file1 bs=2M count=1024
1024+0 records in
1024+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 1.43733 s, 1.5 GB/s

real	0m1.440s
user	0m0.000s
sys	0m1.440s
root@ubuntu:/mnt#

集群性能测试:

docker 容器形成集群

集群测试

测试硬件环境:

在这里插入图片描述

用docker 创建4节点的集群,每个节点两个挂载点。共8个挂载点。

1 准备yaml文件:

Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ cat docker-compose.yaml
version: '3.7'

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:
    image: minio/minio:RELEASE.2020-10-27T04-03-55Z
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:RELEASE.2020-10-27T04-03-55Z
    volumes:
      - data2-1:/data1
      - data2-2:/data2
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:RELEASE.2020-10-27T04-03-55Z
    volumes:
      - data3-1:/data1
      - data3-2:/data2
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:RELEASE.2020-10-27T04-03-55Z
    volumes:
      - data4-1:/data1
      - data4-2:/data2
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:


Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio

2 启动minio容器

Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ docker-compose up -d
Found orphan containers (minio_nginx_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing minio_minio1_1
Recreating f417a19c3491_minio_minio1_1 ... done
Recreating minio_minio3_1              ... done
Recreating minio_minio2_1              ... done
Recreating minio_minio4_1              ... done

Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio

3 查看容器状态

Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ docker container ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                            PORTS                    NAMES
24d62d1addba        minio/minio:RELEASE.2020-10-27T04-03-55Z   "/usr/bin/docker-ent鈥?   9 seconds ago       Up 7 seconds (health: starting)   0.0.0.0:9004->9000/tcp   minio_minio4_1
8a47cc4ce634        minio/minio:RELEASE.2020-10-27T04-03-55Z   "/usr/bin/docker-ent鈥?   9 seconds ago       Up 7 seconds (health: starting)   0.0.0.0:9002->9000/tcp   minio_minio2_1
631afe2b9c3d        minio/minio:RELEASE.2020-10-27T04-03-55Z   "/usr/bin/docker-ent鈥?   9 seconds ago       Up 7 seconds (health: starting)   0.0.0.0:9003->9000/tcp   minio_minio3_1
a32e5216c29b        minio/minio:RELEASE.2020-10-27T04-03-55Z   "/usr/bin/docker-ent鈥?   9 seconds ago       Up 7 seconds (health: starting)   0.0.0.0:9001->9000/tcp   minio_minio1_1

Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio

在浏览器输入登录地址:http://127.0.0.1:9000/minio/login

MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123

在这里插入图片描述

创建桶,桶名为group1,在桶下面创建文件夹20200807,上传文件到该文件夹。

在这里插入图片描述

上传一张图片到桶:

在这里插入图片描述

在这里插入图片描述

4.验证数据损坏恢复

4.1验证方案

数据块,指文件分割成N块后分别存储在不同硬盘的数据,在硬盘内的文件名为part.1,part.2…

  1. 4台服务8(N)个数据块,根据纠删码的原理,只要保证至少4(N/2)个硬盘的数据完整,文件就可以正常访问,且可以对损坏数据块进行恢复。
  2. 分别上传2个文件,一个文件用于验证损坏超过4个硬盘数据时文件能否正常访问,另一个文件用于验证坏不超过4个硬盘时,是否可以进行文件恢复。

4.2 验证损坏超过N/2个数据块

  1. 上传文件test.jpg。

  2. 进入docker容器中,删除5个( 5 > N/2 )数据块

    此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块

  3. 先删除容器2上面的data1、data2数据块

# 进入容器2
C:\Users\Administrator>docker exec -it minio_minio2_1 /bin/sh
/ # ls
CREDITS  data     data2    etc      lib      mnt      proc     run      srv      tmp      var
bin      data1    dev      home     media    opt      root     sbin     sys      usr
/ #

# 进入data1/group1/20200807/目录,删除数据块1上面的图片
/ # cd data1/group1/20200807/
/data1/group1/20200807 # ls
Sketchpad.png  cfg.json       test.jpg
/data1/group1/20200807 #

/data1/group1/20200807 # ls test.jpg/
d83cf1b6-be3a-4f7c-8533-1a31ff1e80d8  xl.meta
/data1/group1/20200807 # ls test.jpg/d83cf1b6-be3a-4f7c-8533-1a31ff1e80d8/
part.1
/data1/group1/20200807 #

/data1/group1/20200807 # rm -rf test.jpg/
/data1/group1/20200807 # ls
Sketchpad.png  cfg.json
/data1/group1/20200807 #

# 进入data2/group1/20200807/目录,删除数据块2上面的图片
/ # cd data2/group1/20200807/
/data2/group1/20200807 # ls
Sketchpad.png  cfg.json       test.jpg
/data2/group1/20200807 # rm -rf test.jpg/
/data2/group1/20200807 #

此时正常数据块6块,损坏数据块2块(上面删除的两块数据块),此时在web客户端查看刚才上传的test.jpg文件,是可以正常显示的。

在这里插入图片描述

  1. 依此类推,删除容器4所有的数据块,此时正常数据块4块,损坏数据块4块,再次访问test.jpg文件,仍然可以正常显示。
C:\Users\Administrator>docker exec -it minio_minio4_1 /bin/sh
/ # ls
CREDITS  data     data2    etc      lib      mnt      proc     run      srv      tmp      var
bin      data1    dev      home     media    opt      root     sbin     sys      usr
/ # rm -rf data1/
.minio.sys/  group1/
/ # rm -rf data1/group1/20200807/
Sketchpad.png/  cfg.json/       test.jpg/
/ # rm -rf data1/group1/20200807/test.jpg/
/ # rm -rf data2/group1/20200807/test.jpg/
/ # exit

C:\Users\Administrator>
  1. 再次删除9003节点的data1后,此时正常数据块3块,损坏数据块5块,再次访问test.jpg,发现文件已经不见了,说明当损坏超过N/2个数据块时,文件就无法访问。
C:\Users\Administrator>docker exec -it minio_minio3_1 /bin/sh
/ # ls
CREDITS  data     data2    etc      lib      mnt      proc     run      srv      tmp      var
bin      data1    dev      home     media    opt      root     sbin     sys      usr
/ # rm -rf data1/group1/20200807/test.jpg/
/ # rm -rf data1/group2/20200807/test.jpg/
/ # exit

C:\Users\Administrator>

验证损坏不超过N/2个数据块,数据恢复

  1. 上传Sketchpad.png文件
  2. 按照上面的的步骤,删除4个数据块(容器3和容器4上面的数据块)
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # rm /data1/group1/20200807/
cfg.json/  test.jpg/
/ # rm /data1/group1/20200807/cfg.json/
rm: '/data1/group1/20200807/cfg.json' is a directory
/ # rm -rf /data1/group1/20200807/cfg.json/
/ # rm -rf /data2/group1/20200807/cfg.json/
/ # exit

C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ # rm -rf /data1/group1/20200807/cfg.json/
/ # rm -rf /data2/group1/20200807/cfg.json/
/ #
  1. 此时正常的数据块4块,损坏的数据块4块。
  2. 通过minio的heal命令,对损坏的文件进行恢复,同样基于容器进行操作,此处需要运行新的容器minio/mc,以下方案为恢复整个服务器的数据,也可以按bucket或者object进行恢复,此处不作演示,可自行查询官方文档
# 拉取mc的镜像
PS C:\Users\Administrator\Desktop\minio> docker pull minio/mc
# 运行mc容器
docker run -it --entrypoint=/bin/sh minio/mc
PS C:\Users\Administrator\Desktop\minio> docker run -it --entrypoint=/bin/sh minio/mc

# 设置mc客户端参数,使其可以连接到minio集群(其中:172.16.200.23是docker宿主机的ip地址)
/ # mc config host add minio2 http://172.16.200.23:9000 minio minio123 --api s3v4
Added `minio2` successfully.
/ # mc policy set public minio2/group1
Access permission for `minio2/group1` is set to `public`
/ # mc admin heal -r minio2
 ◓  group1/20200807/cfg.json
    1/1 objects; 653 B in 1s
    ┌────────┬───┬─────────────────────┐
    │ Green  │ 3 │ 100.0% ████████████ │
    │ Yellow │ 0 │   0.0%              │
    │ Red    │ 0 │   0.0%              │
    │ Grey   │ 0 │   0.0%              │
    └────────┴───┴─────────────────────┘
/ #

# 重新进入9001容器的data1/group1文件夹中,发现test2.jpg文件夹重新出现了,说明数据恢复成功。在最新版本的minio中,数据恢复是自动发现和触发修复的。

在这里插入图片描述

进度条显示,本次成功恢复了一个group1桶下面的20200807/cfg.json对象,恢复进度为100%。恢复后的对象大小为653 Byte。

查看集群信息

查看桶和桶下面的目录

/ # mc ls minio2
[2020-10-28 03:58:55 UTC]     0B group1/
/ #
/ # mc tree minio2
minio2
└─ group1
   └─ 20200807
/ #
/ # mc admin info minio2
●  minio2:9000
   Uptime: 1 hour
   Version: 2020-10-27T04:03:55Z
   Network: 4/4 OK
   Drives: 2/2 OK

●  minio3:9000
   Uptime: 1 hour
   Version: 2020-10-27T04:03:55Z
   Network: 4/4 OK
   Drives: 2/2 OK

●  minio4:9000
   Uptime: 1 hour
   Version: 2020-10-27T04:03:55Z
   Network: 4/4 OK
   Drives: 2/2 OK

●  minio1:9000
   Uptime: 1 hour
   Version: 2020-10-27T04:03:55Z
   Network: 4/4 OK
   Drives: 2/2 OK

27 KiB Used, 1 Bucket, 2 Objects
8 drives online, 0 drives offline
/ #

大文件测试

生成大文件

/ # time dd if=/dev/zero of=/tmp/file bs=32M count=1024
1024+0 records in
1024+0 records out
real    0m 23.23s
user    0m 0.01s
sys     0m 23.14s
/ #

32GB数据上传测试

/bin/sh: ll: not found
/ # ls /tmp/file -lh
-rw-r--r--    1 root     root       32.0G Oct 28 09:40 /tmp/file
/ #
/ # time mc cp -r /tmp/file minio2/group1/ 

在这里插入图片描述

删除大文件

C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # rm -rf data1/group1/file
/ # rm -rf data2/group1/file/
/ # exit

C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ #
/ # ls data1/group1/
20200807  file
/ # ls data1/group1/file/
1003d24c-fcbe-4829-8804-2e52b7efe14d  xl.meta
/ # rm -rf data1/group1/
20200807/  file/
/ # rm -rf data1/group1/file
/ # rm -rf data2/group1/file
/ #

恢复大文件

/ # mc admin heal -r minio2 

在这里插入图片描述

进入容器查看大文件恢复情况:

C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # ls /data1/group1/ -lh
total 8K
drwxr-xr-x    4 root     root        4.0K Oct 28 09:28 20200807
drwxr-xr-x    3 root     root        4.0K Oct 28 11:11 file
/ #
/ # ls /data2/group1/ -lh
total 8K
drwxr-xr-x    4 root     root        4.0K Oct 28 09:28 20200807
drwxr-xr-x    3 root     root        4.0K Oct 28 11:11 file
/ #
/ # exit

C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ # ls /data1/group1/ -lh
total 8K
drwxr-xr-x    4 root     root        4.0K Oct 28 09:28 20200807
drwxr-xr-x    3 root     root        4.0K Oct 28 11:11 file
/ # ls /data2/group1/ -lh
total 8K
drwxr-xr-x    4 root     root        4.0K Oct 28 09:28 20200807
drwxr-xr-x    3 root     root        4.0K Oct 28 11:11 file
/ #

对比可见minio的数据恢复速度比较快:

32GB数据恢复时间是8min。32GB数据写入时间是32min。

minio是gluster团队把glusterfs卖给红帽后,新创建的项目。全部用golang实现,由gluster创始人主导minio的开发工作。

优点

  • 读写速度极快。MinIO号称是世界上速度最快的对象存储服务器。在标准硬件上,minio对象存储的读/写速度最高可以达到183 GB/s和171 GB/s。

minio有以下特点

  • 运维简单

  • 简洁易用,部署方便

  • 原生支持k8s docker

  • 支持纠删码,支持bit rot位保护(磁盘比特位衰减)

  • 支持scal out

  • 故障可以精确到对象,单个对象的恢复不影响其他对象

局限性

  • minio设计目标是amazon s3兼容的对象存储,目前版本不支持fuse mount,需要借助s3-fuse第三方工具挂载到系统目录。

  • 文档相对于ceph较少

  • 搭建集群后,不允许扩容。MinIO一旦集群搭建成功后,就不可以更改集群节点数。因为存在在MinIO的对象到底存储在哪个Set,是通过名字做Hash去找的,一旦节点数变了落点就错乱了。

  • 大集群最大节点数为32。MinIO实现了一个峰值锁叫DSync。它在节点数量少时,性能非常高;但节点数量过多时,性能就下降了。功能实现的最大节点就是32,所以导致MinIO单个集群的最大节点数也是32。官方回复是,他们十年做GlusterFS的经验看,一个超大的集群是难以维护的,尤其是宕机之后的恢复时间也特别长,所以他们在做MinIO的时候一个核心设计理念就是存储组件要变得简单可控,易于维护。进群容量问题,可以通过应用层来解决。

扩容方案

1、可同时向多个集群写入

2、当集群容量达到阈值,从写集群中剔除,变成只读

3、读取的时候,根据编码到文件名上的集群信息,从而路由到正确的集群。

MinIO本身提供一个叫联合模式的方式来组建集群,但是要额外引入其他依赖。可以考虑在LB层根据其请求里面的一些header信息做流量转发。

当配置多个集群的时候,可以先从配置中获取可用的集群,再从LB上根据请求的header信息,可控制向哪个集群写。当某个集群的容量达到阈值时,可以从配置中剔除该集群,把他变成只读集群。读取的时候把集群ID或信息码编码到文件名上去,这样可以通过解析文件名就能获取到对应的集群。

压测工具

采用 cosBench 工具做压测,cosBench是专门对对象存储做压测的工具。

参考文献:

minio集群搭建:

https://blog.csdn.net/kea_iv/article/details/108061337

minio中文文档:
http://docs.minio.org.cn/docs/master/minio-erasure-code-quickstart-guide

minio英文文档:
https://docs.minio.io/docs/minio-admin-complete-guide.html

  • 7
    点赞
  • 2
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值