MinIO 介绍
MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。
MinIO 英文官网 MinIO 中文官网 注意:中文官方更新不及时,会有很多坑,请以英文官网为准。
基础概念
1、Object:存储到minio的基本对象,如文件,字节流,Anything。。。。
2、Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是互相隔离的。对于客户端而言,就相当于存放文件的顶层文件夹。
3、Drlve:存储数据的磁盘,在MinIO启动时,以参数的方式传入。MinIO中所有的对象数据都会存在Drive里。
4、Set:即一组 Drive的集合,分布式部署根据集群规模自动划分一个或者多个Set,每个Set中的Drive 分布在不同位置。一个对象存储在一个Set上。
4.1、一个对象存储在一个Set上。
4.2、一个集群划分为多个Set。
4.3、一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出。
4.4、一个Set中的drive 尽可能分布在不同的节点上。
5、纠删码:Minio 使用纠删码机制来保证高可靠性。
5.1、使用highwayhash来处理数据损坏(Bit Rot Protectio)。关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原。
5.2、纠删码是恢复丢失和算怀数据的数学算法,minio采用reed-solomincode将对象拆分成N/2数据和N/2奇偶校验块。这就意味着如果是12块盘,一个对象会被分成6个数据快、6个奇偶校验块,你可以丢失任意6块盘(不管其存放的是数据块还是奇偶校验块),你任可以从剩下的盘中的数据进行恢复。
5.2、纠删码模式,把数据分成 DATA BLOCk:数据块、 PARITY BLOCK:校验块。一个BLOCK 10M左右,如果一个文件小于10M,就以文件大小进行分块。如果一个文件大于10m,就以10M为一个文件单位进行分块。
应用场景
1、互联网非结构化数据的存储需求
1.1 、电商网站:海量商品图片
2.1、视频网站:海量视频文件
3.1、网盘:海量文件
MinIO优势
1、数据保护
1.1、分布式MInio采用纠删码来放反多个节点待机和位衰减 bit rot
1.2、分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
2、高可用
2.1、单机Minio服务存在单点故障,相反,如果是有一个N快硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
2.2、例如,一个16节点的Minio集群,每个节点16块块硬盘,计算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服务器才能写入数据。
3、一致性
3.1、Minio在分布式和单机模式下,所有读写炒作都严格遵守read-after-write 一致性模型
MinIO 使用
【服务端】单机模式
下载
# 二进制文件下载赋权
# 官方镜像站点
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 国内镜像站点 -P 参数指定保存路径
wget -P /usr/local/bin/ http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x /usr/local/bin/minio
# MinIO中国站点:http://www.minio.org.cn
# MinIO中国镜像站:http://dl.minio.org.cn
linux部署
# 修改用户名密码:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=minio123456
# 启动:
minio server --console-address ":9090" ./miniodata/data
# 后台启动,指定日志路径:
nohup minio server --console-address :"9090" ./miniodata/data >./miniodata/minio.log 2>&1 &
# minio停止
ps -ef |grep minio|grep -v grep|awk '{print $2}'|xargs kill -9
# ps:接口默认地址:9000
# 指定console端口:9090
docker部署
# docker run
docker run \
-p 9000:9000 \
-p 9001:9001 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minio123456" \
quay.io/minio/minio server /data --console-address ":9001"
# docker 后端运行
docker run -it -d \
-p 9000:9000 \
-p 9001:9001 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minio123456" \
-v /app/miniodata/docker/data:/data \
quay.io/minio/minio server /data --console-address ":9001"
# ps:接口默认地址:9000
# 指定console端口:9001
docker-compose部署
# minio/docker-compose.yml
version: '3'
services:
minio-server:
container_name: minio-server
image: quay.io/minio/minio:latest
restart: always
build:
context: ./
ports:
- '9000:9000'
- '9001:9001'
expose:
- "8000"
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=minio123456
volumes:
- /app/miniodata/docker/data:/data
command: server /data --console-address ":9001"
Kubernetes部署
下载 yaml文件
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O
文件内容
# Deploys a new Namespace for the MinIO Pod
apiVersion: v1
kind: Namespace
metadata:
name: minio-dev # Change this value if you want a different namespace name
labels:
name: minio-dev # Change this value to match metadata.name
---
# Deploys a new MinIO Pod into the metadata.namespace Kubernetes namespace
#
# The `spec.containers[0].args` contains the command run on the pod
# The `/data` directory corresponds to the `spec.containers[0].volumeMounts[0].mountPath`
# That mount path corresponds to a Kubernetes HostPath which binds `/data` to a local drive or volume on the worker node where the pod runs
#
apiVersion: v1
kind: Pod
metadata:
labels:
app: minio
name: minio
namespace: minio-dev # Change this value to match the namespace metadata.name
spec:
containers:
- name: minio
image: quay.io/minio/minio:latest
command:
- /bin/bash
- -c
args:
- minio server /data --console-address :9090
volumeMounts:
# 修改数据挂载路径
- mountPath: /data
name: localvolume # Corresponds to the `spec.volumes` Persistent Volume
nodeSelector:
kubernetes.io/hostname: kubealpha.local # Specify a node label associated to the Worker Node on which you want to deploy the pod.
volumes:
- name: localvolume
hostPath: # MinIO generally recommends using locally-attached volumes
# 主机数据文件目录
path: /app/miniodata/docker/data # Specify a path to a local drive or volume on the Kubernetes worker node
type: DirectoryOrCreate # The path to the last directory must exist
多节点部署(集群部署:服务化部署 + nginx)
环境
ip | 数据盘 挂载目录 | 内核版本(minio内部版本要求4.x.x) | minio版本 |
192.168.192.40 | /dev/sdb /data1 /dev/sdc /data2 | 4.19.90 | minio version RELEASE.2023-05-18T00-05-36Z (commit-id=9d96b18df03f5978873705ac55959161f018fb48) |
192.168.192.50 | /dev/sdb /data1 /dev/sdc /data2 | 4.19.90 | minio version RELEASE.2023-05-18T00-05-36Z (commit-id=9d96b18df03f5978873705ac55959161f018fb48) |
目录准备(两节点都执行)
# 数据目录
mkdir /data1
mkdir /data2
mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc
mount /dev/sdb /data1
mount /dev/sdc /data2
# 二进制及配置目录
mkdir -p /app/minio/{run,etc} && mkdir -p /app/etc/minio
下载二进制文件(两节点都执行)
# 国内镜像下载 -P 指定下载保存目录
wget -P /app/minio/run/minio http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x /app/minio/run/minio
创建启动脚本文件(两节点都执行)
vi /app/minio/run/run.sh
#Minio默认9000端口,在配置文件中加入–address “127.0.0.1:9029” 可更改端口
#注意 :
#MINIO_ROOT_USER:用户名,长度最小是5个字符
#MINIO_ROOT_PASSWORD:密码,密码不能设置过于简单,不然minio会启动失败,长度最小是8个字符
#–config-dir:指定集群配置文件目录
# !/bin/bash
# 配置内容如下
# 修改用户名密码:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=minio123456
# 启动服务
/app/minio/run/minio server --config-dir /etc/minio --address ":9000" --console-address ":9001" http://192.168.192.40/data1 \
http://192.168.192.40/data2 \
http://192.168.192.50/data1 \
http://192.168.192.50/data2 >>/app/minio/minio_server.log
创建停止脚本文件(两节点都执行)
cat <<EOF > /app/minio/run/stop.sh
#!/bin/bash
#MinIO停止脚本
ps -ef | grep minio | grep -v 'grep' | awk '{print $2}'| xargs kill -9
if $? != 0;then
echo "minio service stop failed."
exit 1
fi
EOF
创建Minio.server(两节点都执行)
cat <<EOF > /etc/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/app/minio/run/
ExecStart=/app/minio/run/run.sh
ExecStop=/app/minio/run/stop.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
权限修改(两节点都执行)
chmod +x /etc/systemd/system/minio.service && chmod +x /app/minio/run/minio && chmod +x /app/minio/run/run.sh && chmod +x /app/minio/run/stop.sh
启动集群(两节点都执行)
systemctl daemon-reload
systemctl start minio
systemctl enable minio
systemctl status minio.service
systemctl status minio
● minio.service - Minio service
Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-05-26 13:54:11 CST; 9min ago
Docs: https://docs.minio.io/
Main PID: 778169 (run.sh)
Tasks: 12
Memory: 118.1M
CGroup: /system.slice/minio.service
├─778169 /bin/bash /app/minio/run/run.sh
└─778174 /app/minio/run/minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://192.168.192.40/data1 http://192.168.192.40/data2 http://192.168.192.50/data1 http://192.168.>
May 26 13:54:11 ctyunos-master systemd[1]: minio.service: Failed with result 'signal'.
May 26 13:54:11 ctyunos-master systemd[1]: Stopped Minio service.
May 26 13:54:11 ctyunos-master systemd[1]: Started Minio service.
使用 nginx 负载均衡(选择节点都执行)
可以在其中一台部署好nginx,也可以单独一台做nginx。
我这里选择在192.168.192.40配置nginx。
主要是 upstream 及 proxy_pass 的配置。
# nginx安装
yum install nginx
# /etc/nginx/nginx.conf
http{
......
upstream minio_console {
server 192.168.192.40:9001 max_fails=3 fail_timeout=5s;
server 192.168.192.50:9001 max_fails=3 fail_timeout=5s;
}
upstream minio_api {
server 192.168.192.40:9000 max_fails=3 fail_timeout=5s;
server 192.168.192.50:9000 max_fails=3 fail_timeout=5s;
}
server {
listen 8080;
# listen 443 ssl; # 没有ssl证书,不做配置
# server_name cons.minio.com; # 不需要域名时
# ssl_certificate keys/cons/server.crt; # 没有ssl证书,不做配置
# ssl_certificate_key keys/cons/server.key; # 没有ssl证书,不做配置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 1G; #如果上传文件大于1G,就需要更改这个参数
client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 60s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;
location / {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_console;
expires 0;
}
}
server {
listen 80;
# listen 443 ssl; # 没有ssl证书,不做配置
# server_name api.minio.com; # 不需要域名时
# ssl_certificate keys/cons/server.crt; # 没有ssl证书,不做配置
# ssl_certificate_key keys/cons/server.key; # 没有ssl证书,不做配置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 1G;
client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 60s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;
location / {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_api;
expires 0;
}
}
......
}
# 重启nginx
systemctl restart nginx
或
# /etc/nginx/nginx.conf
http{
......
upstream minio{
server 192.168.192.40:9001;
server 192.168.192.50:9001;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://minio;
proxy_set_header Host $http_host;
#client_max_body_size 1000m;
}
}
......
}
验证
访问
http://192.168.192.40:8080/login
或