MinIO線上擴容實戰
來源:中介軟體興趣圈
硬體投入肯定是隨著業務的增長而增長,這就要求中介軟體平臺必須提供水平伸縮機制,MinIO物件儲存服務也不例外,本文就詳細介紹MinIO的擴容。
Minio支援透過增加新的Server Pool來擴容老的叢集。每個Server Pool都是一個相對獨立的故障域,一個Server Pool丟失一個或多個驅動器或節點不會影響其他Server Pool的可用性。
1.1 擴容前的先決條件
1.1.1 網路與防火牆
叢集內各個節點之間網路必須是互通的,特別是要注意防火牆規則或者容器環境下的網路互通,例如可以透過如下命令放開Minio的預設Server Port:9000。
firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload
注意:minio叢集中所有節點必須是監聽同一個埠。
如果您設定了一個靜態MinIO控制檯埠(例如:9001),您還必須授予對該埠的訪問許可權,以確保來自外部客戶端的連線。MinIO強烈建議使用**負載均衡元件(Nginx)**來管理到叢集的連線,負載均衡器應該使用“最少連線”演算法將請求路由到MinIO部署,因為部署中的任何MinIO節點都可以接收、路由或處理客戶端請求。
1.1.2 連續的主機名稱
MinIO需要使用展開符號{x…y}來表示建立伺服器池時的一系列MinIO主機。因此,MinIO需要使用按順序編號的主機名來表示池中的每個MinIO伺服器程式。
例如現在有minio5.example.com、minio6.example.com兩個節點,我們可以使用 minio{5...6}.example.com來指定Server Pool中的所有節點。
1.1.3 本機JBOD儲存與順序掛載
MinIO強烈推薦直連的JBOD陣列,xfs格式的磁碟以獲得最佳效能。
DAS (Direct-Attached Storage)與網路儲存(NAS、SAN、NFS)相比具有顯著的效能和一致性優勢。
使用非xfs檔案系統(ext4、btrfs、zfs)的部署往往具有較低的效能,同時ext4等檔案儲存對單個目錄下的檔案有個數限制,容易影響可用性。
Minio天生具有分散式儲存的優勢,並且內部採用糾刪碼,RAID或類似技術反而不能提供額外的彈性或可用性優勢,而且通常會降低系統效能。
請確保伺服器池中的所有節點使用相同型別(NVMe、SSD或HDD)的驅動器,並且容量相同。MinIO不區分驅動器型別,也不能從混合儲存型別中獲益。此外。MinIO將每個驅動器的大小限制為部署中最小的驅動器所擁有的容量。例如,如果部署有15個10TB驅動器和1個1TB驅動器,MinIO將每個驅動器的容量限制為1TB。
MinIO需要使用展開符號{x…y}用來表示Server Pool中每一個節點的一組磁碟驅動器,並且要求Server Pool中所有節點的磁碟驅動器序列相同。MinIO還要求物理驅動器的順序在重新啟動時保持不變,這樣給定的掛載點總是指向相同的格式化驅動器。因此,MinIO強烈建議使用/etc/fstab或類似的基於檔案的掛載配置。
示例如下:
我們可以使用/mnt/disk{1…4}來指定整個驅動器範圍。如果需要為驅動器設定子目錄,例如minio,那可以設定為/mnt/disk{1…4}/minio。
MinIO不支援將具有已儲存MinIO資料的驅動器任意遷移到新的掛載位置。
MinIO嚴格的寫後讀和寫後列表一致性模型要求使用本地驅動器檔案系統(xfs、ext4等)。如果底層儲存卷是NFS或類似的網路連線儲存卷,MinIO就不能提供一致性保證。對於需要使用網路連線儲存的部署,請使用NFSv4以獲得最佳效果。
1.1.4 Server Pool 糾刪碼一致原則(對等擴容)
MinIO要求每一個Server Pool滿足erasure code settings。例如一個組原先是3臺共12塊盤,那擴容新增加的組,必須是是原先的倍數。
1.2 擴容注意事項
1.2.1 檔案寫策略
MinIO不會將物件從舊的Server Pool中自動遷移到新新增的Server Pool中,即不會進行重平衡。但是,MinIO根據儲存空閒大小進行加權選擇,空閒空間越大的Server Pool會承擔更多的寫入流量,加權值是Server Pool的空閒空間量除以所有可用池上的空閒空間。
例如目前叢集有3個Server Pool:
Pool A has 3 TiB of free space Pool B has 2 TiB of free space Pool C has 5 TiB of free space
Minio分別向各個Pool中寫入的機率為:
Pool A:30% = 3 / (3 + 2 + 5) Pool B:20% = 2 / (3 + 2 + 5) Pool C:50% = 5 / (3 + 2 + 5)
除了可用空間加權後,如果繼續寫入檔案會使得磁碟使用率超過99%或者空閒的inode計數低於1000,同樣不會再往該Pool中寫入新檔案。
如果需要,你可以使用mc admin rebalance手動啟動一個rebalance過程。關於這塊詳細的介紹,將在後續文章中介紹。
1.2.2 機器配置相同或相似
MinIO強烈建議為新Server Pool的所有節點選擇基本相似的硬體配置。確保硬體(CPU、記憶體、主機板、儲存介面卡)和軟體(作業系統、核心設定、系統服務)在池中的所有節點上保持一致。
因為新加入的服務叢集將在Minio中充當主力寫,相當於熱資料的主要承接,老的Server Pool基本只負責讀查詢,所以新Server Pool的服務效能將決定整個叢集的效能。
當然,新的服務節點的配置,無需與其他組內的配置一致,因為Minio的故障域是Server Pool。
1.2.3 擴容是非破壞性的
MinIO新增新的Server Pool是需要同時重啟所有的Minio nodes。MinIO強烈建議同時重啟所有節點。MinIO操作是原子的,並且嚴格一致。因此,重新啟動過程不會中斷應用程式和正在進行的操作。禁止滾動重啟。
1.3 叢集擴容
接下來分佈詳細介紹叢集擴容的個個步驟。
Step1:在新的Server Pool中的每一個節點安裝MinIO二進位制檔案
RPM和DEB包自動將MinIO安裝到必要的系統路徑上,並建立用於自動執行MinIO的systemd服務檔案。MinIO強烈建議使用RPM或DEB安裝。
如果作業系統的架構為amd64(Intel or AMD 64-bit processors),請使用如下命令:
# RPM
wget
sudo dnf install minio.rpm
# DEB
wget
sudo dpkg -i minio.deb
# Binary
wget
chmod +x minio
sudo mv minio /usr/local/bin
如果是ARM架構的作業系統,請下載對應的包。具體的安裝命令與AMD64一樣,下文的介紹也只基於AMD64介紹。
Step2:新增TLS/SSL證書
Minio啟用TLS加密通道的話,會自動檢測${USER_HOME}/.minio/certs目錄下的證書(.crt)與私鑰(.key)。
Systemd-managed部署的minio服務,minio.service檔案中預設定義的使用者名稱minio-user,故需要提前建立好 /home/minio-user。
需要將證書放到/home/minio-user/.minio/certs目錄下 如果MinIO服務或客戶端使用的是未知證書頒發機構(自簽名或內部CA)簽署的證書,則必須在每一個minio節點上將CA證書放在/home/minio-user/. minio/certs/CAs 目錄下。MinIO拒絕無效的證書(不受信任、過期或格式不正確)。
如果minio.service中指定了其他使用者賬號,將會從該賬號對應的主目錄去載入證書,也可以用 minio server --certs-dir 命令來指定證書所在的目錄,亦或者修改/etc/defaults/minio檔案中的MINIO_OPTS變數中設定cert_dir。
執行MinIO伺服器程式的systemd使用者必須具有指定目錄的讀取和ls許可權。
Step3:建立systemd服務檔案
deb或rpm包會自動將systemd服務檔案安裝在/etc/systemd/system/minio.service。如果是基於二進位制檔案安裝的話,需要手動在所有的minio節點上建立該檔案。
minio.service檔案的內容如下:
[Unit]
Description=MinIO
Documentation=
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
# 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。可以使用groupadd、useradd命令建立使用者和組。下面是建立使用者、組以及設定專案目錄許可權的示範命令:
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
其中/mnt/disk1為minio將要使用的磁碟目錄。
Step4:建立服務環境檔案
可以在/etc/default/minio目錄建立一個服務環境檔案,Minio Server、minio.service檔案會使用該目錄作為所有環境變數的輸入源,示例如下:
# 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.
# 多個Server Pool用空格隔開
MINIO_VOLUMES="{1...4}.example.net:9000/mnt/disk{1...4}/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
# Set to the URL of the load balancer for the MinIO deployment
# This value *must* match across all MinIO servers. If you do
# not have a load balancer, set this value to to any *one* of the
# MinIO hosts in the deployment as a temporary measure.
# 設定負載均衡器的URL,這個必須在所有節點上一致
MINIO_SERVER_URL=".example.net:9000"
關於更多的環境變數,可以參考官方文件: 後續也會再詳細介紹。
Step5:基於擴容後的配置重新啟動Minio
在部署的每一個節點上同時執行如下命令啟動minio:
sudo systemctl restart minio.service
使用如下命令確認一下服務線上並且正常:
sudo systemctl status minio.service
# 收集stsytemctl命令執行的日誌
journalctl -f -u minio.service
MinIO強烈建議同時重啟所有節點。MinIO操作是原子的,並且嚴格一致。因此,重新啟動過程不會中斷應用程式和正在進行的操作。
不要執行“滾動”(例如一次一個節點)重啟。
Step6:更新負載均衡器中upstream(路由機制)
更新負責均衡層的配置,使得客戶端流量可以路由到Minio叢集中新加入的組。當然Minio內部可以自動識別新加入的組並進行負載,但畢竟增加了網路跳數。
最後可以透過MinIO Console去確認一下物件上傳與下載效能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2946114/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阿里雲線上擴容磁碟阿里
- 5大主流方案對比:MySQL千億級資料線上平滑擴容實戰MySql
- MinIO線上故障演練
- Oracle資料庫 ASM磁碟線上擴容Oracle資料庫ASM
- Spring Cloud Eureka Server高可用之:線上擴容SpringCloudServer
- 線上多域名實戰
- LVM邏輯卷線上動態擴容磁碟空間LVM
- 實戰天翼云云主機系統盤擴容
- 阿里雲CentOS7.x ECS雲盤線上擴容操作阿里CentOS
- MinIO分散式叢集的擴充套件方案及實現分散式套件
- minio上傳檔案
- Google Cloud VM上線上擴硬碟GoCloud硬碟
- 線上最佳化之案例實戰
- Flutter上線專案實戰——路由篇Flutter路由
- 線上BUG:MySQL死鎖分析實戰MySql
- 小程式實戰:線上借書平臺
- liunx磁碟分割槽擴容實操
- 有狀態軟體如何在 k8s 上快速擴容甚至自動擴容K8S
- 為什麼說 TiDB 線上擴容對業務幾乎沒有影響TiDB
- swap擴容
- linux 擴容Linux
- [Redis]擴容Redis
- lakka擴容
- Vector擴容
- 線上業務最佳化之案例實戰
- Java線上問題排查神器Arthas實戰分析Java
- 我的慕課實戰課程上線了
- 一次 MySQL 線上死鎖分析實戰MySql
- 不寫一行程式碼!SpringBoot + MinIO實現萬能檔案線上預覽,太酷了!行程Spring Boot
- minio檔案上傳與下載
- UniApp檔案上傳(SpringBoot+Minio)APPSpring Boot
- Fluid 0.5 版本釋出:開啟資料集快取線上彈性擴縮容之路UI快取
- 達夢資料庫DSC架構下ASM擴容及表空間擴容實施資料庫架構ASM
- Simple WPF: WPF實現一個MINIO等S3相容物件儲存上傳檔案的小工具S3物件
- 測試右移:線上質量監控 ELK 實戰
- Flutter上線專案實戰——Vap視訊動畫Flutter動畫
- 用C實現動態擴容的string
- 如何實現CentOS伺服器的擴容??CentOS伺服器