第13章 Docker应用实战-Docker部署MinIO
作者:王珂
邮箱:[email protected]
文章目录
前言
本节介绍如何在docker中快速搭建MinIO环境,包含部署单节点MinIO、MinIO纠删码集群、MinIO分布式集群。以上环境部署都是在CentOS7操作系统下进行,如果您使用的是Windows操作系统,尚未具备CentOS环境,可以选择在Windows中安装虚拟机Vmware,然后在Vmware中安装CentOS操作系统,具体步骤请查看我的另一篇教程《第1章 Docker应用实战-基础环境准备》进行安装。
Minio优点
-
部署简单:一个single二进制文件即是一切,还可支持各种平台;
-
minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;
-
低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠制码集合(Erasure Coding set)中的dlsk数量)。并且这种损坏恢复是基于单个对象的而不是基于整个存储卷的;
-
读写性能优异;
一、环境准备
需要提前安装好docker, docker-compose。
软件 | 版本 | 说明 |
---|---|---|
Linux | CentOS7 | |
Docker | 24.0.1 | Docker社区版 |
MinIO | 2021.09.24 |
二、部署MinIO
2.1 部署单节点MinIO
通过docker命令部署
- 创建目录
我们规划将minio安装在/opt/mini-2021.09.24目录下,首先创建目录
mkdir -p /opt/minio-2021.09.24/{data,config}
创建完成的目录结构如下:
minio-2021.09.24/
├── config # 存放配置文件
└── data # 存放数据文件
- 执行docker命令创建容器
docker run --name minio-2021.09.24 -d \
-p 9000:9000 \
-p 9001:9001 \
--restart=always \
--privileged=true \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123" \
-v /opt/minio/minio-2021.09.24/data:/data \
-v /opt/minio/minio-2021.09.24/config:/root/.minio minio/minio:latest \
server --console-address ':9001' /data
说明:–console-address ‘:9001’ 指定了控制台的端口
高版本配置用户名密码用MINIO_ROOT_USER, MINIO_ROOT_PASSWORD
通过docker-compose部署
dokcer-compose.yaml 待验证
version: "3"
services:
minio-2021.09.24
container_name: minio-2021.09.24
image: minio:latest
ports:
- "9000:9000"
- "9001:9001"
volumes:
- "./config:/root/.minio"
- "./data:/data"
environment:
- MINIO_ACCESS_KEY=admin
- MINIO_SECRET_KEY=admin
restart: always
command: ['server' '--console-address' ':9001' '/data']
2.2 部署纠删码MinIO
当为minio server传入多个本地磁盘参数时,minio server会自动启用纠删码模式。纠删码模式要求磁盘个数为偶数,单机模式要求4个磁盘。
- 创建目录
mkdir -p /opt/docker-compose/minio-2021.09.24/{config,data1,data2,data3,data4}
创建完成的目录结构如下:
minio-2021.09.24/
├── config # 存放配置文件
├── data1 # 存放数据文件
├── data2 # 存放数据文件
├── data3 # 存放数据文件
└── data4 # 存放数据文件
- 执行docker-compose命令
在minio-2021.09.24/目录下创建文件docker-compose.yaml
version: "3"
services:
minio-2021.09.24
container_name: minio-2021.09.24
image: minio:latest
ports:
- "9000:9000"
- "9001:9001"
volumes:
- "./config:/root/.minio"
- "./data1:/data1"
- "./data2:/data2"
- "./data3:/data3"
- "./data4:/data4"
environment:
- MINIO_ACCESS_KEY=admin
- MINIO_SECRET_KEY=admin
restart: always
command: ['server' '--console-address' ':9001' '/data{1...8}']
进入到目录minio-2021.09.24/,执行命令
docker-compose up -d
2.3 部署分布式MinIO
分布式MinIO可以让你将多块磁盘(甚至在不同机器上)组成一个存储服务。由于磁盘分布在不同的服务器上,因此避免了单点故障。
-
数据保护
分布式MinIO至少需要4个磁盘,使分布式MinIO自动引入纠删码功能。
-
高可用
如果是一个有N块硬盘的分布式MinIO,只要有N/2块硬盘在线,数据就是安全的。不过你需要至少N/2+1个硬盘来创建你的对象。
例如:16个节点的MinIO集群,每个节点1块硬盘,就算有8台服务器宕机,这个集群仍然是可读的,不过需要9台服务器才能写数据。
一致性
在单机模式、分布式模式,所有读操作都严格遵守“read-after-write”一致性模型。
运行分布式MinIO
启动一个分布式MinIO,只需要把硬盘位置做为参数传给minio server命令即可。然后需要在其它节点运行相同的命令。
-
分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立连接。为了实现这个,你需要在执行minioserver命令之前,先将access秘钥和secret秘钥export成环境变量。新版本使用MINIO_ROOT_USER和MINIO ROOT PASSWORD。
-
分布式MinIO使用的磁盘里必须是干净的,里面没有数据。
-
分布式MinIO里的时间差不能超过3秒。可以使用NTP来保证时间一致。
示例:
MinIO分布式集群有8个节点,每个节点1块磁盘。在8个节点上都运行如下命令:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=123456
minio server --address :900? --console-address :5000? \
http://192.168.1.11/export1 http://192.168.1.11/export2 \
http://192.168.1.13/export3 http://192.168.1.14/export4 \
http://192.168.1.15/export5 http://192.168.1.16/export6 \
http://192.168.1.17/export7 http://192.168.1.18/export8
请将?号替换成每个节点的序号
MinIO分布式集群有4个节点,每个节点4块磁盘。在4个节点上都运行如下命令:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=123456
minio server --address :900? --console-address :5000? \
http://192.168.1.11/export11 http://192.168.1.11/export12 \
http://192.168.1.11/export13 http://192.168.1.11/export14 \
http://192.168.1.12/export21 http://192.168.1.12/export22 \
http://192.168.1.12/export23 http://192.168.1.12/export24 \
http://192.168.1.13/export31 http://192.168.1.11/export32 \
http://192.168.1.13/export33 http://192.168.1.11/export34 \
http://192.168.1.14/export41 http://192.168.1.12/export42 \
http://192.168.1.14/export43 http://192.168.1.12/export44
请将?号替换成每个节点序号
脚本写法
export MINTO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/opt/minio-2021.09.24
MINIO_HOST=192.168.1.11
for i in {01..04}; do
nohup ${MINI0_HOME}/minio server --address ":90${i}" --console-address ":500${i}" http://${MINIO_HOST}:9001/mnt/data01 http://${MINIO_HOST}:9002/mnt/data02 http://${MINIO_HOST}:9003/mnt/data03 http://${MINIO_HOST}:9004/mnt/data04 > ${MINIO_HOME}/minio-90${i}.log 2>&1 &
done
统一入口
可以在前端添加Nginx负载均衡器做为统一入口
upstream minio {
server 192.168.1.11:9001;
server 192.168.1.11:9002;
server 192.168.1.11:9003;
server 192.168.1.11:9004:
}
upstream console {
ip hash;
server 192.168.1.12:50001;
server 192.168.1.12:50002;
server 192.168.1.12:50003:
server 192.168.1.12:50004;
}
server {
listen 9000;
listen [::]:9000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be upload
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Defauit is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
server {
listen 50000;
listen [::]:50000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be upload
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set header X-Forwarded-Proto $scheme;
proxy_set_header X-Nginx-Proxy true;
proxy_connect_timeout 300;
# Defauit is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://console;
}
}
三、MinIO命令
-
ls
-
mb 创建一个存储桶或文件
-
cat
-
pipe
-
share
-
cp
-
mirror
-
find
-
diff
-
rm
-
events
-
watch
-
policy
-
config
-
update
-
version
总结
本章介绍了在CentOS操作系统下通过docker命令和docker-compose部署minio,前提是安装好docker和docker-compose。minio文件保存在本地磁盘,首先在本地创建好文件存放目录,通过docker, docker-compose部署minio时注意挂在对应目录,然后执行对应命令即可。