搭配 Azure 受控 Lustre 使用 Azure Blob 儲存體

Azure Managed Lustre 與 Azure Blob 儲存體 整合,以簡化將數據從 Blob 容器匯入文件系統的程式。 您也可以將資料從文件系統匯出至 Blob 容器以供長期儲存。 本文說明使用 Blob 與 Azure 受控 Lustre 文件系統整合的概念。

若要瞭解相容 Blob 容器所需的需求和設定,請參閱 Blob 整合必要條件

Blob 整合概觀

您可以在叢集建立期間設定 Blob 整合,而且可以在建立叢集之後隨時建立匯入作業。 匯入數據之後,您可以像使用其他檔案系統數據一樣處理數據。 在文件系統中建立新檔案或修改現有檔案時,您可以在用戶端上執行 Lustre CLI 命令,或使用 匯出作業匯出數據,將這些檔案導出回記憶體帳戶。

當您將數據從 Blob 容器匯入至 Azure 受控 Lustre 文件系統時,只會將檔名 (namespace) 和元數據匯入 Lustre 命名空間。 第一次由用戶端存取時,會匯入 Blob 的實際內容。 第一次存取數據時,Lustre 階層式記憶體管理 (HSM) 功能會將 Blob 內容提取到文件系統中的對應檔案時,會有輕微的延遲。

您可以使用 Lustre 的 lfs hsm_restore 命令,從具有 sudo 功能的掛接用戶端預先擷取 Blob 的內容。 若要深入瞭解,請參閱 從 Blob 記憶體還原數據。

Azure 受控 Lustre 適用於已啟用階層命名空間的記憶體帳戶,以及具有非階層式或一般命名空間的記憶體帳戶。 適用下列次要差異:

  • 針對已啟用階層命名空間的記憶體帳戶,Azure 受控 Lustre 會從 Blob 標頭讀取 POSIX 屬性。
  • 對於未啟用階層命名空間的記憶體帳戶,Azure 受控 Lustre 會從 Blob 元數據讀取 POSIX 屬性。 系統會建立與 Blob 容器內容同名的個別空白檔案,以保存元數據。 此檔案是 Azure 受控 Lustre 檔案系統中實際數據目錄的同層級。

從 Blob 記憶體匯入

您可以在叢集建立期間設定與 Blob 記憶體的整合,而且您可以在建立叢集之後隨時建立匯入作業

Blob 容器需求

在叢集建立期間設定 Blob 整合時,您必須識別兩個不同的 Blob 容器:要匯入的容器和記錄容器。 要匯入的容器包含您想要匯入至 Azure Managed Lustre 檔案系統的數據。 記錄容器用來儲存匯入作業的記錄。 這兩個容器必須位於相同的記憶體帳戶中。 若要深入瞭解 Blob 容器的需求,請參閱 Blob 整合必要條件

匯入前置詞

從 Blob 容器匯入數據時,您可以選擇性地指定一或多個前置詞,以篩選匯入至 Azure Managed Lustre 檔案系統的數據。 符合其中一個前置詞的 Blob 容器中檔名會新增至文件系統中的元數據記錄。 當用戶端第一次存取檔案時,會從 Blob 容器擷取其內容,並儲存在文件系統中。

在 Azure 入口網站 中,在叢集建立期間,使用 [進階] 索引標籤上的 [匯入前置詞] 字段,指定要從 Blob 容器匯入的數據。 這些欄位僅適用於初始匯入作業。 建立叢集之後,您無法變更彙入前置詞。

針對匯入作業,您可以在建立作業時指定匯入前置詞。 從 Azure 入口網站,您可以在 [匯入前置詞] 欄位中指定匯入前置詞。 您也可以在使用 REST API 建立匯入作業時指定匯入前置詞。

指定匯入前置詞時,請記住下列考慮:

  • 預設彙入前置詞為 /。 此預設行為會匯入整個 Blob 容器的內容。
  • 如果您指定多個前置詞,前置詞必須是非重疊的。 例如,如果您指定 /data/data2,匯入作業會因為前置詞重迭而失敗。
  • 如果 Blob 容器位於已啟用階層命名空間的記憶體帳戶中,您可以將前置詞視為檔案路徑。 路徑底下的專案會包含在 Azure 受控 Lustre 檔案系統中。
  • 如果 Blob 容器位於具有非階層式(或一般)命名空間的記憶體帳戶中,您可以將匯入前置詞視為與 Blob 名稱開頭比較的搜尋字串。 如果容器中的 Blob 名稱以您指定為匯入前置詞的字串開頭,則會在文件系統中存取該檔案。 Lustre 是階層式文件系統, / Blob 名稱中的字元會在 Lustre 中儲存時成為目錄分隔符。

衝突解決模式

從 Blob 容器匯入資料時,您可以指定如何處理 Blob 容器與檔案系統之間的衝突。 此選項僅適用於針對現有叢集執行的匯入作業。 下表顯示可用的衝突解決模式及其描述:

模式 描述
fail 如果偵測到衝突,匯入作業會立即失敗,併發生錯誤。
skip 如果偵測到衝突,匯入作業會略過檔案。
overwrite-dirty 匯入作業會評估衝突的路徑,以查看是否應該刪除並重新匯入。 若要深入瞭解,請參閱 覆寫-髒模式
overwrite-always 匯入作業會評估衝突的路徑,如果路徑已變更,則一律會刪除/重新匯入,或者如果已清除,則會釋出。 若要深入瞭解,請參閱 覆寫一律模式

覆寫-髒模式

模式 overwrite-dirty 會評估衝突的路徑,以查看是否應該刪除並重新匯入。 概括而言, overwrite-dirty 模式會檢查 HSM 狀態。 如果 HSM 狀態為 Clean and Archived,這表示其數據與 Lustre 所能告知的 Blob 容器同步,則視需要只更新屬性。 否則,會從 Blob 容器刪除並重新匯入檔案。

檢查 HSM 狀態並不保證 Lustre 中的檔案符合 Blob 容器中的檔案。 如果您必須確保 Lustre 中的檔案盡可能符合 Blob 容器中的檔案,請使用 overwrite-always 模式。

覆寫一律模式

overwrite-always此模式會評估衝突的路徑,如果路徑已變更,則一律會刪除/重新匯入,或清除時釋放。 當您想要確保文件系統一律與 Blob 容器同步時,此模式很有用。 這也是最昂貴的選項,因為每個先前還原的檔案都會在第一次存取時釋放或刪除/重新匯入。

容錯

從 Blob 容器匯入資料時,您可以指定容錯。 錯誤容錯層級會決定匯入作業如何處理匯入程式期間發生的暫時性錯誤,例如操作系統錯誤或網路中斷。 請務必注意,此內容中的錯誤不會參考由衝突解決模式處理的檔案衝突。

下列錯誤容錯選項可用於匯入工作:

  • 不允許錯誤 (預設值):如果匯入期間發生任何錯誤,匯入作業會立即失敗。 這是預設行為。
  • 允許錯誤:如果發生錯誤,匯入作業會繼續,並記錄錯誤。 匯入作業完成之後,您可以在記錄容器中檢視錯誤。

Blob 匯入作業的考慮

從 Blob 容器匯入數據時,請務必考慮下列專案:

  • 一次只能執行一個匯入或匯出動作。 例如,如果匯入作業正在進行中,嘗試啟動另一個匯入作業會傳回錯誤。
  • 您可以取消匯入作業。 您可以取消在現有叢集上啟動的匯入作業,或是在叢集建立期間起始的匯入作業。
  • 叢集部署可以在對應的匯入作業完成之前成功傳回。 匯入作業會繼續在背景中執行。 您可以透過下列方式監視匯入作業的進度:
    • Azure 入口網站:Azure 入口網站 會顯示匯入作業的狀態。 流覽至文件系統,然後選取 [Blob 整合 ] 以檢視匯入作業狀態。
    • 根目錄中的 Lustre 檔案:在匯入期間,Lustre 根目錄中會建立名為 類似 /lustre/IMPORT_<state>.<timestamp_start> 的檔案。 <state>佔位元會在匯入進行時變更。 匯入作業成功完成時,會刪除檔案。
  • 若要檢視已完成匯入作業的詳細數據,您可以檢查記錄容器。 記錄容器包含匯入作業的記錄,包括匯入期間發生的任何錯誤或衝突。
  • 如果匯入作業因任何原因而失敗,您可能沒有匯入作業的完整統計數據,例如匯入的檔案數目或衝突數目。

從 Blob 記憶體還原數據

根據預設,Blob 的內容會在用戶端第一次存取對應的檔案時匯入文件系統。 針對某些工作負載和案例,您可能會偏好先從 Blob 容器還原數據,再進行第一次存取。 您可以選擇預先擷取 Blob 的內容,以避免在匯入後第一次存取 Blob 時發生初始延遲。 若要預先擷取 Blob 的內容,您可以從具有 sudo 功能的掛接用戶端使用 Lustre 的 lfs hsm_restore 命令。 下列命令會將 Blob 的內容預先擷取至檔案系統:

nohup find local/directory -type f -print0 | xargs -0 -n 1 sudo lfs hsm_restore &

此命令會告知元數據伺服器以異步方式處理還原要求。 命令行不會等待還原完成,這表示命令行有可能在元數據伺服器上排入大量專案以進行還原。 此方法可能會讓元數據伺服器不知所措,並降低還原的效能。

若要避免這個潛在的效能問題,您可以建立基本腳本,以嘗試以指定大小的批次來逐步執行路徑併發出還原要求。 若要達到合理的效能並避免壓倒元數據伺服器,建議您在1,000到5,000個要求的任何位置使用批次大小。

範例:建立批次還原腳本

下列範例示範如何建立腳本,以批次方式從 Blob 容器還原數據。 建立名為 file_restorer.bash 的檔案,包含以下內容:

#!/bin/bash
set -feu
set -o pipefail
main()
{
    if [ $# -lt 2 ]; then
        echo "$0 <path_to_fully_restore> <max_restores_at_a_time>"
        echo "Missing parameters"
        exit 1
    fi
    local RESTORE_PATH=$1
    local MAX_RESTORES=$2
    local FILES_LIST="/tmp/files_to_restore"
    find "$RESTORE_PATH" -type f > "$FILES_LIST"
    local TOTAL_FILES
    TOTAL_FILES=$(wc -l "$FILES_LIST")
    local RESTORE_TOTAL=0
    local RESTORE_COUNT=0
    while IFS="" read -r p || [ -n "$p" ]; do
        printf '%s\n' "$p"
        lfs hsm_restore "$p"
        ((RESTORE_COUNT++)) || true
        ((RESTORE_TOTAL++)) || true
        if (( RESTORE_COUNT >= MAX_RESTORES )); then
            while true; do
                local STATE
                STATE=$(lfs hsm_state "$p")
                RELEASED=') released exists archived'
                if ! [[ $STATE =~ $RELEASED ]]; then
                    echo "Restored $RESTORE_TOTAL / $TOTAL_FILES"
                    break
                fi
                sleep 0.2
            done
            RESTORE_COUNT=0
        fi
    done < "$FILES_LIST"
}
main "$@"

下列範例示範如何與範例輸出一起執行腳稿:

root@vm:~# time ~azureuser/file_restorer.bash /lustre/client/ 5000
Finding all files to restore beneath: /lustre/client/
Found 78100 to restore
Initiating restores in batches of 5000...
Restored 5000 / 78100
Restored 10000 / 78100
Restored 15000 / 78100
Restored 20000 / 78100
Restored 25000 / 78100
Restored 30000 / 78100
Restored 35000 / 78100
Restored 40000 / 78100
Restored 45000 / 78100
Restored 50000 / 78100
Restored 55000 / 78100
Restored 60000 / 78100
Restored 65000 / 78100
Restored 70000 / 78100
Restored 75000 / 78100
Restored 78100 / 78100
real	6m59.633s
user	1m20.273s
sys	0m37.960s

注意

目前,Azure 受控 Lustre 會以 ~7.5GiB/秒的最大輸送量速率,從 Blob 記憶體還原數據。

使用匯出作業將數據匯出至 Blob 記憶體

您可以藉由建立匯出作業,將數據從 Azure 受控 Lustre 檔案系統複製到 Azure Blob 儲存體 中的長期記憶體。

匯出作業期間會匯出哪些檔案?

當您從 Azure Managed Lustre 系統匯出檔案時,並非所有檔案都會複製到您在建立文件系統時指定的 Blob 容器。 下列規則適用於匯出作業:

  • 匯出作業只會複製新檔案或內容已修改的檔案。 如果在文件系統建立期間從 Blob 容器匯入的檔案未變更,匯出作業就不會匯出檔案。
  • 只有元數據變更的檔案不會匯出。 元數據變更包括:擁有者、許可權、擴充屬性和名稱變更(已重新命名)。
  • 在匯出作業期間,在 Azure 受控 Lustre 檔案系統中刪除的檔案不會在原始 Blob 容器中刪除。 匯出作業不會刪除 Blob 容器中的檔案。

在作用中文件系統中執行匯出作業

在作用中文件系統中,在匯出作業期間變更檔案可能會導致失敗狀態。 此失敗狀態可讓您知道檔案系統中的所有資料無法匯出至 Blob 記憶體。 在此情況下,您可以藉由 建立新的導出作業來重試匯出。 新的作業只會複製先前作業中未複製的檔案。

在具有大量活動的文件系統中,重試可能會失敗多次,因為檔案經常變更。 若要確認檔案已成功匯出至 Blob 記憶體,請檢查對應 Blob 上的時間戳。 作業完成之後,您也可以檢視在部署時間設定的記錄容器,以查看匯出作業的詳細資訊。 記錄容器提供哪些檔案失敗的診斷資訊,以及失敗的原因。

如果您要準備解除委任叢集,並想要執行最後匯出至 Blob 記憶體,您應該先確定所有 I/O 活動都已停止,再起始匯出作業。 這種方法有助於藉由避免文件系統活動所造成的錯誤來保證所有數據都會匯出。

匯出檔案的元數據

將檔案從 Azure Managed Lustre 檔案系統匯出至 Blob 容器時,會儲存額外的元數據,以簡化將內容重新匯入文件系統。

下表列出 Lustre 檔案系統中儲存為索引鍵/值組的 POSIX 屬性:

POSIX 屬性 類型
owner int
group int
permissions octal 或 rwxrwxrwx 格式;支援黏性位

目錄屬性會儲存在空的 Blob 中。 此 Blob 的名稱與目錄路徑相同,並在 Blob 元數據中包含下列機碼/值組: hdi_isfolder : true

您可以使用容器來凍結新的 Lustre 叢集之前,先手動修改 POSIX 屬性。 使用稍早所述的機碼/值組來編輯或新增 Blob 元數據。

匯出作業的考慮

使用匯出作業匯出數據時,請務必考慮下列專案:

  • 一次只能執行一個匯入或匯出動作。 例如,如果匯出作業正在進行中,嘗試啟動另一個匯出作業會傳回錯誤。

使用 AzCopy 或 儲存體總管 複製 Lustre Blob 容器

您可以使用 AzCopy 或 儲存體總管 來移動或複製 Blob 容器 Lustre 使用。

針對 AzCopy,您可以新增下列旗標來包含目錄屬性:

--include-directory-stub

包含此旗標會在傳輸期間保留目錄 POSIX 屬性, 例如、 ownergrouppermissions。 如果您在 azcopy 不含此旗標的記憶體容器上使用 ,或將旗標設定為 false,則數據與目錄會包含在傳輸中,但目錄不會保留其 POSIX 屬性。

在 儲存體總管 中,您可以選取 [傳輸] 並核取 [包含目錄存根] 的方塊,在 [設定] 中啟用此旗標。

此螢幕快照顯示如何在傳輸 儲存體總管 期間包含目錄存根。

下一步