建置部署要點
- 強烈建議為新 Server Pool 的所有節點選擇基本上相似的硬體配置。確保硬體(CPU、記憶體、主機板、儲存適配器)和軟體(作業系統、核心設定、系統服務)在池中的所有節點上保持一致
- 如果一個伺服器池發生故障,MinIO 會停止所有池的 I/O,直到叢集恢復正常運作
- 如果是一個有 N 塊硬碟的分布式 Minio,只要有 N/2 硬碟在線,你的數據就是安全的,不過你需要至少有 N/2+1 個硬碟來創建新的對象
- MinIO 建議生產叢集一個Server Pool中至少包含4個 MinIO 伺服器節點,以確保適當的高可用性和持久性
- MinIO 建議直連的 JBOD 陣列,xfs 格式的磁碟以獲得最佳效能
- MinIO 建議使用 /etc/fstab 或類似的基於檔案的永久掛載配置
原理概要
MinIO 是一套相容於 AWS S3 API 的高性能分布式對象(Objects)存儲系統,可透過多台主機、多個硬碟(Drive)搭建起高可用性的存儲池,是目前替代 AWS S3 最佳的 Open Source 對象存儲本地解決方案。
MinIO 在數據保護部分採用了糾刪碼(Erasure Code)的方式,將一個存儲對象分散存放於叢集裡的數個 Drive 中(上圖橘色磁碟部分,這樣稱為一個 Set),如此一來只要叢集中有 N/2 的硬碟還在線,則數據可讀,只要 (N/2)+1 的硬碟還在線,則數據可讀可寫,比如上圖中共有4台 MinIO 伺服器、每台伺服器分別掛載了4顆硬碟,就算有2台伺服器突然斷電失聯,這個 MinIO 叢集的資料仍可讀,不過需要3台伺服器在線才能讀寫數據。
測試環境說明
安裝前準備
#!/bin/bash
# init.sh for minio installation
ROOT_FOLDER="/opt/minio"
mkdir -p ${ROOT_FOLDER}
mkdir -p ${ROOT_FOLDER}/data
mkdir -p ${ROOT_FOLDER}/data/export1
mkdir -p ${ROOT_FOLDER}/data/export2
mkdir -p ${ROOT_FOLDER}/data/export3
mkdir -p ${ROOT_FOLDER}/data/export4
# format
mkfs.xfs /dev/vdb -L DRIVE1
mkfs.xfs /dev/vdc -L DRIVE2
mkfs.xfs /dev/vdd -L DRIVE3
mkfs.xfs /dev/vde -L DRIVE4
# mount
mount /dev/vdb ${ROOT_FOLDER}/data/export1
mount /dev/vdc ${ROOT_FOLDER}/data/export2
mount /dev/vdd ${ROOT_FOLDER}/data/export3
mount /dev/vde ${ROOT_FOLDER}/data/export4
將掛載內容寫入每一台機器的 /etc/fstab
LABEL=DRIVE1 /opt/minio/data/export1 xfs defaults,noatime 0 2
LABEL=DRIVE2 /opt/minio/data/export2 xfs defaults,noatime 0 2
LABEL=DRIVE3 /opt/minio/data/export3 xfs defaults,noatime 0 2
LABEL=DRIVE4 /opt/minio/data/export4 xfs defaults,noatime 0 2
確保每一台機器有對齊時間(Almalinux9已內建,無需執行此步驟)
[root@host ~]# systemctl enable --now chronyd
Almalinux minimal 環境下在每一台機器上安裝基本需求套件
[root@host ~]# dnf install wget vim lrzsz nano net-tools -y
hostnamectl 設定三台主機的主機名稱並於三台機器上寫入每台機器的主機名稱(/etc/hosts )
192.168.88.81 minio1
192.168.88.53 minio2
192.168.88.79 minio3
防火牆配置(本例未來規劃使用 AWS SecurityGroup 管理防火牆故無需 Firewalld,若你是本地機器安裝僅需於 Firewalld 中開放 TCP9000、TCP9001)
[root@host ~]# systemctl disable firewalld
[root@host ~]# systemctl stop firewalld
三台主機配置作業系統 limits 並重啟電腦
[root@host ~]# vim /etc/security/limits.conf
* soft nofile 524288
* hard nofile 524288
[root@host ~]# vim /etc/systemd/system.conf
DefaultLimitNOFILE=524288:524288
[root@host ~]# vim /etc/systemd/user.conf
DefaultLimitNOFILE=524288:524288
[root@host ~]# reboot
安裝MinIO
在每一台機器上下載 minio 安裝檔案(本例指定2023-07到2023-08之間發布的版本)
[root@minio1 ~]# cd /opt/minio
[root@minio1 minio]# wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2023-07-21T21-12-44Z
[root@minio1 minio]# mv minio.RELEASE.2023-07-21T21-12-44Z minio
[root@minio1 minio]# chmod +x ./minio
[root@minio1 minio]# mv ./minio /usr/local/bin/
確認 minio 版本
[root@minio1 minio]# minio --help
替每一台機器編寫服務啟動腳本並預設開機啟動
[root@minio1 minio]# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
[root@minio1 minio]# chmod +x /usr/lib/systemd/system/minio.service
[root@minio1 minio]# systemctl enable minio
在每一台機器上製作環境變數設定檔(內含admin的登入帳密配置)
[root@minio1 minio]# vim /etc/default/minio
# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)
MINIO_VOLUMES="http://minio{1...3}:9000/opt/minio/data/export{1...4}/minio"
# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.
MINIO_OPTS="--console-address :9001"
# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.
MINIO_ROOT_USER=minioadmin
# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.
MINIO_ROOT_PASSWORD=minio-secret-keyXXXX
分別於三台機器上建立 minio 服務啟動所需的用戶群組
[root@minio1 minio]# groupadd -r minio-user
[root@minio1 minio]# useradd -M -r -g minio-user minio-user
[root@minio1 minio]# chown minio-user:minio-user \
/opt/minio/data/export1 /opt/minio/data/export2 \
/opt/minio/data/export3 /opt/minio/data/export4
分別於三台機器上啟動 minio 服務
[root@minio1 minio]# systemctl start minio
選擇任一台機器的 ip 加上端口號,透過瀏覽器直接進入 webUI 管理頁面(帳密為 /etc/default/minio 中你所設定的那組)
由於本例的 MinIO 是分佈式叢集的關係,叢集內的每一台機器都可以提供 webUI 服務,因此推薦使用雲端ELB 或地端 Nginx 來做對外的負載平衡與反向代理。
導覽MinIO
在左方菜單的「Object Brower」頁面中點擊「Create a Bucket」建立一個測試用的存儲空間
點進 bucket 設定存取權限將 policy 設定為「public」讓 bucket 可被存取
點擊上方「Object Browser」瀏覽 bucket 內容
從右上方「Upload」按鈕可以上傳 object 到 bucket03 中
點選剛剛上傳的 object 並選擇右方菜單中的「Preview」可以預覽物件內容
在左方菜單的「Monitoring」下的「Mertircs」可以查看伺服器池(Server Pool)的組成與空間使用狀況
本文內容參閱以下連結:
Deploy MinIO: Multi-Node Multi-Drive
Hardware Checklist
12 圖入門高性能分佈式對象存儲 MinIO
Minio筆記_minio存儲空間佔用-CSDN博客
0 Comments:
張貼留言