適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

OpenAnolis小助手發表於2022-11-28

文/龍蜥社群開發者

Dragonfly2 簡介

Dragonfly 作為 龍蜥社群的映象加速標準解決方案,是一款基於 P2P 的智慧映象和檔案分發工具。它旨在提高大規模檔案傳輸的效率和速率,最大限度地利用網路頻寬。在應用分發、快取分發、日誌分發和映象分發等領域被大規模使用。

現階段 Dragonfly 基於 Dragonfly1.x 演進而來,在保持 Dragonfly1.x 原有核心能力的基礎上,Dragonfly 在系統架構設計、產品能力、使用場景等幾大方向上進行了全面升級。

Dragonfly 架構主要分為三部分 Manager、Scheduler、Seed Peer 以及 Peer 各司其職組成 P2P 下載網路,Dfdaemon 可以作為 Seed Peer 和 Peer。詳細內容可以參考架構文件,下面是各模組功能:

  • Manager:維護各 P2P 叢集的關聯關係、動態配置管理、使用者態以及許可權管理等功能。也包含了前端控制檯,方便使用者進行視覺化操作叢集。

  • Scheduler:為下載節點選擇最優下載父節點。異常情況控制 Dfdaemon 回源。

  • Seed Peer:Dfdaemon 開啟 Seed Peer 模式可以作為 P2P 叢集中回源下載節點, 也就是整個叢集中下載的根節點。

  • Peer:透過 Dfdaemon 部署,基於 C/S 架構提供 dfget 命令列下載工具,以及 dfget daemon 執行守護程式,提供任務下載能力。

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

更多詳細資訊可以參考 Dragonfly 官網。

問題背景

雖然 Dragonfly 的定位是一個基於 P2P 的檔案分發系統,但是分發的檔案必須是能夠從網路上下載的檔案,無論是 rpm 包還是容器映象內容,最終都是有一個地址源的,使用者可以透過 dfget 命令向 dfdaemon 發起下載請求,然後 Dragonfly P2P 系統負責下載,如果資料不在其他 Peer 上,那麼 Peer 或者 SeedPeer 自己會回源,直接從源下載資料,然後返回給使用者。

但是有些場景我們需要分發的資料是某個節點上生成的,不存在一個遠端的源地址,這個時候 Dragonfly 就無法分發這種資料了。所以我們希望 Dragonfly 能夠增加對這種場景的支援,其實相當於把 Dragonfly 當作了一個分散式的基於 P2P 的快取和任意資料分發系統。

擴充套件 Dragonfly2

所以我們設想中的 Dragonfly 快取系統架構是這樣的:

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

  • 每個計算節點上(比如神龍)部署一個 dfdaemon,作為一個 peer 加入 P2P 網路。

  • 接受來自本節點的請求

  • 為其他 peer 提供上傳服務

  • 每個 peer 只負責管理自己本地的 cache 資料,不負責回源,回源由業務程式負責

  • 每個叢集可以部署一個到多個基於 ECS 的 scheduler 節點。

  • 記錄檔案 P2P 網路的檔案資訊

  • 下載排程

  • 多 scheduler 節點解決單點故障問題

  • 每個 cache 系統中的檔案都會透過 ringhash 對映到某個 scheduler 上

  • 一個或者多個 Manager 作為叢集管理者。

  • 負責向 scheduler 和 peer 節點傳送動態配置

  • 收集 metrics 等資訊

介面設計

dfdaemon 介面

原來的 daemon 介面:

pkg/rpc/dfdaemon/dfdaemon.proto
// Daemon Client RPC Service
service Daemon{
  // Trigger client to download file
  rpc Download(DownRequest) returns(stream DownResult);
  // Get piece tasks from other peers
  rpc GetPieceTasks(base.PieceTaskRequest)returns(base.PiecePacket);
  // Check daemon health
  rpc CheckHealth(google.protobuf.Empty)returns(google.protobuf.Empty);
}

新增 4 個介面:

service Daemon { 
// Check if given task exists in P2P cache system
rpc StatTask(StatTaskRequest) returns(google.protobuf.Empty);
// Import the given file into P2P cache system
rpc ImportTask(ImportTaskRequest) returns(google.protobuf.Empty);
// Export or download file from P2P cache system
rpc ExportTask(ExportTaskRequest) returns(google.protobuf.Empty);
// Delete file from P2P cache system
rpc DeleteTask(DeleteTaskRequest) returns(google.protobuf.Empty);
}

scheduler 介面

原來的 scheduler 介面:

// Scheduler System RPC Service
service Scheduler{
// RegisterPeerTask registers a peer into one task.
rpc RegisterPeerTask(PeerTaskRequest)returns(RegisterResult);
// ReportPieceResult reports piece results and receives peer packets.
// when migrating to another scheduler,
// it will send the last piece result to the new scheduler.
rpc ReportPieceResult(stream PieceResult)returns(stream PeerPacket);
// ReportPeerResult reports downloading result for the peer task.
rpc ReportPeerResult(PeerResult)returns(google.protobuf.Empty);
// LeaveTask makes the peer leaving from scheduling overlay for the task.
rpc LeaveTask(PeerTarget)returns(google.protobuf.Empty);
}

新增 2 個介面,下載複用之前的 RegisterPeerTask()介面,刪除複用之前的LeaveTask() 介面:

// Scheduler System RPC Service
service Scheduler{
// Checks if any peer has the given task
rpc StatTask(StatTaskRequest)returns(Task);
// A peer announces that it has the announced task to other peers
rpc AnnounceTask(AnnounceTaskRequest) returns(google.protobuf.Empty);
}

介面請求時序圖

StatTask

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

ImportTask

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

ExportTask

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

DeleteTask

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

程式碼實現

目前程式碼已經合併,可以在 Dragonfly v2.0.3 版本中使用。

upstream PR:

使用方法

除了增加新的介面之外,我們還增加了一個叫 dfcache 的命令,用於測試,使用方法如下:

- add a file into cache system
dfcache import --cid sha256:xxxxxx --tag testtag /path/to/file
- check if a file exists in cache system
dfcache stat --cid testid --local # only check local cache
dfcache stat --cid testid # check other peers as well
- export/download a file from cache system
dfcache export --cid testid -O /path/to/output
- delete a file from cache system, both local cache and P2P network
dfcache delete -i testid -t testtag

測試及效果

測試方法

透過新增的 dfcache 命令,在一個節點上向 P2P cache 系統中新增不同大小的檔案,然後在另外一個節點上針對這個檔案做查詢、下載、刪除等操作。例如:

# dd if=/dev/urandom of=testfile bs=1M count =1024
# dfcache stat -i testid # 檢查一個不存在的檔案
# dfcache import -i testid testfile
# on another node
# dfcache stat -i testid
# dfcache export -i testid testfile.export

測試效果

兩臺 ecs,網路走 vpc,頻寬 3.45 Gbits/s (約 440MiB/s):

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

下載的 ecs 磁碟頻寬 180MiB/s 左右:

適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術

相關閱讀連結可移步龍蜥公眾號(OpenAnolis龍蜥)2022年11月25日相同推送檢視。

—— 完 ——


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

相關文章