MinIO 分布式集群搭建
分布式 Minio 可以讓你將多塊硬盤(甚至在不同的機器上)組成一個對象存儲服務。由於硬盤分布在不同的節點上,分布式 Minio 避免了單點故障。
Minio 分布式模式可以搭建一個高可用的對象存儲服務,你可以使用這些存儲設備,而不用考慮其真實物理位置。
(1)數據保護
分布式 Minio 采用糾刪碼(erasure code)來防范多個節點宕機和位衰減(bit rot)。
分布式 Minio 至少需要 4 個節點,使用分布式 Minio 就自動引入了糾刪碼功能。
糾刪碼是一種恢復丟失和損壞數據的數學算法, Minio 采用 Reed-Solomon code 將對象拆分成 N/2 數據和 N/2 奇偶校驗塊。 這就意味着如果是 12 塊盤,一個對象會被分成 6 個數據塊、6 個奇偶校驗塊,你可以丟失任意 6 塊盤(不管其是存放的數據塊還是奇偶校驗塊),你仍可以從剩下的盤中的數據進行恢復。
糾刪碼的工作原理和 RAID 或者復制不同,像 RAID6 可以在損失兩塊盤的情況下不丟數據,而 Minio 糾刪碼可以在丟失一半的盤的情況下,仍可以保證數據安全。 而且 Minio 糾刪碼是作用在對象級別,可以一次恢復一個對象,而RAID 是作用在卷級別,數據恢復時間很長。 Minio 對每個對象單獨編碼,存儲服務一經部署,通常情況下是不需要更換硬盤或者修復。Minio 糾刪碼的設計目標是為了性能和盡可能的使用硬件加速。
位衰減又被稱為數據腐化 Data Rot、無聲數據損壞 Silent Data Corruption ,是目前硬盤數據的一種嚴重數據丟失問題。硬盤上的數據可能會神不知鬼不覺就損壞了,也沒有什么錯誤日志。正所謂明槍易躲,暗箭難防,這種背地里犯的錯比硬盤直接故障還危險。 所以 Minio 糾刪碼采用了高速 HighwayHash 基於哈希的校驗和來防范位衰減。
(2)高可用
單機 Minio 服務存在單點故障,相反,如果是一個 N 節點的分布式 Minio ,只要有 N/2 節點在線,你的數據就是安全的。不過你需要至少有 N/2+1 個節點來創建新的對象。
例如,一個 8 節點的 Minio 集群,每個節點一塊盤,就算 4 個節點宕機,這個集群仍然是可讀的,不過你需要 5 個節點才能寫數據。
(3)限制
分布式 Minio 單租戶存在最少 4 個盤最多 16 個盤的限制(受限於糾刪碼)。這種限制確保了 Minio 的簡潔,同時仍擁有伸縮性。如果你需要搭建一個多租戶環境,你可以輕松的使用編排工具(Kubernetes)來管理多個Minio實例。
注意,只要遵守分布式 Minio 的限制,你可以組合不同的節點和每個節點幾塊盤。比如,你可以使用 2 個節點,每個節點 4 塊盤,也可以使用 4 個節點,每個節點兩塊盤,諸如此類。
(4)一致性
Minio 在分布式和單機模式下,所有讀寫操作都嚴格遵守 read-after-write 一致性模型。
搭建分布式集群
啟動一個分布式 Minio 實例,你只需要把硬盤位置做為參數傳給 minio server 命令即可,然后,你需要在所有其它節點運行同樣的命令。
注意
- 分布式 Minio 里所有的節點需要有同樣的 access 秘鑰和 secret 秘鑰,這樣這些節點才能建立聯接。為了實現這個,你需要在執行 minio server 命令之前,先將 access 秘鑰和 secret 秘鑰 export 成環境變量。
- 分布式 Minio 使用的磁盤里必須是干凈的,里面沒有數據。
- 下面示例里的 IP 僅供示例參考,你需要改成你真實用到的 IP 和文件夾路徑。
- 分布式 Minio 里的節點時間差不能超過 3 秒,你可以使用 NTP 來保證時間一致。
- 在 Windows 下運行分布式 Minio 處於實驗階段,不建議用於生產環境。
示例1:
啟動分布式Minio實例,8個節點,每節點1塊盤,需要在8個節點上都運行下面的命令。
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
http://192.168.1.13/export3 http://192.168.1.14/export4 \
http://192.168.1.15/export5 http://192.168.1.16/export6 \
http://192.168.1.17/export7 http://192.168.1.18/export8
示例2:
啟動分布式Minio實例,4節點,每節點4塊盤,需要在4個節點上都運行下面的命令。
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
http://192.168.1.11/export3 http://192.168.1.11/export4 \
http://192.168.1.12/export1 http://192.168.1.12/export2 \
http://192.168.1.12/export3 http://192.168.1.12/export4 \
http://192.168.1.13/export1 http://192.168.1.13/export2 \
http://192.168.1.13/export3 http://192.168.1.13/export4 \
http://192.168.1.14/export1 http://192.168.1.14/export2 \
http://192.168.1.14/export3 http://192.168.1.14/export4
驗證
驗證是否部署成功,使用瀏覽器訪問 Minio 服務或者使用 mc。多個節點的存儲容量和就是分布式Minio的存儲容量。