MinIO分布式部署

MinIO简介

MinIO是一款高性能的分布式对象存储服务器,专为大规模私有云基础框架而设计。

MinIO是一个分布式对象存储服务器,Amazon S3兼容,用Go编写,在Apache License Version 2.0 下开源。

MinIO为加密数据提供机密性,完整性和真实性保证,而性能开销可忽略不计。使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密对象使用AEAD服务器端加密进行防篡改。

分布式MinIO特点

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

分布式Minio好处

在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

分布式注意事项
  • 分布式MinIO使用的磁盘必须是干净的,里面没有数据。

  • 分布式MinIO里所有节点需要同样的access密钥和secret密钥,这样这些节点才能建立连接,为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。

  • 分布式MinIO里的节点时间差不能超过3秒,可以使用NTP来保证时间一致。

  • 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。

数据保护
  • 分布式Minio采用 erasure code 来防范多个节点宕机和位衰减 bit rot。

  • 分布式Minio至少需要4个节点,使用分布式Minio自动引入了纠删码功能。

高可用

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

例如,一个8节点的Minio集群,每个节点一块盘,就算4个节点宕机,这个集群仍然是可读的,不过你需要5个节点才能写数据

限制

分布式Minio单租户存在最少4个盘最多16个盘的限制(受限于纠删码)。这种限制确保了Minio的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例

注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用2个节点,每个节点4块盘,也可以使用4个节点,每个节点两块盘,诸如此类

一致性

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

MinIO分布式部署

操作系统:CentOS7

机器资源:

192.168.0.100

192.168.0.101

192.168.0.102

192.168.0.103

基于服务器本地

拉取二进制Minio
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
创建相关目录(所有节点)

创建数据存储目录

mkdir -p /minio/{data1,data2}

创建启动脚本目录

mkdir -p /opt/minio

创建集群配置文件目录

mkdir -p /etc/minio
编写集群启动脚本(所有节点配置文件相同)
vim /opt/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456

/opt/minio/minio server --config-dir /etc/minio \
http://192.168.0.100/minio/data1 http://192.168.0.100/minio/data2 \
http://192.168.0.101/minio/data1 http://192.168.0.101/minio/data2 \
http://192.168.0.102/minio/data1 http://192.168.0.102/minio/data2 \
http://192.168.0.103/minio/data1 http://192.168.0.103/minio/data2 \

其中,“MINIO_ACCESS_KEY”为用户名,“MINIO_SECRET_KEY”为密码,密码不能设置过于简单,不然minio会启动失败,“–config-dir”指定集群配置文件目录

编写服务启动脚本(所有节点)
vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

其中,“WorkingDirectory”为启动脚本目录,“ExecStart”为指定集群启动脚本

chmod +x /usr/lib/systemd/system/minio.service
启动测试

将minio上传到 /opt/minio 目录下并赋予权限

chmod +x minio

赋予启动文件权限

chmod +x /opt/minio/run.sh

启动

systemctl daemon-reload
systemctl start minio
systemctl enable minio
测试

浏览器输入集群任意节点地址+9000端口,即可访问minio,用户名密码为前面设置的“MINIO_ACCESS_KEY”和“MINIO_SECRET_KEY”,可创建“bucket”并上传文件测试

基于Docker Swarm(仍处在测试阶段)

在Manager节点(192.168.0.100)上创建一个swarm

docker swarm init --advertise-addr 192.168.0.100

通过Docker swarm返回的信息,使用其他服务器添加Worker节点

为MinIO创建Docker secret(或通过环境变量的方式进行配置)

echo "Minoi" | docker secret create access_key -
echo "Test123456" | docker secret create secret_key -
docker node update --label-add minio1=true kb1
docker node update --label-add minio2=true kb2
docker node update --label-add minio3=true kb3
docker node update --label-add minio4=true kb4

在Manager节点中新建Docker Swarm配置文件docekr-compose-secrets.yaml,内容如下

version: '3.7'

services:
  minio1:
    image: minio/minio:latest
    hostname: minio1
    volumes:
      - minio1-data:/export
    ports:
      - "9001:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio1==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:latest
    hostname: minio2
    volumes:
      - minio2-data:/export
    ports:
      - "9002:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio2==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:latest
    hostname: minio3
    volumes:
      - minio3-data:/export
    ports:
      - "9003:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio3==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:latest
    hostname: minio4
    volumes:
      - minio4-data:/export
    ports:
      - "9004:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio4==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

volumes:
  minio1-data:

  minio2-data:

  minio3-data:

  minio4-data:

networks:
  minio_distributed:
    driver: overlay

secrets:
  secret_key:
    external: true
  access_key:
    external: true

Docker Swarm启动集群MinIO

docker stack deploy --compose-file=docker-compose-secrets.yaml minio_stack
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐