一篇文章告訴你物件儲存底層的工作機制

張哥說技術發表於2023-04-10

來源:中介軟體興趣圈

1、MinIO叢集拓撲結構

MinIO可以部署到三種型別的拓撲:

  • Single Node Single Drive 一個Server節點,並且一個磁碟驅動器或者一個資料夾。例如,在本地PC上使用計算機硬碟驅動器上的資料夾進行測試。

  • Single Node Multi Drive

    單Server節點,多磁碟驅動器或多個資料夾。

  • Multi Node Multi Drive 多Server節點,多磁碟驅動器或多個資料夾。

2、分散式MinIO如何工作

2.1 MinIO如何管理多個虛擬機器或物理節點

Server Pool由多個Minio服務節點與其附屬的多個磁碟構成。MinIO支援向現有MinIO叢集中增加一個或多個Server Pool,從而實現水平擴容。

當MinIO中有多個可用的Server Pool時,單個物件總是寫入其中的一個Server Pool,如果一個Server Pool發生故障,並不會影響其他Server Pool的讀寫。

minio server命令中透過指定HOSTNAME引數來表示一個Server Pool,下面的命令表示建立一個單獨的Server Pool,包含4個minio伺服器節點,每一個伺服器節點擁有4個驅動器(磁碟),總共16塊盤。

一篇文章告訴你物件儲存底層的工作機制

其中hostname分別為minio1.example.net、minio2.example.net、minio3.example.net、minio4.example.net。

2.2 如何將多個Server Pool組合成一個MinIO叢集

minio server命令可以指定一個或多個Server Pool,這樣就多個Server Pool就構成了一個邏輯MinIO叢集,例如下面的命令,會建立2個Server Pool。

minio server {1...4}.example.net/mnt/disk{1...4} \
             {5...8}.example.net/mnt/disk{1...4}

在一個MinIO叢集中總是會將一個物件的多個版本儲存在同一個Server Pool中,MinIO強烈建議生產叢集一個Server Pool中至少包含4個MinIO伺服器節點,以保證適當的高可用性和永續性。

2.3 MinIO叢集水平伸縮

MinIO分散式叢集支援擴縮容功能,以增加或減少可用儲存。

水平擴容:支援向現有MinIO叢集中新增一個或多個Server Pool,已增加叢集整體資源,Server Pool內部的節點數一旦建立則無法修改。

水平縮容:對於擁有多個Server Pool的叢集,我們可以使用decommission命令啟動Server Pool的下線流程。溫馨提示:一旦執行該操作,就無法停止,後續也無法再進行讀寫。請慎重處理。

2.3 如何管理MinIO叢集

目前我們可以透過如下幾種方式來管理MinIO叢集:

  • 使用命令列工具:mc 和 mc admin
  • 使用MinIO官方提供的MinIO Console圖形化介面
  • K8s叢集環境中可以 MinIO Operator Console圖形化介面

2.4 如何管理物件分佈

MinIO不會將物件從舊的Server Pool中自動遷移到新新增的Server Pool中,即不會進行重平衡。但是,MinIO根據儲存空閒大小進行加權選擇,空閒空間越大的Server Pool會承擔更多的寫入流量,加權值是Server Pool的空閒空間量除以所有可用池上的空閒空間。

MinIO客戶端版本從RELEASE.2022-11-07T23-47-39Z開始,你可以使用mc admin rebalance手動啟動一個跨所有Server Pool的重平衡操作。

重新平衡不會阻塞正在進行的操作,但可能會導致業務的讀寫的效能降低。可以考慮在業務非高峰時段執行重平衡操作,而且你可以在任何時候可以停止或再次開啟重平衡。

3、物件上傳特性

MinIO完全實現了S3協議,你可以使用任何相容S3協議的客戶端,執行PUT操作將物件儲存到MinIO叢集。MinIO還實現了將一個物件拆分成多個部分後上傳,MinIO會重新組裝這些資訊,直到擁有一個完整的物件後再儲存在叢集中。

4、MinIO高可用性設計

4.1 糾刪碼(Erasure Coding)

MinIO資料高可用性、可靠性和冗餘性高度依賴糾刪碼。

MinIO糾刪碼是一種資料冗餘和可用性特性,能夠容忍部分磁碟損壞的情況下自動修復物件。Erasure Coding提供物件級的修復,與鄰近的技術(如RAID或副本)相比開銷要小得多。

糾刪集(erasure set)是一組支援糾刪碼的多個驅動器集合。

MinIO會將每個物件分割為資料塊和校驗塊,其中校驗塊支援重建丟失或損壞的資料塊。MinIO將這些塊寫入到一個糾刪集(erasure set)中。因此,MinIO可以容忍在部署中丟失多個驅動器或節點,具體取決於配置的奇偶校驗和部署拓撲結構。

MinIO最高的冗餘級別,MinIO可以損失將近一半(N/2 -1)的磁碟情況下還能繼續提供讀寫服務,並且資料不會損壞。

MinIO預設為每一個物件設定4個校驗塊,即可以允許每一個糾刪集(erasure set)丟失4塊磁碟。

4.2 Erasure Sets(糾刪集)

Erasure Set(糾刪集)是一組磁碟組成,MinIO將糾刪碼的物件分塊寫入到其中。MinIO將一個物件的資料塊、校驗塊隨機均勻的分佈在糾刪集的不同磁碟上,同一個物件的同一種型別塊在糾刪集中同一個磁碟上只會出現一次,即不會有一個物件的兩個資料塊或校驗塊出現在糾刪集中同一塊磁碟中。

MinIO根據Server Pool中節點和驅動器的總數自動計算Erasure Sets的數量和大小(stripe size),其中最小stripe size為2,最大stripe size為16。stripe size選擇演算法考慮了部署中的節點總數,使得選中的stripe允許糾刪集中驅動器均勻分佈在池中的所有節點上。

Erasure set stripe size表示部署的最大奇偶校驗值。

4.3 Erasure Code Parity (EC:N)

MinIO使用Reed-Solomon演算法根據Erasure Set大小將物件分割為資料塊和校驗塊。對於磁碟大小為M塊的給定Erasure Set,MinIO將物件分割為N個校驗塊和M-N個資料塊,MinIO叢集預設的EC:N為EC:4,表示每一個物件的校驗塊為4個。

MinIO可以容忍每個Erasure Sets最多N個驅動器的損失,並繼續執行讀寫操作(“仲裁”)。如果N恰好等於擦除集中驅動器的1/2,MinIO寫至少需要N + 1塊驅動器以避免資料不一致(“裂腦”)。

為部署設定EC:N是在可用性和總可用儲存之間取得平衡。較高的EC:N以可用儲存為代價提高驅動器或節點故障的彈性,而較低的EC:N提供最大的儲存空間,降低驅動器/節點故障的容忍度。

下表列出了由1個節點和16塊1TB驅動器組成的MinIO叢集中不同erasure code Parity(EC:N) 的情況,如下圖所示:

EC:N資料盤最大可用容量磁碟利用率讀請求最少需要可用磁碟數寫請求最小需要可用磁碟數
EC:412TB0.7501212
EC:610TB0.6251010
EC:88TB0.50089

4.4 Storage Classes (儲存類)

MinIO透過Erasure Coding支援冗餘儲存類,允許應用程式為每個物件指定EC:N。

用於Erasure Coding的MinIO storage classes與用於分層的Amazon Web Services儲存類不同。MinIO Erasure Coding儲存類定義每個物件的奇偶校驗設定,而AWS儲存類定義每個物件的儲存層。

MinIO提供了STANDARD、REDUCED_REDUNDANCY兩個儲存類,接下來分別介紹。

4.4.1 STANDARD

STANDARD儲存類是所有物件的預設類。MinIO根據Erasure Set中的volumes(卷)數量設定STANDARD奇偶校驗:

Erasure Set SizeDefault Parity (EC:N)
5 or FewerEC:2
6 - 7EC:3
8 or moreEC:4

我們可以透過如下兩種方式覆蓋預設的奇偶校驗:

  • 設定環境變數MINIO_STORAGE_CLASS_STANDARD的值
  • 使用mc admin config命令修改storage_class。

storage_class的EC:N最大值為Erasure Sets中EC:N的一半,最小為2。

STANDARD奇偶校驗必須大於或等於REDUCED_REDUNDANCY。如果未設定REDUCED_REDUNDANCY,則STANDARD奇偶校驗必須大於2。

4.4.2 REDUCED_REDUNDANCY

REDUCED_REDUNDANCY允許建立奇偶校驗值低於STANDARD的物件。如果要設定為REDUCED_REDUNDANCY型別,MinIO叢集中必須需要5個驅動器盤。

MinIO預設將REDUCED_REDUNDANCY奇偶校驗設定為EC:2。您可以使用以下任何一種方法覆蓋REDUCED_REDUNDANCY儲存類奇偶校驗:

  • 透過設定MINIO_STORAGE_CLASS_RRS環境變數的值
  • 使用mc admin config命令修改storage_class。

REDUCED_REDUNDANCY奇偶校驗必須小於或等於STANDARD。

MinIO根據請求頭中的x-amz-storage-class的值來確定講物件分配給哪個儲存類,設定x-amz-storage-class請求頭方法有多重方式:

  • 對於mc命令列工具,某些命令包含用於設定儲存類的特定選項,例如mc cp命令就具有storage-class選項,用於指定要物件的儲存型別。
  • 對於MinIO sdk, S3Client物件有特定的方法來設定請求頭。例如,mini -go SDK S3Client。PutObject方法以PutObjectOptions資料結構作為引數。PutObjectOptions資料結構包括StorageClass選項,用於指定要分配給正在建立的物件的儲存類。

4.5 位損壞修復機制

位損壞是隨機的、無聲的資料損壞,可以發生在任何儲存裝置上。Bit rot損壞不會主動給使用者提示,甚至作業系統也不會主動感知到資料已損壞。

MinIO使用雜湊演算法來確認物件的完整性。如果一個物件因位元位損壞,MinIO會根據糾刪碼自動修復物件。

4.6透過仲裁實現資料讀寫

在MinIO中執行任務必須有可用的最小驅動數,讀寫分別有各自的要求。MinIO需要更多的可用驅動器來維護寫物件的能力,而不是讀物件所需的驅動器,這個取決於EC:N的值,這塊可以參考4.3中的表格加以理想,讀寫需要不同的驅動器數主要是當損壞的磁碟數量佔據一半時,寫需要超過一半數量才能正確寫。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2944655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章