Skip to content

before

不建议在Windows上部署

摘自:https://minio.org.cn/docs/minio/windows/index.html

由于NTFS的行为和限制,MinIO不建议在Windows主机上进行多节点多硬盘的部署。

使用 Linux主机配置 或者 Kubernetes配置 去部署适用于生产环境的MinIO分布式集群.

对于初期开发和评估,推荐使用基于Windows的MinIO部署。对于长期开发和生产环境,MinIO强烈推荐使用Linux(RHEL,Ubuntu)系统。

MinIO支持非EOL的Windows版本(Windows 10,Windows Server 2016+)。

VMware虚拟机添加新的磁盘

按照如下截图,进行添加新磁盘。

1832669994366795776.png

下面添加磁盘的磁盘名称保持默认即可。

1832669994773643264.png

添加完磁盘之后,启动虚拟机,就可以看到这个新的磁盘了。

bash
[root@cs ~]# lsblk -p
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
/dev/sda                      8:0    0   20G  0 disk 
├─/dev/sda1                   8:1    0  200M  0 part /boot
└─/dev/sda2                   8:2    0 19.8G  0 part 
  ├─/dev/mapper/centos-root 253:0    0 18.8G  0 lvm  /
  └─/dev/mapper/centos-swap 253:1    0    1G  0 lvm  [SWAP]
/dev/sdb                      8:16   0   65M  0 disk         # 这个就是新添加的磁盘,暂无挂载点
/dev/sr0                     11:0    1  4.2G  0 rom

磁盘添加成功,但这里不进行其他操作了,比如格式化、挂载操作,将来根据需要我们再进行后续的操作。

单机多磁盘部署

bash
# 查看存储信息
lsblk -p

# 添加磁盘格式化为xfx
mkfs.xfs /dev/sdb

# 将磁盘挂在到minio的存储目录
mount /dev/sdb /opt/minio/data

# 查看存储信息
lsblk -p

# 前台启动
/opt/minio/minio server --console-address ":9001" /opt/minio/data/db{1...12}

# 后台启动
nohup /opt/minio/minio server --console-address ":9001" /opt/minio/data/db{1...12} > /opt/minio/minio.log 2>&1 &

解释:

  • 无论前台启动还是后台启动,内部都会触发纠删码模式,也就是存储的文件将会被算法分散到个各个磁盘(目录)中。
  • nohup是unix命令,用于后台运行指定的命令,并且会忽略挂起(HUP)信号,即将来你关闭终端窗口或者退出终端,这个命令也会继续运行。
  • > /opt/minio/minio.log将minio产生的各种日志信息(stdout)重定向到log文件中。
  • 2>&1是将标准的错误输出(stderr)重定向到标准输出中,也就是将来错误的还是正常的日志都会写入到同一个log文件(/opt/minio/minio.log)中。
  • &符号是在命令的末尾,用于将minio运行命令放到后台执行,这样命令执行后,不会阻塞终端,你可以干其他的事情。

分布式集群部署

部署架构

MinIO分布式集群是指在多个服务器节点均部署MinIO服务,并将其组建为分布式存储集群,对外提供标准S3接口以进行统一访问。

1832669995436343296.png

根据minio的架构设计,至少需要4个节点来构建集群,这是因为在一个具有N个节点的分布式minio集群中,只要有N/2个节点在线,数据就是安全的。同时,为了确保能够创建新的对象,需要至少N/2+1个节点在线,因此,对于一个具有4个节点的集群,即使有两个节点宕机了,此时的集群数据完备,且仍然是可读的。但需要有3个节点才能写数据。

所以,我们想要搭建minio的分布式集群环境,要准备4台linux机器,后续还要进行配置nginx的负载均衡,所以又需要一台虚拟机,所以本次一共需要5台linux服务器。

minio集群部署

环境

我这里以VMware来创建5个linux虚拟机。

bash
win11家庭版
vmware workstation pro 16
4台centos7.9虚拟机,硬件2核4G 用于组成minio集群
1台centos7.9虚拟机,硬件2核4G 用于做nginx代理

4台linux虚拟机都需要添加新的磁盘格式化并进行挂载

四个linux虚拟机要做的命令是一样的。

bash
# ---------- VMware为4台虚拟机添加新磁盘 ----------
# 步骤前面文章有提到,这里略

# ---------- 关闭防火墙 ----------
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

# ---------- 修改时区并同步时间 ----------
yum install -y ntpdate
timedatectl set-timezone Asia/Shanghai
/usr/sbin/ntpdate -u ntp.aliyun.com

# ---------- 创建目录 ----------
# 将来各节点的minio程序、脚本、数据文件、日志都会存放到/opt/minio/data目录下
mkdir -p /opt/minio/data/db{1,2,3,4}
ls /opt/minio/data

# ---------- 添加新磁盘、格式化磁盘并进行挂载 ----------
# 添加磁盘,参考本篇博客的VMware虚拟机添加新磁盘部分进行操作,这里默认你已经添加好了
lsblk -p
mkfs.xfs /dev/sdb
mount /dev/sdb /opt/minio/data

# ---------- 安装minio软件 ----------
/opt/minio/
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod 755 /opt/minio/minio

# 启动运行测试,运行没问题就ctrl+c结束minio服务
/opt/minio/minio server /opt/minio/data --console-address ":9001" --address ":9000"

# ---------- 编写关于集群的配置脚本 ----------
cat >/opt/minio/start.sh <<\EOF
#!/bin/bash

# 设置所有的节点的账号密码,密码要复杂的,八位(含)以上的复杂密码,否则集群启动失败
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin!1234

# 如果之前有进程在运行就杀掉
pid=$(ps -ef | grep minio | grep -v grep | wc -l)
if [ $pid -eq 1 ]; then ps -ef | grep minio | grep -v grep | awk '{print $2}' | xargs kill -9 2> /dev/null; fi

# 启动集群,各节点配置都一样
nohup /opt/minio/minio server --config-dir /etc/minio --console-address ":9001" --address ":9000" \
http://192.168.11.150/opt/minio/data/db1 http://192.168.11.150/opt/minio/data/db2 \
http://192.168.11.150/opt/minio/data/db3 http://192.168.11.150/opt/minio/data/db4 \
http://192.168.11.151/opt/minio/data/db1 http://192.168.11.151/opt/minio/data/db2 \
http://192.168.11.151/opt/minio/data/db3 http://192.168.11.151/opt/minio/data/db4 \
http://192.168.11.152/opt/minio/data/db1 http://192.168.11.152/opt/minio/data/db2 \
http://192.168.11.152/opt/minio/data/db3 http://192.168.11.152/opt/minio/data/db4 \
http://192.168.11.153/opt/minio/data/db1 http://192.168.11.153/opt/minio/data/db2 \
http://192.168.11.153/opt/minio/data/db3 http://192.168.11.153/opt/minio/data/db4 \
> /opt/minio/minio.log 2>&1 &
EOF
cat /opt/minio/start.sh
chmod 755 /opt/minio/start.sh

# ---------- 制作systemctl启动脚本 ----------
cat >/usr/lib/systemd/system/minio.service<<\EOF

[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
Type=forking
User=root
Group=root
ProtectProc=invisible
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/start.sh
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload

# ---------- 制作systemctl启动脚本 ----------
# 当4台linux服务器都走到这一步时,就可以启动各自节点, 然后测试连接了
systemctl daemon-reload
systemctl enable minio
systemctl stop minio
systemctl start minio
systemctl status minio
tail -f /opt/minio/minio.log

# 集群启动成功,观察日志
Waiting for the first server to format the drives (elapsed 13s)

Waiting for the first server to format the drives (elapsed 14s)

Waiting for all MinIO sub-systems to be initialize...
Configured max API requests per node based on available memory: 63
All MinIO sub-systems initialized successfully in 16.870263ms
MinIO Object Storage Server
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2024-05-10T01-41-38Z (go1.22.3 linux/amd64)

API: http://192.168.11.152:9000  http://127.0.0.1:9000 
WebUI: http://192.168.11.152:9001 http://127.0.0.1:9001   

Docs: https://min.io/docs/minio/linux/index.html
Use `mc admin info` to look for latest server/drive info
 Status:         12 Online, 4 Offline. 
STARTUP WARNINGS:
- Detected Linux kernel version older than 4.0.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x.x linux kernel version for best performance

MinIO集群的各节点间为对等关系,连接至任一节点均可实现对集群的访问。所以你现在可以通过访问各个节点来查看集群的状态:

bash
http://192.168.11.150:9001
http://192.168.11.151:9001
http://192.168.11.152:9001
http://192.168.11.153:9001

当然了,这么访问有点傻,所以,我们通常会再搭配一个nginx,我们直接访问nginx,然后请求由nginx来进行负载均衡,将请求转发给某个节点处理。

PS:web管理页面的操作,具有一定的延时性,比如在页面中创建一个存储桶,然后上传一个文件之后,你立即点击Monitoring进行查看集群状态,它要有稍微的等一会儿才能同步出来我们之前添加的存储桶和对象。

nginx负载均衡搭建

是时候启用db05节点了,这个节点不负责具体的业务处理,只有nginx作为代理转发和负载均衡。

bash
# nginx我就不在赘述了,默认你这个大佬是都懂linux和nginx这些的
yum update -y
yum -y install gcc gcc-c++ pcre pcre-devel  zlib zlib-devel openssl openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel perl-devel  perl-ExtUtils-Embed

cd /opt
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
mkdir -p /opt/nginx
cd /opt/nginx-1.24.0
./configure --prefix=/opt/nginx \
    --with-threads \
    --with-file-aio \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_xslt_module=dynamic \
    --with-http_image_filter_module=dynamic \
    --with-http_geoip_module=dynamic \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_auth_request_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_degradation_module \
    --with-http_slice_module \
    --with-http_stub_status_module \
    --with-stream=dynamic \
    --with-stream_ssl_module \
    --with-stream_realip_module \
    --with-stream_geoip_module=dynamic \
    --with-stream_ssl_preread_module \
    --with-compat  \
    --with-pcre-jit

cd /opt/nginx-1.24.0
make -j$(nproc) && make install -j$(nproc)

echo "export PATH=/opt/nginx/sbin:\$PATH" >> /etc/profile
cat /etc/profile
source /etc/profile

# 直接输入nginx来启动,但只能首次启动nginx使用,因为重复启动的话,会提示80端口已被占用
nginx

# 查看nginx相关进程
ps -ef | grep nginx

# 查看NGINX监听的端口
netstat -tunlp | grep nginx

# 平滑重启nginx,也就是重新读取nginx的配置文件,而不是重启进程
nginx -s reload

# 确认nginx配置文件是否争取的
nginx -t 
# 停止nginx, 杀死nginx进程
nginx -s stop

mkdir -p /opt/nginx/conf/conf.d
chmod -R 777 /opt/nginx/conf/conf.d

vim /opt/nginx/conf/nginx.conf

# 在http代码块中添加
http {
	include /opt/nginx/conf/conf.d/*.conf;
	map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}
bash
cat >/opt/nginx/conf/conf.d/minio.conf<<\EOF

upstream minioapi {
	server 192.168.11.150:9000;
	server 192.168.11.151:9000;
	server 192.168.11.152:9000;
	server 192.168.11.153:9000;
}
upstream miniowebui {
	server 192.168.11.150:9001;
	server 192.168.11.151:9001;
	server 192.168.11.152:9001;
	server 192.168.11.153:9001;
}

# webui管理后台直接监听80端口
server {
	listen 80;
	server_name localhost;
	ignore_invalid_headers 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;
        real_ip_header X-Real-IP;
		proxy_connect_timeout 300;
		proxy_set_header Server MinIO;
		proxy_set_header Accept-Ranges bytes;
		proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
		chunked_transfer_encoding off;
		proxy_pass http://miniowebui;
	}
}

# 80端口被占,api就只好另外监听其它端口了
server {
    listen 9000;
    server_name localhost;
    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_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;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
		proxy_pass http://minioapi;
	}
}

EOF
cat /opt/nginx/conf/conf.d/minio.conf
nginx -t
nginx -s reload

然后你就可以直接访问nginx所在的服务器IP来登录minio的管理后台了。