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”(對等節點),主要用於下載和共享檔案分塊。
下載映象檔案
Registry 類似於檔案伺服器。dfget proxy 也稱為 dfdaemon,會攔截來自 docker pull 或 docker push 的 HTTP 請求,然後使用 dfget 來處理那些跟映象分層相關的請求。
下載檔案分塊
每個檔案會被分成多個分塊,並在對等節點之間傳輸。一個對等節點就是一個 P2P 客戶端。SuperNode 會判斷本地是否存在對應的檔案。如果不存在,則會將其從檔案伺服器下載到 SuperNode。
四、dragonfly部署(參考dragonfly官網)
五、dragonfly https的harbor
dragonfly 常見問題
https://github.com/dragonflyos ... AQ.md
目的:啟用 docker PROXY 讓dragonfly 支援https
1、部署https harbor
https://github.com/goharbor/ha ... ps.md
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 <<EOD >/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
supernode.sh
!/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
dfclient.sh
!/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 <<EOD >/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}
}
最後
trust.sh
!/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://github.com/goharbor/harbor/
https://github.com/rpardini/docker-registry-proxy
https://github.com/chobits/ngx ... odule
原文連結:
https://mp.weixin.qq.com/s/95mX8cDox5bmgQ2xGHLPqQ
關於睿雲智合
深圳睿雲智合科技有限公司成立於2012年,總部位於深圳,並分別在成都、深圳設立了研發中心,北京、上海設立了分支機構,核心骨幹人員全部為來自金融、科技行業知名企業資深業務專家、技術專家。早期專注於為中國金融保險等大型企業提供創新技術、電子商務、CRM等領域專業諮詢服務。
自2016年始,在率先將容器技術引進到中國保險行業客戶後,公司組建了專業的容器技術產品研發和實施服務團隊,旨在幫助中國金融行業客戶將容器創新技術應用於企業資訊科技支援業務發展的基礎能力改善與提升,成為中國金融保險行業容器技術服務領導品牌。
此外,憑藉多年來在呼叫中心領域的業務經驗與技術積累,睿雲智合率先在業界推出基於開源軟交換平臺FreeSwitch的微服務架構多媒體數字化業務平臺,將語音、視訊、webchat、微信、微博等多種客戶接觸渠道整合,實現客戶統一接入、精準識別、智慧路由的CRM策略,並以容器化治理來支援平臺的全應用生命週期管理,顯著提升了數字化業務處理的靈活、高效、彈性、穩定等特性,為幫助傳統企業向“以客戶為中心”的數字化業務轉型提供完美的一站式整體解決方案。
客戶與合作伙伴