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虚拟机添加新的磁盘
按照如下截图,进行添加新磁盘。
下面添加磁盘的磁盘名称保持默认即可。
添加完磁盘之后,启动虚拟机,就可以看到这个新的磁盘了。
[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
磁盘添加成功,但这里不进行其他操作了,比如格式化、挂载操作,将来根据需要我们再进行后续的操作。
单机多磁盘部署
# 查看存储信息
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接口以进行统一访问。
根据minio的架构设计,至少需要4个节点来构建集群,这是因为在一个具有N个节点的分布式minio集群中,只要有N/2
个节点在线,数据就是安全的。同时,为了确保能够创建新的对象,需要至少N/2+1
个节点在线,因此,对于一个具有4个节点的集群,即使有两个节点宕机了,此时的集群数据完备,且仍然是可读的。但需要有3个节点才能写数据。
所以,我们想要搭建minio的分布式集群环境,要准备4台linux机器,后续还要进行配置nginx的负载均衡,所以又需要一台虚拟机,所以本次一共需要5台linux服务器。
minio集群部署
环境
我这里以VMware来创建5个linux虚拟机。
win11家庭版
vmware workstation pro 16
4台centos7.9虚拟机,硬件2核4G 用于组成minio集群
1台centos7.9虚拟机,硬件2核4G 用于做nginx代理
4台linux虚拟机都需要添加新的磁盘格式化并进行挂载
四个linux虚拟机要做的命令是一样的。
# ---------- 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集群的各节点间为对等关系,连接至任一节点均可实现对集群的访问。所以你现在可以通过访问各个节点来查看集群的状态:
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作为代理转发和负载均衡。
# 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;
}
}
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的管理后台了。