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