赞
踩
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等
MinIO可单点部署,可分布式集群部署,操作部署方便,可支持扩容,SDK和阿里OSS用起来差不多,刚好满足我的需求,唯一缺陷就是不支持动态扩容。
首先拉取镜像,下载最新版镜像
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” ,启动后会显示
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
touch min_server_single.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
官方介绍:分布式Minio至少需要4个硬盘,使用分布式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
注意:必须是四个硬盘,且硬盘是空数据,否则会报错。
- #创建挂载点
- 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是原始区域的倍数即可。
扩容方式,在原命令最后一行末尾添加扩容的节点,重启集群.
- #!/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无效。
安装位置: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 服务已成功启动。
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 &
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集群中马上能看到,则说明集群搭建成功。
原始的集群部署方式最少需要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
- 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}"]
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 集群、扩容_minio集群_leoppeng的博客-CSDN博客
基于docker 的 minio 联邦扩容 (ETCD)2023最新_minio扩容_qq_38343011的博客-CSDN博客
etcd+minio联邦扩容方案_minio etcd_18岁的许嵩的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。