天天看點

OSS_PIPE:Rust編寫的大規模檔案遷移工具

作者:京東雲開發者

文盤rust 好久沒有更新了。這段時間筆者用rust寫了個小東西,跟各位分享一下

背景

随着業務的發展,檔案數量和檔案大小會急劇增加,檔案遷移的數量和難度不斷攀升。oss_pipe 是rust編寫的檔案遷移工具,旨在支撐大規模的檔案遷移場景。

編寫 oss_pipe 的初衷

•同類産品面臨的問題

•rust 語言帶來的技術紅利

•oss_pipe 的基本功能

常見的 oss 遷移工具

•ossimport 阿裡出品,java語言編寫,支援存量增量同步,支援大部分雲場的oss資料源

•ossutil 阿裡出品,go語言編寫,遷移隻是輔助功能,主要是阿裡對象存儲的管理用戶端

•COS Migration 騰訊出品,java語言編寫 文檔中未見增量遷移部分

出品方 開發語言 可執行檔案size
ossimport 阿裡 java 單機版16MB
COS Migration 騰訊 java 31MB
Kodoimport 七牛 golang 31MB
oss_pipe 京東 rust 12MB

同類産品面臨的問題

•程式設計語言方面,java golang 這些帶vm的語言容易産生OOM

•功能相對齊全的工具,如ossimport需要部署java runtime環境,安裝步驟繁瑣

•運作期間不僅需要條件本身參數還需要,複雜場景下還需要對jvm進行調優,對現場工程師要求較高

rust 語言帶來的技術紅利

•記憶體安全性:通過所有權、借用和生命周期機制,Rust 在編譯時確定記憶體安全,無需垃圾回收。

•性能:接近 C/C++ 的性能,無額外運作時開銷,适合系統級程式設計。

•并發處理:所有權模型簡化并發程式設計,減少資料共享和複雜性。

•可靠性和生産力:強類型系統、模式比對和豐富的工具鍊提高代碼品質和開發效率。

•多平台支援:支援多種作業系統和硬體平台,便于跨環境部署。

•現代語言特性:結合函數式和泛型程式設計,同時保持與傳統系統程式設計語言的相容性。

•社群和生态系統:活躍的社群和成熟的生态系統,支援快速的語言發展和項目建構。

oss_pipe 的基本功能

•主要功能全量遷移存量遷移增量遷移斷點續傳大檔案拆分上傳正規表達式過濾線程數與上傳快大小組合控制帶寬

•存儲适配及支援清單京東雲對象存儲阿裡雲對象存儲騰訊雲對象存儲華為雲對象存儲AWS對象存儲Minio本地

實作機制

OSS_PIPE:Rust編寫的大規模檔案遷移工具



性能測試

•檔案上傳 為了不讓io拖後腿選擇了京東雲增強型ssd 任務配置

task_id: '7171391438628982785'
name: transfer local to oss
task_desc:
  type: transfer
  source: /mnt/ext/t_upload
  target:
    provider: JD
    access_key_id: JDC_xxxxxxx
    secret_access_key: xxxxx61xxx
    endpoint: http://s3-internal.cn-north-1.jdcloud-oss.com
    region: cn-north-1
    bucket: jsw-bucket
  attributes:
          #bach_size: 1
    objects_per_batch: 1
    task_parallelism: 8
    max_errors: 1
    meta_dir: /tmp/meta_dir
    target_exists_skip: false
    start_from_checkpoint: false
    large_file_size: 500m
    multi_part_chunk_size: 100m
    multi_part_chunk_per_batch: 20
    multi_part_parallelism: 24
    transfer_type: stock

           
OSS_PIPE:Rust編寫的大規模檔案遷移工具



從監控上課,傳輸網絡最高峰值超過1G,磁盤io基本滿載,1.3T資料最好成績1689秒

•oss 間同步

任務配置

task_id: '7178591798162493441'
name: transfer oss to oss
task_desc:
  type: transfer
  source:
    provider: JD
    access_key_id: JDC_xxxxxx
    secret_access_key: 53A1D2xxxx
    endpoint: http://s3-internal.cn-north-1.jdcloud-oss.com
    region: cn-north-1
    bucket: jsw-bucket
  target:
    provider: JD
    access_key_id: JDC_xxxxx
    secret_access_key: 53Axxxxxxx
    endpoint: http://s3-internal.cn-north-1.jdcloud-oss.com
    region: cn-north-1
    bucket: jsw-bucket-1
  attributes:
    objects_per_batch: 1
    task_parallelism: 4
    max_errors: 1
    meta_dir: /tmp/meta_dir
    target_exists_skip: false
    start_from_checkpoint: false
    large_file_size: 500m
    multi_part_chunk_size: 100m
    multi_part_chunks_per_batch: 10
    multi_part_parallelism: 24
    transfer_type: stock

           
OSS_PIPE:Rust編寫的大規模檔案遷移工具



1.3T 内網間傳輸 2110秒 完成

寫在最後 oss pipe還在開發階段,我們也願意和有需求的小夥伴功能成長。由于oss 簽名的限制,大量的cpu消耗在計算前面上面,為了解決這個問題我們魔改了aws s3 rust 版本的sdk,有在遷移場景有需求的同學可以私信找我。

作者:京東科技 賈世聞

來源:京東雲開發者社群

繼續閱讀