dragonfly 之 p2p 鏡像分發

dragonfly 之 p2p 鏡像分發

支持https harbor,公有或私有倉庫 支持push image

一、什麼是dragonfly

Dragonfly 是一款基於 P2P 的智能鏡像和文件分發工具。它旨在提高文件傳輸的效率和速率,最大限度地利用網絡帶寬,尤其是在分發大量數據時,例如應用分發、緩存分發、日誌分發和鏡像分發。

在阿里巴巴,Dragonfly 每個月會被調用 20 億次,分發的數據量高達 3.4PB。Dragonfly 已成為阿里巴巴基礎設施中的重要一環。

儘管容器技術大部分時候簡化了運維工作,但是它也帶來了一些挑戰:例如鏡像分發的效率問題,尤其是必須在多個主機上覆制鏡像分發時。

Dragonfly 在這種場景下能夠完美支持 Docker 和 PouchContainer。它也兼容其他格式的容器。相比原生方式,它能將容器分發速度提高 57 倍,並讓 Registry 網絡出口流量降低 99.5%。

Dragonfly 能讓所有類型的文件、鏡像或數據分發變得簡單而經濟。

2、Dragonfly 有何優勢(具備以下特性)?

  • 基於 P2P 的文件分發:通過利用 P2P 技術進行文件傳輸,它能最大限度地利用每個對等節點(Peer)的帶寬資源,以提高下載效率,並節省大量跨機房帶寬,尤其是昂貴的跨境帶寬。
  • 非侵入式支持所有類型的容器技術:Dragonfly 可無縫支持多種容器用於分發鏡像。
  • 機器級別的限速:除了像許多其他下載工具(例如 wget 和 curl)那樣的針對當前下載任務的限速之外,Dragonfly 還支持針對整個機器的限速。
  • 被動式 CDN:這種 CDN 機制可防止重複遠程下載。
  • 高度一致性:Dragonfly 可確保所有下載的文件是一致的,即使用戶不提供任何檢查代碼(MD5)。
  • 磁盤保護和高效 IO:預檢磁盤空間、延遲同步、以最佳順序寫文件分塊、隔離網絡-讀/磁盤-寫等等。
  • 高性能:SuperNode 是完全閉環的,意味著它不依賴任何數據庫或分佈式緩存,能夠以極高性能處理請求。
  • 自動隔離異常:Dragonfly 會自動隔離異常節點(對等節點或 SuperNode)來提高下載穩定性。
  • 對文件源無壓力:一般只有少數幾個 SuperNode 會從源下載文件。
  • 支持標準 HTTP 頭文件:支持通過 HTTP 頭文件提交鑑權信息。
  • 有效的 Registry 鑑權併發控制:減少對 Registry 鑑權服務的壓力。
  • 簡單易用:僅需極少的配置。

3、dragonfly原理

Dragonfly 下載普通文件和下載容器鏡像的工作原理略有不同。

下載普通文件

SuperNode 充當 CDN,並負責調度對等節點(Peer)之間的文件分塊傳輸。dfget 是 P2P 客戶端,也稱為“Peer”(對等節點),主要用於下載和共享文件分塊。

dragonfly 之 p2p 鏡像分發

下載鏡像文件

Registry 類似於文件服務器。dfget proxy 也稱為 dfdaemon,會攔截來自 docker pull 或 docker push 的 HTTP 請求,然後使用 dfget 來處理那些跟鏡像分層相關的請求。

dragonfly 之 p2p 鏡像分發

下載文件分塊

每個文件會被分成多個分塊,並在對等節點之間傳輸。一個對等節點就是一個 P2P 客戶端。SuperNode 會判斷本地是否存在對應的文件。如果不存在,則會將其從文件服務器下載到 SuperNode。

dragonfly 之 p2p 鏡像分發

四、dragonfly部署(參考dragonfly官網)

五、dragonfly https的harbor

dragonfly 常見問題

目的:啟用 docker PROXY 讓dragonfly 支持https

1、部署https harbor

2、部署docker_proxy

pull images

pull_images.sh

#!/bin/sh
docker_registry_proxy="dockerhubwp/docker_proxy_nginx:latest"
supernode="registry.cn-hangzhou.aliyuncs.com/alidragonfly/supernode:0.2.0"
dfclient="dockerhubwp/dfclient:latest"
images="${docker_registry_proxy} ${supernode} ${dfclient}"
function pullImage(){
for image in ${images}; do
echo -e "pull image ======>${image}"
docker pull ${image}
done
}
pullImage

docker_proxy.sh

#! /bin/sh
# Separate deployment docker_proxy
# dfdaemon and docker registry map
# example x.x.x
registry="harbor域名"
containername=docker_registry_proxy
# 你需要配置的dns 服務器 (如:dnsmasq)
DNS_SERVER="dns-server"
docker_registry_proxy="dockerhubwp/docker_proxy_nginx:latest"
# get localhost ip
ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
localhostIp=$(echo ${ipaddr} | cut -d " " -f 1)
function changeDockerProxy() {
mkdir -p /etc/systemd/system/docker.service.d
cat </etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:3128/"
Environment="HTTPS_PROXY=http://127.0.0.1:3128/"
EOD
}
function dockerDockerProxyRun() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi

docker run --restart=always --privileged=true --name ${containername} -d -p 0.0.0.0:3128:3128 -v /etc/docker_proxy_nginx/docker_mirror_certs:/ca -v /var/log/docker_proxy_nginx:/var/log/nginx/ -e DRAGONFLY_REGISTRIES="${registry},http://${localhostIp}:65001" -e REGISTRIES="${registry}" -e DNS_SERVER=${DNS_SERVER} ${docker_registry_proxy}
}
changeDockerProxy
systemctl daemon-reload
systemctl restart docker

3、部署dragonfly

部署Supernode

#!/bin/sh
# Separate deployment supernode
supernode="registry.cn-hangzhou.aliyuncs.com/alidragonfly/supernode:0.2.0"
containername=supernode
function superNode() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi
docker run --name ${containername} --restart=always -d -p 8001:8001 -p 8002:8002 ${supernode}
}
superNode

部署dfclient

#!/bin/sh
# Separate deployment docker_proxy
dfclient="dockerhubwp/dfclient:latest"
#harbor 地址
dfdaemon_registry="https://x.x.x"
containername=dfclient
# supernode ips example (10.0.0.160,10.0.0.162)
supernodes="supernodeip"
ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
localhostIp=$(echo ${ipaddr} | cut -d " " -f 1)
cat </etc/dragonfly.conf
[node]
address=${supernodes}
EOD
function startDfClient() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi

docker run --name ${containername} --restart=always -d -p 65001:65001 -v /root/.small-dragonfly:/root/.small-dragonfly -v /etc/dragonfly.conf:/etc/dragonfly.conf -e dfdaemon_registry=${dfdaemon_registry} -e localhostIp=${localhostIp} ${dfclient}
}

最後

#!/bin/sh
# trust ca
curl http://127.0.0.1:3128/ca.crt >/etc/pki/ca-trust/source/anchors/docker_proxy_nginx.crt
update-ca-trust
docker pull x.x.x/library/nginx:latest

參考:

原文鏈接:https://mp.weixin.qq.com/s/95mX8cDox5bmgQ2xGHLPqQ

關於睿雲智合

深圳睿雲智合科技有限公司成立於2012年,總部位於深圳,並分別在成都、深圳設立了研發中心,北京、上海設立了分支機構,核心骨幹人員全部為來自金融、科技行業知名企業資深業務專家、技術專家。早期專注於為中國金融保險等大型企業提供創新技術、電子商務、CRM等領域專業諮詢服務。

自2016年始,在率先將容器技術引進到中國保險行業客戶後,公司組建了專業的容器技術產品研發和實施服務團隊,旨在幫助中國金融行業客戶將容器創新技術應用於企業信息技術支持業務發展的基礎能力改善與提升,成為中國金融保險行業容器技術服務領導品牌。

此外,憑藉多年來在呼叫中心領域的業務經驗與技術積累,睿雲智合率先在業界推出基於開源軟交換平臺FreeSwitch的微服務架構多媒體數字化業務平臺,將語音、視頻、webchat、微信、微博等多種客戶接觸渠道集成,實現客戶統一接入、精準識別、智能路由的CRM策略,並以容器化治理來支持平臺的全應用生命週期管理,顯著提升了數字化業務處理的靈活、高效、彈性、穩定等特性,為幫助傳統企業向“以客戶為中心”的數字化業務轉型提供完美的一站式整體解決方案。

dragonfly 之 p2p 鏡像分發

客戶與合作伙伴


分享到:


相關文章: