MinIO 是一個高性能的物件存儲系統,設計用於大規模的數據存儲需求, 甚至是各種非結構化數據也都能往這邊儲存, 也支持群集擴展, 非常適合正在尋找儲存方案的朋友們。
我們在「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」介紹了如何從kafka將資料流到minio, 但該篇的主軸在於完整的檔案一次上傳, 這一次我們要來鑽研一下如何模擬本地檔案串流上傳到minio的過程, 接著我們會另外撰寫一篇主題來談談如何結合kafka。
我們今天的主題來談談如何使用Python將檔案「串流」上傳到minio,為什麼要特別提到串流? 主要是隨著時代的演進, 應用逐漸從批次處理轉為即時處理, 使用者體驗逐漸強調「即時」, 而背後的技術從應用程式、訊息佇列、資料庫、儲存媒介也都開始支持「串流功能」, 今天我們將針對「MinIO」這套媒介進行「串流」功能的介紹, 並實際使用「Python」進行展示。
這邊我們使用docker來運行minio, 並提供docker compose的配置檔如下:
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: server /data --console-address ":9001"
接著請啟動服務:
docker compose up -d
啟動服務之後我們就準備開始實作囉!
這邊我們需要安裝一下Minio Client才能由客戶端進行檔案上傳。
pip install minio
client = Minio(
endpoint='minio:9000',
access_key='minioadmin',
secret_key='minioadmin',
secure=False,
)
bucket_name = 'files'
# 建立儲存桶
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
這個內部Buffer流主要做為minio put_object與記憶體之間的檔案封包橋樑, 我們可能會從本地檔案、kafka、遠端伺服器拉取檔案封包, 我們可以將這些檔案封包暫存在我們記憶體實作的I/O流, 讓minio client自動去分塊上傳, 避免大檔案要一次拿取完才能上傳到minio伺服器。
這個Buffer流的實作是關鍵重點的部份, 它就像接水管一樣, 將來源與目的橋接, 順利讓資料流入, 大致上的設計草圖如下:
程式碼如下:
我們將上傳到minio的部份用另外一個執行緒去進行, 這是因為我們必須讓讀寫分離才能夠很好的實驗控制的邏輯。
當我們讀完「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」 都知道上傳的關鍵函數是「put_object」, 它可以接入一條資料水管, 正好將我們設計的資料水管給接入看看。
我們試著打開Monitoring → Trace來追蹤上傳的狀況, 這邊我們可以看到每5MB一包為單位進行上傳的過程。
最後上傳成功才會出現檔案如下:
處理部份上傳的部份也真是不容易啊! 過程中不斷的翻閱官方文檔與試誤, 最終勉強的試出一條可以用Buffer流控制分段上傳的實現方案, 也讓我們更深入的了解到put_object的使用方式。