高可用分散式物件儲存,MinIO 輕鬆實現。
1 前言
上一篇文章介紹了使用物件儲存工具 MinIO 搭建一個優雅、簡單、功能完備的靜態資源服務,可見其操作簡單,功能完備。但由於是單節點部署,難免會出現單點故障,無法做到服務的高可用。MinIO 已經提供了分散式部署的解決方案,實現高可靠、高可用的資源儲存,同樣的操作簡單,功能完備。本文將對 MinIO 的分散式部署進行描述,主要分以下幾個方面:
-
分散式儲存的可靠性
-
MinIO 的分散式的儲存機制
-
分散式部署實踐
2 分散式儲存可靠性常用方法
分散式儲存,很關鍵的點在於資料的可靠性,即保證資料的完整,不丟失,不損壞。只有在可靠性實現的前提下,才有了追求一致性、高可用、高效能的基礎。而對於在儲存領域,一般對於保證資料可靠性的方法主要有兩類,一類是冗餘法,一類是校驗法。
2.1 冗餘
冗餘法最簡單直接,即對儲存的資料進行副本備份,當資料出現丟失,損壞,即可使用備份內容進行恢復,而副本 備份的多少,決定了資料可靠性的高低。這其中會有成本的考量,副本資料越多,資料越可靠,但需要的裝置就越多,成本就越高。可靠性是允許丟失其中一份資料。當前已有很多分散式系統是採用此種方式實現,如 Hadoop 的檔案系統(3個副本),Redis 的叢集,MySQL 的主備模式等。
2.2 校驗
校驗法即通過校驗碼的數學計算的方式,對出現丟失、損壞的資料進行校驗、還原。注意,這裡有兩個作用,一個校驗,通過對資料進行校驗和( checksum )進行計算,可以檢查資料是否完整,有無損壞或更改,在資料傳輸和儲存時經常用到,如 TCP 協議;二是恢復還原,通過對資料結合校驗碼,通過數學計算,還原丟失或損壞的資料,可以在保證資料可靠的前提下,降低冗餘,如單機硬碟儲存中的 RAID 技術,糾刪碼(Erasure Code)技術等。MinIO 採用的就是糾刪碼技術。
3 MinIO儲存機制
3.1 概念理解
在部署分散式 MinIO 前,需要對下面的概念進行了解:
- 硬碟(Drive):即儲存資料的磁碟,在 MinIO 啟動時,以引數的方式傳入。
- 組( Set ):即一組 Drive 的集合,分散式部署根據叢集規模自動劃分一個或多個 Set ,每個 Set 中的 Drive 分佈在不同位置。一個物件儲存在一個 Set 上。
- 桶(Bucket):檔案物件儲存的邏輯位置,對於客戶端而言,就相當於一個存放檔案的頂層資料夾。
3.2 糾刪碼EC(Erasure Code)
MinIO 使用糾刪碼機制來保證高可靠性,使用 highwayhash 來處理資料損壞( Bit Rot Protection )。關於糾刪碼,簡單來說就是可以通過數學計算,把丟失的資料進行還原,它可以將n份原始資料,增加m份資料,並能通過n+m份中的任意n份資料,還原為原始資料。即如果有任意小於等於m份的資料失效,仍然能通過剩下的資料還原出來。舉個最簡單例子就是有兩個資料(d1, d2),用一個校驗和y(d1 + d2 = y
)即可保證即使丟失其中一個,依然可以還原資料。如丟失 d1 ,則使用 y - d2 = d1
還原,同理,d2 丟失或者y丟失,均可通過計算得出。
EC 的具體應用實現中, RS(Reed-Solomen)是 EC 的一種更簡單快捷的實現,可以通過矩陣運算,還原資料。MinIO 將物件拆分成N/2資料和N/2 校驗塊 。具體的數學矩陣運算及證明,可以參考文章《Erasure-Code-擦除碼-1-原理篇》及《EC糾刪碼原理》。
3.3 儲存形式
檔案物件上傳到 MinIO ,會在對應的資料儲存磁碟中,以 Bucket 名稱為目錄,檔名稱為下一級目錄,檔名稱下是 part.1 和 xl.json,前者是編碼資料塊及檢驗塊,後者是後設資料檔案。如有4個磁碟,當檔案上傳後,會有2個編碼資料塊,2個檢驗塊,分別儲存在4個磁碟中。如下圖,bg-01.jpg
是上傳的檔案物件:
4 部署實踐
4.1 單節點部署多磁碟
在啟動 MinIO 時,若傳入引數是多個目錄,則會以糾刪碼的形式執行,即具備高可靠性意義。即在一個伺服器(單節點)上對,多個磁碟上執行 MinIO。
執行命令也很簡單,引數傳入多個目錄即可:
MINIO_ACCESS_KEY=${ACCESS_KEY} MINIO_SECRET_KEY=${SECRET_KEY} nohup ${MINIO_HOME}/minio server --address "${MINIO_HOST}:${MINIO_PORT}" /opt/min-data1 /opt/min-data2 /opt/min-data3 /opt/min-data4 > ${MINIO_LOGFILE} 2>&1 &
注意替換命令中的變更,執行後輸出資訊如下:
可見 MinIO 會建立一個1個 set,set 中有4個 drive ,其中它會提示一個警告,提示一個節點的 set 中存在多於2個的drive,如果節點掛掉,則資料都不可用了,這與 EC 碼的規則一致。
4.2 多節點部署
4.2.1 部署指令碼
為了防止單點故障,分散式儲存自然是需要多節點部署,以達到高可靠和高可用的能力。MinIO 對於多節點的部署,也是在啟動時通過指定有 Host 和埠的目錄地址,即可實現。下面在單臺機器上,通過不同的埠模擬在4臺機器節點上執行,儲存目錄依然是 min-data14,而對應的埠是90019004。指令碼如下:
RUNNING_USER=root
MINIO_HOME=/opt/minio
MINIO_HOST=192.168.222.10
#accesskey and secretkey
ACCESS_KEY=minio
SECRET_KEY=minio123
for i in {01..04}; do
START_CMD="MINIO_ACCESS_KEY=${ACCESS_KEY} MINIO_SECRET_KEY=${SECRET_KEY} nohup ${MINIO_HOME}/minio server --address "${MINIO_HOST}:90${i}" http://${MINIO_HOST}:9001/opt/min-data1 http://${MINIO_HOST}:9002/opt/min-data2 http://${MINIO_HOST}:9003/opt/min-data3 http://${MINIO_HOST}:9004/opt/min-data4 > ${MINIO_HOME}/minio-90${i}.log 2>&1 &"
su - ${RUNNING_USER} -c "${START_CMD}"
done
本示例中,minio 的啟動命令執行了4次,相當於在四臺機器節點上都分別執行一個minio例項,從而模擬四個節點。執行結果如下:
檢視程式ps -ef |grep minio
:
4.2.2 部署注意點
- 所有執行分散式 MinIO 的節點需要具有相同的訪問金鑰和祕密金鑰才能連線。建議在執行 MINIO 伺服器命令之前,將訪問金鑰作為環境變數,MINIO access key 和 MINIO secret key 匯出到所有節點上 。
- Minio 建立4到16個驅動器的擦除編碼集。
- Minio 選擇最大的 EC 集大小,該集大小除以給定的驅動器總數。 例如,8個驅動器將用作一個大小為8的 EC 集,而不是兩個大小為4的 EC 集 。
- 建議所有執行分散式 MinIO 設定的節點都是同構的,即相同的作業系統、相同數量的磁碟和相同的網路互連 。
- 執行分散式 MinIO 例項的伺服器時間差不應超過15分鐘。
執行起來後,使用 http://${MINIO_HOST}:9001
到http://${MINIO_HOST}:9004
均可以訪問到 MinIO 的使用介面。
4.2.3 使用 nginx 負載均衡
前面單獨對每個節點進行訪問顯然不合理,通過使用 nginx 代理,進行負載均衡則很有必要。簡單的配置如下:
upstream http_minio {
server 192.168.222.10:9001;
server 192.168.222.10:9002;
server 192.168.222.10:9003;
server 192.168.222.10:9004;
}
server{
listen 8888;
server_name 192.168.222.10;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://http_minio;
}
}
其中主要是 upstream 及 proxy_pass 的配置。如此,即可使用http://${MINIO_HOST}:8888
進行訪問。
5 總結
對於分散式儲存,高可靠必是首要考慮的因素,MinIO 已經提供了分散式部署的解決方案,實現高可靠、高可用的資源儲存。本文對可靠性的實現方法進行描述,探討了 MinIO 的儲存機制,並通過指令碼模擬實踐 MinIO 的分散式部署,希望對大家有幫助。
參考資料
- MinIO官網:
https://min.io/
- MinIO開發文件:
https://docs.min.io/
- 基於 Go 開源專案 MIMIO 的物件儲存方案在探探的實踐:
https://mp.weixin.qq.com/s/MzA4ODg0NDkzOA==&mid=2247487119&idx=1&sn=6e09abb32392e015911be3a1d7f066e5&source=41
- Minio 檔案服務(1)—— Minio部署使用及儲存機制分析:
https://www.jianshu.com/p/3e81b87d5b0b
- 使用minio搭建高效能物件儲存:
https://tonybai.com/2020/03/16/build-high-performance-object-storage-with-minio-part1-prototype
往期文章
- 利用MinIO輕鬆搭建靜態資源服務
- 搞定SpringBoot多資料來源(3):引數化變更源
- 搞定SpringBoot多資料來源(2):動態資料來源
- 搞定SpringBoot多資料來源(1):多套源策略
- java開發必學知識:動態代理
- 2019 讀過的好書推薦
- springboot+logback 日誌輸出企業實踐(下)
- springboot+logback 日誌輸出企業實踐(上)
我的公眾號(搜尋Mason技術記錄
),獲取更多技術記錄: