文件

擴展分散式 MinIO 部署

MinIO 支援透過新增 伺服器池 來擴展現有的分散式部署。每個池都會擴展叢集的總可用儲存容量。

擴展不提供業務持續性/災難復原 (BC/DR) 等級的保護。雖然每個池都是一組具有不同 Erasure Set (Erasure 集) 以確保可用性的獨立伺服器集,但完全遺失一個池會導致 MinIO 停止部署中所有池的 I/O。同樣地,在一個池中失去仲裁的 Erasure Set 代表儲存在該集中物件的資料遺失,無論其他 Erasure Set 或池的數量為何。

新的伺服器池**不需要**使用與任何現有伺服器池相同的類型或大小的硬體和軟體組態,但這樣做可以簡化叢集管理並提高池之間的效能可預測性。新池中的所有磁碟機**應**在新池內具有相同的類型和大小。請參閱 MinIO 的 硬體建議,以取得有關選擇適當組態的更完整指南。

為了為您的單一或多池 MinIO 部署提供 BC-DR 等級的容錯移轉和復原支援,請使用 站點複寫

此頁面上的程序使用額外的伺服器池來擴展現有的 分散式 MinIO 部署。

先決條件

網路和防火牆

每個節點都應該能夠完全雙向網路存取部署中的每個其他節點。對於容器化或協調式基礎架構,這可能需要對網路和路由組件(例如輸入或負載平衡器)進行特定組態。某些作業系統可能還需要設定防火牆規則。例如,以下命令會明確在伺服器上開啟預設的 MinIO 伺服器 API 連接埠 9000,該伺服器使用 firewalld

firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

部署中的所有 MinIO 伺服器*必須*使用相同的接聽連接埠。

如果您設定靜態 MinIO 主控台 連接埠(例如 :9001),您*還必須*授權存取該連接埠,以確保來自外部用戶端的連線能力。

MinIO **強烈建議**使用負載平衡器來管理與叢集的連線。負載平衡器應使用「最少連線」演算法將請求路由到 MinIO 部署,因為部署中的任何 MinIO 節點都可以接收、路由或處理用戶端請求。

已知以下負載平衡器可與 MinIO 良好協同運作

組態防火牆或負載平衡器以支援 MinIO 超出了此程序的範圍。《為 MinIO 伺服器組態 NGINX Proxy》參考文件提供了使用 NGINX 作為反向 Proxy 並組態基本負載平衡的基準組態。

依序的主機名稱

MinIO 在建立伺服器池時必須使用擴展表示法 {x...y} 來表示一系列連續的 MinIO 主機。因此,MinIO 必須使用依序編號的主機名稱來代表池中的每個 minio server 程序。

在開始此程序之前,請先建立必要的 DNS 主機名稱對應。例如,以下主機名稱將支援一個 4 節點分散式伺服器池

  • minio5.example.com

  • minio6.example.com

  • minio7.example.com

  • minio8.example.com

您可以使用擴展表示法 minio{5...8}.example.com 指定整個主機名稱範圍。

設定 DNS 以支援 MinIO 不在此程序的範圍內。

儲存需求

以下需求總結了 MinIO 硬體建議的儲存部分

使用本機儲存

直接連接儲存 (DAS) 比網路儲存(NASSANNFS)具有顯著的效能和一致性優勢。MinIO 強烈建議將快閃儲存(NVMe、SSD)用於主要或「熱」資料。

為硬碟使用 XFS 格式

MinIO 強烈建議為儲存配置 XFS 格式的硬碟。MinIO 將 XFS 作為內部測試和驗證套件的一部分,在所有規模下提供對效能和行為的額外信心。

MinIO 測試也不建議任何其他檔案系統,例如 EXT4、BTRFS 或 ZFS。

使用一致的硬碟類型

MinIO 不區分硬碟類型,也無法從混合儲存類型中獲益。每個都必須使用相同的類型(NVMe、SSD)

例如,部署一個僅由 NVMe 硬碟組成的池。如果您將某些硬碟部署為 SSD 或 HDD,MinIO 會將這些硬碟視為與 NVMe 硬碟相同。這可能會導致效能問題,因為某些硬碟具有不同或較差的讀寫特性,並且無法與 NVMe 硬碟以相同的速率回應。

使用一致的硬碟大小

MinIO 將每個硬碟使用的容量限制為部署中最小的硬碟。

例如,部署一個由相同數量的 NVMe 硬碟組成,且每個硬碟都具有相同的 7.68TiB 容量的池。如果您部署一個具有 3.84TiB 的硬碟,MinIO 會將池中的所有硬碟都視為具有較小的容量。

設定循序硬碟掛載

MinIO 使用 Go 擴展表示法 {x...y} 來表示建立新伺服器池時的一系列循序硬碟,其中伺服器池中的所有節點都具有一組相同的掛載硬碟。將硬碟掛載路徑設定為循序系列,以最好地支援此表示法。例如,使用 /mnt/drive-n 的模式掛載您的硬碟,其中 n1 開始,並每個硬碟遞增 1

在重新啟動時保留硬碟掛載和對應

使用 /etc/fstab 確保跨節點重新啟動時硬碟到掛載的一致對應。

非 Linux 作業系統應使用等效的硬碟掛載管理工具。

對硬碟的獨佔存取權

MinIO 必須對提供的物件儲存硬碟或磁碟區具有獨佔存取權。沒有其他程序、軟體、腳本或人員應在提供給 MinIO 的硬碟或磁碟區或 MinIO 放置在上面的物件或檔案上直接執行任何操作。

除非 MinIO 工程部門指示,否則不要使用腳本或工具直接修改、刪除或移動提供的硬碟上的任何資料分片、同位分片或中繼資料檔案,包括從一個硬碟或節點移動到另一個硬碟或節點。此類操作很可能會導致大範圍的損壞和資料遺失,超出 MinIO 的修復能力。

用於刪除碼同位的最低硬碟數

MinIO 要求每個池都滿足部署的刪除碼設定。具體來說,新的池拓撲必須支援每個刪除集至少 2 x EC:N 個硬碟,其中 EC:N 是部署的標準同位儲存類別。此要求確保新的伺服器池可以滿足部署的預期SLA

您可以使用 MinIO 刪除碼計算器 來檢查新池的刪除碼條紋大小 (K+M)。如果列出的最高值至少為 2 x EC:N,則該池支援部署的刪除同位設定。

時間同步

多節點系統必須保持同步的時間和日期,以維持穩定的節點間操作和互動。請確保所有節點定期同步到同一時間伺服器。作業系統用於同步時間和日期的方法各不相同,例如使用 ntptimedatectltimesyncd

請查看您的作業系統的說明文件,了解如何在各個節點之間設定和維護準確且相同的系統時鐘時間。

首先備份叢集設定

使用 mc admin cluster bucket exportmc admin cluster iam export 命令分別在開始停用之前建立儲存貯體中繼資料和 IAM 設定的快照。您可以使用這些快照來還原儲存貯體IAM設定,以便在必要時從使用者或程序錯誤中恢復。

考量事項

寫入檔案

MinIO 不會自動跨新的伺服器池重新平衡物件。相反,MinIO 會對具有最多可用儲存空間的池執行新的寫入操作,權重依據池上的可用空間量除以所有可用池上的可用空間。

確定在特定池上執行寫入操作的機率的公式為

\(FreeSpaceOnPoolA / FreeSpaceOnAllPools\)

假設一組三個池的可用空間總量為 10 TiB,其分佈如下

  • 池 A 有 3 TiB 的可用空間

  • 池 B 有 2 TiB 的可用空間

  • 池 C 有 5 TiB 的可用空間

MinIO 計算對每個池執行寫入操作的機率如下

  • 池 A:30% 機率 (\(3TiB / 10TiB\))

  • 池 B:20% 機率 (\(2TiB / 10TiB\))

  • 池 C:50% 機率 (\(5TiB / 10TiB\))

除了可用空間計算之外,如果寫入選項(帶同位)會使硬碟使用率超過 99% 或已知的可用 inode 計數低於 1000,則 MinIO 不會寫入到池中。

如果需要,您可以使用 mc admin rebalance 手動啟動重新平衡程序。有關重新平衡如何運作的更多資訊,請參閱跨部署管理物件

同樣地,MinIO 不會寫入到正在停用程序中的池。

擴充是非破壞性的

新增伺服器池需要在大約同一時間重新啟動部署中的所有 MinIO 伺服器程序。

MinIO 強烈建議同時重新啟動部署中的所有 MinIO 伺服器程序。MinIO 操作是原子性的,並且嚴格一致。因此,重新啟動程序不會對應用程式和正在進行的操作造成破壞。

請勿執行「滾動式」(例如,一次一個節點)重新啟動。

基於容量的規劃

MinIO 建議規劃足夠的儲存容量,以在達到 70% 使用率之前儲存至少 2 年的資料。更頻繁地或以「及時」的方式執行伺服器池擴充通常表示架構或規劃問題。

舉例來說,考慮一個預計每年產生至少 100 TiB 數據的應用程式套件,以及 3 年的擴展目標。初始伺服器池的部署具有約 500 TiB 的可用儲存空間,因此叢集安全地達到 70% 的閾值,並保留一些數據增長的緩衝空間。新的伺服器池理想情況下應至少滿足 500 TiB 的額外儲存空間,以便在進一步擴展之前允許類似的使用壽命。

由於 MinIO 糾刪碼需要一些儲存空間用於同位檢查,因此總原始儲存空間必須超過計劃的可用容量。考慮使用 MinIO 糾刪碼計算器,以在規劃特定糾刪碼設定的容量時獲得指導。

擴展分散式 MinIO 部署

以下程序會將伺服器池新增至現有的 MinIO 部署。每個池都會擴展叢集的總可用儲存容量,同時維持叢集的整體可用性

下面提供的所有命令都使用範例值。請將這些值替換為適合您部署的值。

在開始此程序之前,請檢閱先決條件

停用較舊的硬體池之前,完成任何計劃的硬體擴展。

1) 在新伺服器池中的每個節點上安裝 MinIO 二進制檔

以下標籤頁提供使用 RPM、DEB 或二進制檔在 64 位元 Linux 作業系統上安裝 MinIO 的範例。RPM 和 DEB 套件會自動將 MinIO 安裝到必要的系統路徑,並為 systemctl 建立 minio 服務。MinIO 強烈建議使用 RPM 或 DEB 安裝路徑。若要更新使用 systemctl 管理的部署,請參閱更新 systemctl 管理的 MinIO 部署

amd64 (Intel 或 AMD 64 位元處理器)

使用以下選項之一下載在 Intel 或 AMD 64 位元處理器上執行 Linux 的電腦的 MinIO 伺服器安裝檔案。

使用以下命令下載最新的穩定 MinIO RPM 並安裝。

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20241029160148.0.0-1.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm

使用以下命令下載最新的穩定 MinIO DEB 並安裝。

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20241029160148.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

使用以下命令下載最新的穩定 MinIO 二進制檔,並將其安裝到系統 $PATH

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
arm64 (Apple M1/M2 或其他 ARM 64 位元處理器)

使用以下選項之一下載在 ARM 64 位元處理器 (例如 Apple M1 或 M2) 上執行 Linux 的電腦的 MinIO 伺服器安裝檔案。

使用以下命令下載最新的穩定 MinIO RPM 並安裝。

wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio-20241029160148.0.0-1.aarch64.rpm -O minio.rpm
sudo dnf install minio.rpm

使用以下命令下載最新的穩定 MinIO DEB 並安裝。

wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio_20241029160148.0.0_arm64.deb -O minio.deb
sudo dpkg -i minio.deb

使用以下命令下載最新的穩定 MinIO 二進制檔,並將其安裝到系統 $PATH

wget https://dl.min.io/server/minio/release/linux-arm64/minio
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
其他架構

MinIO 也支援其他架構

  • ppc64le

  • s390x

如需下載這些架構的二進制檔、RPM 或 DEB 檔案的指示,請參閱MinIO 下載頁面

2) 新增 TLS/SSL 憑證

當 MinIO 在 MinIO ${HOME}/.minio/certs 目錄中偵測到有效的 x.509 憑證 ( .crt) 和私密金鑰 ( .key) 時,會自動啟用傳輸層安全 (TLS) 1.2+。

對於 systemd 管理的部署,請使用執行 MinIO 伺服器處理程序的用戶的 $HOME 目錄。提供的 minio.service 檔案會將處理程序以 minio-user 執行。先前的步驟包含建立此用戶 (其主目錄為 /home/minio-user) 的指示。

  • 將 TLS 憑證放置到每個主機上的 /home/minio-user/.minio/certs

  • 如果任何 MinIO 伺服器或用戶端使用由未知憑證授權單位 (自我簽署或內部 CA) 簽署的憑證,則您必須將 CA 憑證放置在部署中所有 MinIO 主機上的 /home/minio-user/.minio/certs/CAs 中。MinIO 會拒絕無效的憑證 (不受信任、已過期或格式錯誤)。

如果 minio.service 檔案指定不同的使用者帳戶,請使用該帳戶的 $HOME 目錄。或者,使用minio server --certs-dir 命令列引數來指定自訂憑證目錄。修改 /etc/default/minio 中的 MINIO_OPTS 變數以設定此選項。執行 MinIO 伺服器處理程序的 systemd 使用者必須具有指定目錄的讀取和列出權限。

如需有關設定 MinIO 以進行 TLS (包括透過伺服器名稱指示 (SNI) 提供多網域支援) 的更具體指南,請參閱網路加密 (TLS)。您可以選擇略過此步驟以部署未啟用 TLS 的環境。MinIO 強烈建議不要在早期開發之外進行非 TLS 部署。

3) 建立 systemd 服務檔案

.deb.rpm 套件會將下列 systemd 服務檔案安裝到 /usr/lib/systemd/system/minio.service。對於二進制檔安裝,請在所有 MinIO 主機上手動建立此檔案。

注意

systemd 會先檢查 /etc/systemd/... 路徑,然後再檢查 /usr/lib/systemd/... 路徑,並使用它找到的第一個檔案。為避免衝突或非預期的組態選項,請檢查該檔案是否僅存在於 /usr/lib/systemd/system/minio.service 路徑。

如需檔案路徑搜尋順序的詳細資訊,請參閱 systemd.unit 的手冊頁面

[Unit]
Description=MinIO
Documentation=https://minio.dev.org.tw/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})

依預設, minio.service 檔案會以 minio-user 使用者和群組執行。您可以使用 groupadduseradd 命令來建立使用者和群組。以下範例會建立使用者、群組,並設定權限以存取 MinIO 預期使用的資料夾路徑。這些命令通常需要 root ( sudo) 權限。

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4

指定的磁碟機路徑作為範例提供。請變更這些路徑以符合 MinIO 預期使用的磁碟機路徑。

或者,將 UserGroup 值變更為系統主機上具有必要存取權和權限的其他使用者和群組。

MinIO 會在 github.com/minio/minio-service 上發佈其他啟動指令碼範例。

若要更新使用 systemctl 管理的部署,請參閱更新 systemctl 管理的 MinIO 部署

4) 建立服務環境檔案

/etc/default/minio 建立環境檔案。MinIO 服務會使用此檔案作為 MinIO minio.service 檔案所使用的所有環境變數的來源。

以下範例假設

  • 部署具有單一伺服器池,其中包含四個具有循序主機名稱的 MinIO 伺服器主機。

    minio1.example.com   minio3.example.com
    minio2.example.com   minio4.example.com
    

    每個主機都有 4 個具有循序掛載點的本機連接磁碟機

    /mnt/disk1/minio   /mnt/disk3/minio
    /mnt/disk2/minio   /mnt/disk4/minio
    
  • 新的伺服器池包含八個具有循序主機名稱的新 MinIO 主機

    minio5.example.com   minio9.example.com
    minio6.example.com   minio10.example.com
    minio7.example.com   minio11.example.com
    minio8.example.com   minio12.example.com
    
  • 所有主機都有八個具有循序掛載點的本機連接磁碟機

    /mnt/disk1/minio  /mnt/disk5/minio
    /mnt/disk2/minio  /mnt/disk6/minio
    /mnt/disk3/minio  /mnt/disk7/minio
    /mnt/disk4/minio  /mnt/disk8/minio
    
  • 部署有一個負載平衡器,在 https://minio.example.net 執行,可管理所有 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 starts the MinIO server with two server pools.
#
# The space delimiter indicates a seperate server pool
#
# The second set of hostnames and volumes is the newly added pool.
# The pool has sufficient stripe size to meet the existing erasure code
# parity of the deployment (2 x EC:4)
#
# The command includes the port on which the MinIO servers listen for each
# server pool.

MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio{5...12}.example.net:9000/mnt/disk{1...8}/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-key-CHANGE-ME

您可以根據您的部署需求指定其他環境變數或伺服器命令列選項。部署中的所有 MinIO 節點都應包含具有相符值的相同環境變數。

5) 使用展開的組態重新啟動 MinIO 部署

在部署中的每個節點上同時發出以下命令以重新啟動 MinIO 服務

sudo systemctl restart minio.service

使用以下命令確認服務在線上且功能正常

sudo systemctl status minio.service
journalctl -f -u minio.service

在伺服器處理程序連線和同步時,MinIO 可能會記錄更多非嚴重警告。這些警告通常是暫時性的,並會在部署上線時解決。

MinIO 強烈建議同時重新啟動部署中的所有 MinIO 伺服器程序。MinIO 操作是原子性的,並且嚴格一致。因此,重新啟動程序不會對應用程式和正在進行的操作造成破壞。

請勿執行「滾動式」(例如,一次一個節點)重新啟動。

6) 後續步驟

  • 更新任何負載平衡器、反向代理或其他網路控制層面,以將用戶端請求路由到 MinIO 分散式部署中的新主機。雖然 MinIO 會自動在內部管理路由,但讓控制層面處理初始連線管理可以減少網路躍點並提高效率。

  • 檢閱MinIO 控制台,以確認更新後的叢集拓撲並監控效能。