MinIO 的分佈式部署

高可用分佈式對象存儲,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 是上傳的文件對象:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eGs3KFcr-1588260318725)( https://gitee.com/mianshenglee/datastorage/raw/master/md-photo/20200331-minio/store-cotent.png )]

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 &

注意替換命令中的變更,運行後輸出信息如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7uPQP9eu-1588260318740)( https://gitee.com/mianshenglee/datastorage/raw/master/md-photo/20200331-minio/start-ok.png )]

可見 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實例,從而模擬四個節點。運行結果如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-itTyT7j5-1588260318747)( https://gitee.com/mianshenglee/datastorage/raw/master/md-photo/20200331-minio/dis-start-log.png )]

查看進程ps -ef |grep minio

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8gbP8Xup-1588260318752)( https://gitee.com/mianshenglee/datastorage/raw/master/md-photo/20200331-minio/dis-ps.png )]

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}:9001http://${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 的分佈式部署,希望對大家有幫助。

參考資料

往期文章

我的公衆號(搜索Mason技術記錄),獲取更多技術記錄:

mason

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章