Minio部署总结

官方介绍

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

MinIO可单点部署,可分布式集群部署,操作部署方便,可支持扩容,SDK和阿里OSS用起来差不多,刚好满足我的需求,唯一缺陷就是不支持动态扩容。

Docker单节点部署

首先拉取镜像,下载最新版镜像

docker pull minio/minio

启动容器,启动端口为 9000 “-v /mnt/data:/data”,指定宿主机指向容器的存储地址,上传的文件存在这里,“server /data” 启动的命令,指定容器内部存储地址为/data

docker run -p 9000:9000 --name minio1 \
 --restart=always \
 --net=host \
  -e MINIO_ACCESS_KEY=minioadmin \
   -e MINIO_SECRET_KEY=minioadmin \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data


启动成功后浏览器访问 http://{ip}:9000,登录需要accessKey和secretKey,docker容器启动默认都是 “minioadmin” ,启动后会显示

Linux单节点二进制方式部署

下载

mkdir /home/minio/{app,config,data,logs} -p
cd /home/minio/app
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio

创建数据目录

mkdir /minio_data

启动脚本

min_server_start.sh

chmod 755 min_server_single.sh

#!/bin/bash
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/home/minio/app	
nohup ${MINIO_HOME}/minio server /minio_data  --address :9000 --console-address :8000 > ${MINIO_HOME}/minio.log 2>&1 &

启动脚本

bash min_server_single.sh

 启动成功后浏览器访问 http://{ip}:9000,登录需要accessKey和secretKey,分别是脚本中的admin/12345678

Linux分布式部署

官方介绍:分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

分布式Minio优势

数据保护
分布式Minio采用 纠删码来防范多个节点宕机和位衰减 bit rot 。
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。

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

准备环境

192.168.10.159 minio-2
192.168.10.153 minio-1

每个节点4个硬盘

注意:必须是四个硬盘,且硬盘是空数据,否则会报错。

#创建挂载点
mkdir /mnt/mongo1
mkdir /mnt/mongo2
mkdir /mnt/mongo3
mkdir /mnt/mongo4
#分区
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
fdisk /dev/sdf
#格式化
mkfs.ext4 /dev/sdc1
mkfs.ext4 /dev/sdd1
mkfs.ext4 /dev/sde1
mkfs.ext4 /dev/sdf1
#加载
mount /dev/sdc1 /mnt/mongo2/
mount /dev/sdd1 /mnt/mongo3/
mount /dev/sde1 /mnt/mongo4/
mount /dev/sdf1 /mnt/mongo1/
#写入系统配置
echo "/dev/sdc1 /mnt/mongo2 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sdd1 /mnt/mongo3 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sde1 /mnt/mongo4 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sdf1 /mnt/mongo1 ext4 defaults 0 0" >> /etc/fstab

df -h

 确保时钟同步

​​​​​​Centos服务器设置时间自动同步_centos 时间同步_驯龙高手_追风的博客-CSDN博客

配置脚本

注意:在这里跳过不可扩展的部署方式和伪分布式的部署方式。

先启动在minio-1单节点集群(后面需要尝试集群扩容)

minio_cluster.sh

chmod 755 minio_cluster.sh

#!/bin/bash
  
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/home/minio/app
nohup ${MINIO_HOME}/minio server --address :9000 --console-address :8000  \
        http://minio-1/mnt/mongo{1...4} > ${MINIO_HOME}/minio.log 2>&1 &

启动集群

bash chmod 755 minio_cluster.sh

验证

集群扩容方式

对等扩容

首先,MinIO的极简设计理念使得MinIO分布式集群并不支持向集群中添加单个节点并进行自动调节的扩容方式,这是因为加入单个节点后所引发的数据均衡以及纠删组划分等问题会为整个集群带来复杂的调度和处理过程,并不利于维护。因此,MinIO提供了一种对等扩容的方式,即要求增加的节点数和磁盘数均需与原集群保持对等。

说明: 添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余SLA
例如,第一个区有8个磁盘,您可以将集群扩展为16个、32个或1024个磁盘的区域,只需确保部署的SLA是原始区域的倍数即可。

minio-1节点的启动脚本添加配置

扩容方式,在原命令最后一行末尾添加扩容的节点,重启集群.

#!/bin/bash
  
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/home/minio/app
nohup ${MINIO_HOME}/minio server --address :9000 --console-address :8000  \
        http://minio-1/mnt/mongo{1...4} http://minio-2/mnt/mongo{1...4} > ${MINIO_HOME}/minio.log 2>&1 &

同步启动脚本

将启动脚本同步到minio-2节点,然后两个节点启动服务。

验证

联邦扩容

MinIO官方提供了另一种扩容机制——联邦扩容,即通过引入etcd,将多个MinIO分布式集群在逻辑上组成一个联邦,对外以一个整体提供服务,并提供统一的命名空间。MinIO联邦集群的架构如图3-1所示。

 联邦扩容优缺点

相较于对等扩容,联邦扩容的优点在于:①联邦中的各集群不要求节点数和磁盘数的对等;②联邦可以无限扩展,不断加入新集群;③若联邦中某个集群出现故障,该故障将不影响联邦中的其他集群提供服务。其缺点为需要额外引入etcd,且配置过程较为复杂。

经过验证,联邦方式的集群有一个缺陷,集群A满了以后,只能扩容集群A,否则A相关的bucket无法新增。扩容集群B无效

安装etcd

安装位置:192.168.10.153

yum install -y etcd

vi /etc/etcd/etcd.conf

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:3380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:3379"

#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="etcd_minio"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.153:3380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.153:3379"

#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"
 

确保 etcd 已经成功安装。你可以使用以下命令来检查 etcd 的安装状态:

rpm -qa | grep etcd

如果输出中显示了 etcd 的版本信息,则表示 etcd 已经安装。

启动 etcd 服务。使用以下命令来启动 etcd:

systemctl start etcd


这会启动 etcd 服务,并开始运行。

验证 etcd 服务是否已成功启动。可以使用以下命令来检查 etcd 服务的运行状态:

systemctl status etcd

如果输出中显示 active (running),则表示 etcd 服务已成功启动。

集群1启动脚本

minio_cluster.sh

#!/bin/bash
  
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/home/minio/app

export MINIO_ETCD_ENDPOINTS="http://192.168.10.153:3379"
export MINIO_PUBLIC_IPS=192.168.10.153
export MINIO_DOMAIN=bo.test.com


nohup ${MINIO_HOME}/minio server --address :9000 --console-address :8000  \
        http://minio-1/mnt/mongo{1...4} > ${MINIO_HOME}/minio.log 2>&1 &

集群2启动脚本

minio_cluster.sh

#!/bin/bash
  
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/home/minio/app

export MINIO_ETCD_ENDPOINTS="http://192.168.10.153:3379"
export MINIO_PUBLIC_IPS=192.168.10.159
export MINIO_DOMAIN=bo.test.com

nohup ${MINIO_HOME}/minio server --address :9000 --console-address :8000  \
        http://minio-2/mnt/mongo{1...4} > ${MINIO_HOME}/minio.log 2>&1 &

配置解释

MINIO_ETCD_ENDPOINTS参数需与搭建的ETCD集群所有节点IP相对应;

MINIO_PUBLIC_IPS参数则为该集群的所有节点IP;

MINIO_DOMAIN参数必须进行配置,即使你并不通过域名访问存储桶,否则联邦无法生效,只有MINIO_DOMAIN参数值相同的集群,才会组成联盟。

验证

在A集群中创建一个Bucket,如果在B集群中马上能看到,则说明集群搭建成功。

docker部署对等扩容

需求场景

原始的集群部署方式最少需要4个空硬盘,资源要求比较多,有时候资源有限的情况下,需要一个能够扩展存储资源的集群,可以用docker的方式部署。

docker安装的minio集群,可以使用文件夹代替磁盘,原生安装minio集群数据目录必须使用空的整块磁盘。
集群版本也使用的纠删码维护数据,保证了数据备份(虽然只是在文件夹中),单机版本不会使用纠删码。
生产环境建议还是使用一个数据目录一块磁盘。

服务器列表

192.168.10.159,192.168.10.160

注意点

1、网络一定使用--net-host模式,实验过映射模式,不可用。猜测是因为使用映射模式时,往集群上报每个节点的身份的时候,得到的IP是内部容器的IP,与后面参数上的数据地址IP不一致。

2、如果数据需要持久化,需要把数据目录和配置文件目录映射到宿主机

3、服务端口和控制台端口是可以自定义的使用--address,--console-address参数

4、所有磁盘的份数,建议是2的n次方,大于等于4
 

构建Dockerfile

FROM centos:centos7.9.2009
wget https://dl.min.io/server/minio/release/linux-amd64/minio
WORKDIR /opt
RUN  chmod +x minio
ENTRYPOINT ["./minio"]
CMD ["server", "--address :9000","--console-address :9999","http://10.22.1.27/data{1...4}"]

如果minio文件已经下载,可以用

FROM centos:centos7.9.2009
COPY ./minio /opt/
WORKDIR /opt
RUN  chmod +x minio
ENTRYPOINT ["./minio"]
CMD ["server", "--address :9000","--console-address :9999","http://10.22.1.27/data{1...4}"]

build构建镜像

sudo docker build -t myminio .

启动脚本

docker run   --name minio1   \
    --restart=always \
    --net=host \
    -e MINIO_ACCESS_KEY=minioadmin \
    -e MINIO_SECRET_KEY=minioadmin \
    -v /data1:/data1 \
    -v /data2:/data2 \
	-v /data3:/data3 \
    -v /data4:/data4 \
    myminio server \
    --address :29000 \
    --console-address :29001  \
    http://192.168.10.159/data{1...4} http://192.168.10.160/data{1...4}

注意:

1.上面之所以 wget获取minio文件而不用默认的minio/minio镜像,实验发现用minio/minio镜像用{}这种语法会报错,所以直接使用最新的二进制文件。

2.有时候如果初始化的映射目录已经存在,可能会启动报错,最保险的做法是确保目录不存在,让docker启动时候自动创建。

提供一种反向的扩容思路

先尽可能挂载更多的目录,等到数据目录快满的时候,将一部分数据目录mv到新的空硬盘中,删除容器,修改启动脚本中的挂载路径重启。如果挂载32个目录,就有5次扩容机会,如果是16个目录,就有5次扩容机会。如果8个目录,就有4次扩容机会。最后如果实在没有mv目录的扩容机会了,可以新增机器节点。

例如,先挂载16个目录

docker run   --name minio1  -d \
    --restart=always \
    --net=host \
    -e MINIO_ACCESS_KEY=minioadmin \
    -e MINIO_SECRET_KEY=minioadmin \
    -v /mnt/mongo1/data1:/data1 \
    -v /mnt/mongo1/data2:/data2 \
	-v /mnt/mongo1/data3:/data3 \
    -v /mnt/mongo1/data4:/data4 \
	-v /mnt/mongo1/data5:/data5 \
    -v /mnt/mongo1/data6:/data6 \
	-v /mnt/mongo1/data7:/data7 \
    -v /mnt/mongo1/data8:/data8 \
	-v /mnt/mongo1/data9:/data9 \
    -v /mnt/mongo1/data10:/data10 \
	-v /mnt/mongo1/data11:/data11 \
    -v /mnt/mongo1/data12:/data12 \
	-v /mnt/mongo1/data13:/data13 \
    -v /mnt/mongo1/data14:/data14 \
	-v /mnt/mongo1/data15:/data15 \
    -v /mnt/mongo1/data16:/data16 \
    myminio server  \
    --address :29000 \
    --console-address :29001  \
    http://192.168.10.159:29000/data{1...16}

当/mnt/mongo1所在硬盘快满了时候,将9-16移动到新的硬盘中

mv /mnt/mongo1/data9 /total_min/
mv /mnt/mongo1/data10 /total_min/
mv /mnt/mongo1/data11 /total_min/
mv /mnt/mongo1/data12 /total_min/
mv /mnt/mongo1/data13 /total_min/
mv /mnt/mongo1/data14 /total_min/
mv /mnt/mongo1/data15 /total_min/
mv /mnt/mongo1/data16 /total_min/

删除容器,修改启动脚本,重启容器,这样就启到了扩容效果,实验验证有效。

docker run   --name minio1  -d \
    --restart=always \
    --net=host \
    -e MINIO_ACCESS_KEY=minioadmin \
    -e MINIO_SECRET_KEY=minioadmin \
    -v /mnt/mongo1/data1:/data1 \
    -v /mnt/mongo1/data2:/data2 \
	-v /mnt/mongo1/data3:/data3 \
    -v /mnt/mongo1/data4:/data4 \
	-v /mnt/mongo1/data5:/data5 \
    -v /mnt/mongo1/data6:/data6 \
	-v /mnt/mongo1/data7:/data7 \
    -v /mnt/mongo1/data8:/data8 \
	-v /total_min/data9:/data9 \
    -v /total_min/data10:/data10 \
	-v /total_min/data11:/data11 \
    -v /total_min/data12:/data12 \
	-v /total_min/data13:/data13 \
    -v /total_min/data14:/data14 \
	-v /total_min/data15:/data15 \
    -v /total_min/data16:/data16 \
    myminio server  \
    --address :29000 \
    --console-address :29001  \
    http://192.168.10.159:29000/data{1...16}

也可以不删除容器,移动文件后,用ln创建文件链接指向原来位置

 ln -s /mnt/mongo2/data9 /mnt/mongo1/data9
 ln -s /mnt/mongo2/data10 /mnt/mongo1/data10
 ln -s /mnt/mongo2/data11 /mnt/mongo1/data11
 ln -s /mnt/mongo2/data12 /mnt/mongo1/data12
 ln -s /mnt/mongo2/data13 /mnt/mongo1/data13
 ln -s /mnt/mongo2/data14 /mnt/mongo1/data14
 ln -s /mnt/mongo2/data15 /mnt/mongo1/data15
 ln -s /mnt/mongo2/data16 /mnt/mongo1/data16

如图所示,就可以不用改版docker启动命令,重启容器。

测试硬盘占用,这个是个很实用的命令

fallocate -l 8G /mnt/mongo1/test2.zip

来源

Minio 分布式集群部署_51CTO博客_分布式集群部署

Minio 分布式集群部署_51CTO博客_分布式集群部署

minio 集群、扩容_minio集群_leoppeng的博客-CSDN博客

MinIO部署,以及扩容

 漫谈 MinIO 集群扩容方法

基于docker 的 minio 联邦扩容 (ETCD)2023最新_minio扩容_qq_38343011的博客-CSDN博客

 etcd+minio联邦扩容方案_minio etcd_18岁的许嵩的博客-CSDN博客

docker-安装minio集群_docker部署minio集群_别浪呀的博客-CSDN博客

minio之集群安装docker版_docker minio 集群 最佳_神云瑟瑟的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/csdncjh/article/details/131754563
今日推荐