minio集群介绍
本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用性和可扩展性,是所有生产工作负载的推荐拓扑。
MNMD 部署支持纠删码配置,该配置可以容忍部署中最多一半的节点或驱动器丢失,同时继续提供读取操作服务。
集群部署要求
- 官方推荐的最小配置是4台服务器,每台服务器4个盘,这样可以做到minio高可用。
- 建议使用单独的分区作为minio的数据存储目录,不能使用根分区的目录作为minio的数据存储目录,但可以每个节点仅一块独立磁盘创建4个常规目录。
- MinIO 不支持分布式部署的非连续主机名或 IP 地址。可以在每个节点上使用 /etc/hosts 来设置支持扩展表示法的简单 DNS 方案。
- 多节点系统必须保持时间和日期同步,以维持稳定的节点间操作和交互。
ubuntu部署minio集群
节点规划及磁盘规划如下:
节点名称 | 节点IP | minio磁盘 | 挂载点 | 操作系统 |
---|---|---|---|---|
minio1.example.com | 192.168.72.51 | /dev/sdb /dev/sdc /dev/sdd /dev/sde | /var/lib/minio/data1 /var/lib/minio/data2 /var/lib/minio/data3 /var/lib/minio/data4 | Ubuntu22.04 |
minio2.example.com | 192.168.72.52 | /dev/sdb /dev/sdc /dev/sdd /dev/sde | /var/lib/minio/data1 /var/lib/minio/data2 /var/lib/minio/data3 /var/lib/minio/data4 | Ubuntu22.04 |
minio3.example.com | 192.168.72.53 | /dev/sdb /dev/sdc /dev/sdd /dev/sde | /var/lib/minio/data1 /var/lib/minio/data2 /var/lib/minio/data3 /var/lib/minio/data4 | Ubuntu22.04 |
minio4.example.com | 192.168.72.54 | /dev/sdb /dev/sdc /dev/sdd /dev/sde | /var/lib/minio/data1 /var/lib/minio/data2 /var/lib/minio/data3 /var/lib/minio/data4 | Ubuntu22.04 |
lb1.example.com | 192.168.72.55 | - | - | Ubuntu22.04 |
lb2.example.com | 192.168.72.56 | - | - | Ubuntu22.04 |
VIP | 192.168.72.100 | - | - | - |
该部署方案创建一个服务器池,其中包含 4 个 minio server 节点,每个节点有 4 个驱动器,总共 16 个驱动器。
其他说明:VIP地址解析到minio.example.com
域名,作为统一入口。
- minio API访问地址为:
http://minio.example.com
- minio console访问地址为:
http://minio.example.com/minio/ui
集群架构如下:
准备节点
所有minio节点分别配置主机名
hostnamectl set-hostname minio1.example.com
hostnamectl set-hostname minio2.example.com
hostnamectl set-hostname minio3.example.com
hostnamectl set-hostname minio4.example.com
所有minio节点分别配置hosts解析
cat >/etc/hosts<<EOF
192.168.72.51 minio1.example.com
192.168.72.52 minio2.example.com
192.168.72.53 minio3.example.com
192.168.72.54 minio4.example.com
EOF
所有minio节点配置时间同步。
Minio 多节点系统必须保持时间和日期同步,以维持稳定的节点间操作和交互。
apt install -y chrony
systemctl enable --now chrony
timedatectl set-timezone Asia/Shanghai
准备磁盘
每个节点挂载4块磁盘,其中sda为系统盘:
root@minio1:~# lsblk -d -n -o NAME | grep '^sd'
sda
sdb
sdc
sdd
sde
在每个节点上,分别创建四个目录来挂载四个驱动器:
sudo mkdir -p /var/lib/minio/data1
sudo mkdir -p /var/lib/minio/data2
sudo mkdir -p /var/lib/minio/data3
sudo mkdir -p /var/lib/minio/data4
分别在每个节点上,将磁盘格式化为 XFS 文件系统:
sudo mkfs.xfs /dev/sdb -L DISK1
sudo mkfs.xfs /dev/sdc -L DISK2
sudo mkfs.xfs /dev/sdd -L DISK3
sudo mkfs.xfs /dev/sde -L DISK4
配置自动挂载
cat >>/etc/fstab<<EOF
LABEL=DISK1 /var/lib/minio/data1 xfs defaults,noatime 0 2
LABEL=DISK2 /var/lib/minio/data2 xfs defaults,noatime 0 2
LABEL=DISK3 /var/lib/minio/data3 xfs defaults,noatime 0 2
LABEL=DISK4 /var/lib/minio/data4 xfs defaults,noatime 0 2
EOF
挂载所有在 /etc/fstab
文件中已定义但尚未挂载的文件系统
sudo mount -av
确认文件系统挂载正常
root@minio1:~# df -hT
......
/dev/sdb xfs 100G 746M 100G 1% /var/lib/minio/data1
/dev/sdc xfs 100G 746M 100G 1% /var/lib/minio/data2
/dev/sdd xfs 100G 746M 100G 1% /var/lib/minio/data3
/dev/sde xfs 100G 746M 100G 1% /var/lib/minio/data4
安装minio
分别在每个minio节点上操作,所有节点配置及操作相同。
使用deb包安装 MinIO
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240704142545.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
使用 groupadd
和 useradd
命令创建用户和组
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown -R minio-user:minio-user /var/lib/minio
创建服务环境文件
在 /etc/default/minio
创建环境文件。 MinIO 服务使用此文件作为 MinIO 和 minio.service
文件使用的所有环境变量的源。
cat >/etc/default/minio<<EOF
MINIO_VOLUMES="http://minio{1...4}.example.com:9000/var/lib/minio/data{1...4}/minio"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=Minio@123456
MINIO_BROWSER_REDIRECT_URL="http://minio.example.com/minio/ui"
EOF
在部署中的每个节点上发出以下命令以启动 MinIO 服务,需要多个节点依次同时执行
sudo systemctl restart minio.service
使用以下命令确认服务在线且正常运行:
sudo systemctl status minio.service
journalctl -f -u minio.service
打开MinIO控制台
打开浏览器并访问端口 :9001
处的任何 MinIO 主机名以打开 MinIO 控制台登录页面。例如
http://minio1.example.com:9001
使用上一步中的 minio_root_user
和 minio_root_password
登录。
可以使用 MinIO 控制台执行一般管理任务,例如身份和访问管理、指标和日志监控或服务器配置。每个 MinIO 服务器都包含其自己的嵌入式 MinIO 控制台。
配置负载均衡
官方文档:https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
使用nginx
和keepalived
实现负载均衡,准备2台服务器作为负载均衡节点。
分别在lb节点配置主机名
hostnamectl set-hostname lb1.example.com
hostnamectl set-hostname lb2.example.com
分别在lb节点配置hosts解析
cat >/etc/hosts<<EOF
192.168.72.55 lb1.example.com
192.168.72.56 lb2.example.com
192.168.72.51 minio1.example.com
192.168.72.52 minio2.example.com
192.168.72.53 minio3.example.com
192.168.72.54 minio4.example.com
EOF
在2个节点安装nginx和keepalived:
apt install -y nginx keepalived
创建nginx配置文件,修改server地址并自定义listen端口,注意修改server_name
参数:
cat > /etc/nginx/conf.d/minio-lb.conf <<'EOF'
upstream minio_s3 {
least_conn;
server minio1.example.com:9000;
server minio2.example.com:9000;
server minio3.example.com:9000;
server minio4.example.com:9000;
}
upstream minio_console {
least_conn;
server minio1.example.com:9001;
server minio2.example.com:9001;
server minio3.example.com:9001;
server minio4.example.com:9001;
}
server {
listen 80;
listen [::]:80;
server_name minio.example.com;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
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;
# Default 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 https://minio_s3; # This uses the upstream directive definition to load balance
}
location /minio/ui/ {
rewrite ^/minio/ui/(.*) /$1 break;
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;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websockets in MinIO versions released after January 2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Some environments may encounter CORS errors (Kubernetes + Nginx Ingress)
# Uncomment the following line to set the Origin request to an empty string
# proxy_set_header Origin '';
chunked_transfer_encoding off;
proxy_pass https://minio_console; # This uses the upstream directive definition to load balance
}
}
EOF
启动nginx服务
systemctl restart nginx
创建keepalived配置文件,根据实际环境修改interface
及virtual_ipaddress
参数,2个节点配置相同:
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id minio
vrrp_version 2
vrrp_garp_master_delay 1
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
timeout 3
interval 3 # check every 1 second
fall 2 # require 2 failures for KO
rise 2 # require 2 successes for OK
}
vrrp_instance lb-minio {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.72.100
}
track_script {
chk_nginx
}
}
EOF
启动keepalvied服务
systemctl restart keepalived
查看生成的VIP地址
root@lb1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:9a:92:75 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.72.55/24 brd 192.168.72.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.72.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe9a:9275/64 scope link
valid_lft forever preferred_lft forever
测试连接
在需要访问minio的机器上,配置hosts解析
echo "192.168.72.100 minio.example.com" >>/etc/hosts
浏览器访问minio console
http://minio.example.com/minio/ui/
查看Metrics信息:
任意机器安装minio客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/
配置minio客户端
mc alias set myminio http://minio.example.com minioadmin Minio@123456
通过API接口,查看集群状态
root@ubuntu:~# mc admin info myminio
● minio1.example.com:9000
Uptime: 25 minutes
Version: 2024-07-04T14:25:45Z
Network: 4/4 OK
Drives: 4/4 OK
Pool: 1
● minio2.example.com:9000
Uptime: 25 minutes
Version: 2024-07-04T14:25:45Z
Network: 4/4 OK
Drives: 4/4 OK
Pool: 1
● minio3.example.com:9000
Uptime: 25 minutes
Version: 2024-07-04T14:25:45Z
Network: 4/4 OK
Drives: 4/4 OK
Pool: 1
● minio4.example.com:9000
Uptime: 25 minutes
Version: 2024-07-04T14:25:45Z
Network: 4/4 OK
Drives: 4/4 OK
Pool: 1
Pools:
1st, Erasure sets: 1, Drives per erasure set: 16
16 drives online, 0 drives offline
root@ubuntu:~#
查看集群的拓扑状态
root@ubuntu:~# mc admin decommission status myminio
┌─────┬──────────────────────────────────────────────────────────────────────┬────────────────────────┬────────┐
│ ID │ Pools │ Drives Usage │ Status │
│ 1st │ http://minio{1...4}.example.com:9000/var/lib/minio/data{1...4}/minio │ 12.7% (total: 1.2 TiB) │ Active │
└─────┴──────────────────────────────────────────────────────────────────────┴────────────────────────┴────────┘