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本地

實現機制

 

 



性能測試

•文件上傳 爲了不讓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

 

 



從監控上課,傳輸網絡最高峯值超過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

 

 



1.3T 內網間傳輸 2110秒 完成

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

作者:京東科技 賈世聞

來源:京東雲開發者社區

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