当前位置: 代码迷 >> 综合 >> 【MinIO】MinIO分布式部署
  详细解决方案

【MinIO】MinIO分布式部署

热度:22   发布时间:2023-10-28 21:58:43.0

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.shRestart=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:latesthostname: minio1volumes:- minio1-data:/exportports:- "9001:9000"networks:- minio_distributeddeploy:restart_policy:delay: 10smax_attempts: 10window: 60splacement:constraints:- node.labels.minio1==truecommand: server http://minio{1...4}/exportsecrets:- secret_key- access_keyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3minio2:image: minio/minio:latesthostname: minio2volumes:- minio2-data:/exportports:- "9002:9000"networks:- minio_distributeddeploy:restart_policy:delay: 10smax_attempts: 10window: 60splacement:constraints:- node.labels.minio2==truecommand: server http://minio{1...4}/exportsecrets:- secret_key- access_keyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3minio3:image: minio/minio:latesthostname: minio3volumes:- minio3-data:/exportports:- "9003:9000"networks:- minio_distributeddeploy:restart_policy:delay: 10smax_attempts: 10window: 60splacement:constraints:- node.labels.minio3==truecommand: server http://minio{1...4}/exportsecrets:- secret_key- access_keyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3minio4:image: minio/minio:latesthostname: minio4volumes:- minio4-data:/exportports:- "9004:9000"networks:- minio_distributeddeploy:restart_policy:delay: 10smax_attempts: 10window: 60splacement:constraints:- node.labels.minio4==truecommand: server http://minio{1...4}/exportsecrets:- secret_key- access_keyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3volumes:minio1-data:minio2-data:minio3-data:minio4-data:networks:minio_distributed:driver: overlaysecrets:secret_key:external: trueaccess_key:external: true

Docker Swarm启动集群MinIO

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