適用場景全新升級!擴充套件 Dragonfly2 作為分散式快取系統架構 | 龍蜥技術
文/龍蜥社群開發者
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 執行守護程式,提供任務下載能力。
更多詳細資訊可以參考 Dragonfly 官網。
問題背景
雖然 Dragonfly 的定位是一個基於 P2P 的檔案分發系統,但是分發的檔案必須是能夠從網路上下載的檔案,無論是 rpm 包還是容器映象內容,最終都是有一個地址源的,使用者可以透過 dfget 命令向 dfdaemon 發起下載請求,然後 Dragonfly P2P 系統負責下載,如果資料不在其他 Peer 上,那麼 Peer 或者 SeedPeer 自己會回源,直接從源下載資料,然後返回給使用者。
但是有些場景我們需要分發的資料是某個節點上生成的,不存在一個遠端的源地址,這個時候 Dragonfly 就無法分發這種資料了。所以我們希望 Dragonfly 能夠增加對這種場景的支援,其實相當於把 Dragonfly 當作了一個分散式的基於 P2P 的快取和任意資料分發系統。
擴充套件 Dragonfly2
所以我們設想中的 Dragonfly 快取系統架構是這樣的:
-
每個計算節點上(比如神龍)部署一個 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
ImportTask
ExportTask
DeleteTask
程式碼實現
目前程式碼已經合併,可以在 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):
下載的 ecs 磁碟頻寬 180MiB/s 左右:
相關閱讀連結可移步龍蜥公眾號(OpenAnolis龍蜥)2022年11月25日相同推送檢視。
—— 完 ——
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2925560/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 可擴充套件Web架構與分散式系統套件Web架構分散式
- 讀構建可擴充套件分散式系統:方法與實踐05分散式快取套件分散式快取
- 小工匠聊架構 - 分散式快取技術_快取設計架構分散式快取
- 全面升級!龍蜥自動化運維平臺 SysOM 2.0 可支援作業系統一站式遷移 | 龍蜥技術運維作業系統
- 大型分散式網站架構:快取在分散式系統中的應用分散式網站架構快取
- 理解分散式系統中的快取架構(下)分散式快取架構
- 理解分散式系統中的快取架構(上)分散式快取架構
- 作業系統遷移難?Alibaba Cloud Linux 支援跨版本升級 | 龍蜥技術作業系統CloudLinux
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- 億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(下)?【石杉的架構筆記】架構套件筆記
- 億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(上)?【石杉的架構筆記】架構套件筆記
- 億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(中)?【石杉的架構筆記】架構套件筆記
- 深入理解分散式系統中的快取架構(下)分散式快取架構
- 分散式快取架構綜述分散式快取架構
- 讀構建可擴充套件分散式系統:方法與實踐03分散式系統要點套件分散式
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- Deco 編輯器高擴充套件性技術架構解析套件架構
- 大型網站技術架構(七)--網站的可擴充套件性架構網站架構套件
- Alluxio在多級分散式快取系統中的應用UX分散式快取
- 分散式快取GemFire架構介紹分散式快取架構
- 打造企業級微服務平臺架構,分散式應用場景管理微服務架構分散式
- 龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術Linux
- YouTube的架構擴充套件架構套件
- MySQL 高擴充套件架構構建百萬線上系統實踐MySql套件架構
- 讀構建可擴充套件分散式系統:方法與實踐08微服務套件分散式微服務
- 讀構建可擴充套件分散式系統:方法與實踐14流處理系統套件分散式
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- AbpVnext使用分散式IDistributedCache Redis快取(自定義擴充套件方法)分散式Redis快取套件
- Java架構師面試題全集:Java基礎+技術框架+系統架構+分散式系統Java架構面試題框架分散式
- 新年新技術:最佳化擴充套件分散式資料庫的隔離級別套件分散式資料庫
- PHP擴充套件快取加速安裝PHP套件快取
- 【經典揭祕】集中式架構怎麼升級為分散式架構?架構分散式
- 深入解讀雲場景下的網路抖動 | 龍蜥技術
- 鴻蒙系統(OpenHarmony HarmonyOS):面向全場景的分散式作業系統鴻蒙分散式作業系統
- 分散式系統中有哪些快取?分散式快取
- 分散式快取系統之Memcached分散式快取
- 分散式架構中非同步的使用場景分散式架構非同步
- 分散式系統快取系列一 認識快取分散式快取