docker搭建minio集群环境

1.简介

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

​ Minio使用纠删码erasure code来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。

2.基础环境

  1. centos 7
  2. Docker version 1.13.1
  3. docker-compose version 1.18.0

MinIO集群环境基于docker和docker-compose环境搭建。通过在一台机器中运行4个MinIO容器,来模拟4*2(每个容器2个data卷,表示每台MinIO服务有两个硬盘)个硬盘的集群环境,请提前安装好基础环境,以便后续操作。

3.安装步骤

3.1创建docker-compose文件

  1. 新建文件夹minio,在文件夹中新建文件docker-compose.yaml
  2. 在minio的github仓库中,复制官方的docker-compose.yaml文件的内容,并粘贴到新建的docker-compose.yaml文件中。
  3. yaml中定义有4个service,代表4个minio服务,每个服务下有两个存储卷,代表2个硬盘
#docker-compose.yaml
version: '3.7'

# starts 4 docker containers running minio server instances. Each
# minio server's web interface will be accessible on the host at port
# 9001 through 9004.
services:
  minio1:
    image: minio/minio:RELEASE.2020-08-08T04-50-06Z
    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-08-08T04-50-06Z
    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-08-08T04-50-06Z
    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-08-08T04-50-06Z
    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:

3.2创建MinIO集群

  1. 在minio文件夹下,执行docker-compose命令,创建集群环境
docker-compose up -d
  1. 启动成功后,可以查看docker当前运行的容器,有4个minio容器,端口分别为9001,9002,9003,9004
[root@kea minio]# docker container ls -a
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                  PORTS                                                                                        NAMES
ec4c7b471e79        minio/minio:RELEASE.2020-08-07T01-23-07Z   "/usr/bin/docker-e..."   18 hours ago        Up 18 hours (healthy)   0.0.0.0:9001->9000/tcp                                                                       minio_minio1_1
86151ac2eb51        minio/minio:RELEASE.2020-08-07T01-23-07Z   "/usr/bin/docker-e..."   18 hours ago        Up 18 hours (healthy)   0.0.0.0:9003->9000/tcp                                                                       minio_minio3_1
f14181da9a8d        minio/minio:RELEASE.2020-08-07T01-23-07Z   "/usr/bin/docker-e..."   18 hours ago        Up 18 hours (healthy)   0.0.0.0:9004->9000/tcp                                                                       minio_minio4_1
cee91b485a20        minio/minio:RELEASE.2020-08-07T01-23-07Z   "/usr/bin/docker-e..."   18 hours ago        Up 18 hours (healthy)   0.0.0.0:9002->9000/tcp                                                                       minio_minio2_1

创建的时候可能会提示错误,是因为版本不匹配,只需要把yaml文件的版本改成匹配的版本即可。此处改成 version: ‘3.3’

========================================================

ERROR: Version in “./docker-compose.yaml” is unsupported. You might be seeing this error because you’re using the wrong Compose file version. Either specify a supported version (e.g “2.2” or “3.3”) and place your service definitions under the services key, or omit the version key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

3.3测试文件上传下载

  1. 访问localhost:9001(9002/9003/9004同理),可以看到MinIO的登录界面,输入minio/minio123进行登录,access_key和access_secret可以在前面的yaml文件中找到

  2. 第一次进来,需要先创建一个bucket
    在这里插入图片描述

  3. 此处创建一个名叫group1的bucket,并在group1中再创建一个20200807的文件夹。

  4. 进入20200807文件夹中,点击上传文件,选择本地的文件test.jpg文件进行上传。
    在这里插入图片描述

  5. 上传成功后,可在线预览、下载、分享、删除等操作,通过链接分享,可以指定链接的有效时长,默认5天,最长7天,超过有效期链接就失效。
    在这里插入图片描述

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 )数据块

    此处删除9001两个数据块,9002两个数据块,9003一个数据块

  3. 先删除9001节点的data1数据块

# 进入9001节点容器
docker exec -it minio_minio1_1 /bin/sh
# 进入data1文件夹,删除test.jpg文件夹
cd data1/group1
rm -rf test.jpg/
  1. 此时正常数据块7块,损坏数据块1块,此时查看刚才上传的test.jpg文件,是可以正常显示的。
    在这里插入图片描述

  2. 依此类推,删除9001和9002所有的数据块,此时正常数据块4块,损坏数据块4块,再次访问test.jpg文件,仍然可以正常显示。

  3. 再次删除9003节点的data1后,此时正常数据块3块,损坏数据块5块,再次访问test.jpg,发现文件已经不见了,说明当损坏超过N/2个数据块时,文件就无法访问。
    在这里插入图片描述

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

  1. 上传text2.jpg文件

  2. 按照4.2的步骤,删除4个数据块(9001和9002)
    在这里插入图片描述

  3. 此时正常的数据块4块,损坏的数据块4块。

  4. 通过minio的heal命令,对损坏的文件进行恢复,同样基于容器进行操作,此处需要运行新的容器minio/mc,以下方案为恢复整个服务器的数据,也可以按bucket或者object进行恢复,此处不作演示,可自行查询官方文档。官方链接

# 拉取mc的镜像
docker pull minio/mc
# 运行mc容器
docker run -it --entrypoint=/bin/sh minio/mc
# 对需要恢复数据的节点设置别名,此处以9001节点为例
# mc alias set minio1 http://IP:PORT ACCESS_KEY SECRET_KEY
mc alias set minio1 http://localhost:9001 minio minio123
# 设置成功后,提示
Added `minio1` successfully.
# 执行数据恢复命令,恢复minio1节点的数据块
mc admin heal -r minio1
# 恢复成功后,会显示
 ?  group1/test2.jpg
    1/1 objects; 53 KiB in 1s
    ┌────────┬───┬─────────────────────┐
    │ Green  │ 3 │ 100.0% ???????????? │
    │ Yellow │ 0 │   0.0%              │
    │ Red    │ 0 │   0.0%              │
    │ Grey   │ 0 │   0.0%              │
    └────────┴───┴─────────────────────┘
# 重新进入9001容器的data1/group1文件夹中,发现test2.jpg文件夹重新出现了,说明数据恢复成功

在这里插入图片描述
在这里插入图片描述

  1. 所有需要数据恢复的节点,按照上述步骤执行后,正常数据块恢复到8块,损坏数据块为0块,此时继续访问该文件,显示正常。
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值