天天看點

P2P--大檔案分發網絡的搭建

  六月份去上海參加了DockOne組織的容器大會,報了一個小項目,不小心得了一等獎,這裡拿出來跟大家共享一下其中核心的P2P傳輸網絡的搭建,也是公司已經投入使用的大檔案傳輸方式。

項目設計:

初衷:

1、作為一個提供全球雲計算業務的營運商來說,不管是本身海外節點業務的拓展、平台擴充還是客戶定制模闆業務的需求,都會涉及大檔案的傳輸。一些普通的ISO系統鏡像檔案,一些客戶定制的系統模闆,少則十幾G,多則幾十G。如此龐大的檔案在全球多個節點之間傳輸,如何保證其穩定、快速的實作,最重要的是檔案的完整性的要求,是我們客觀面對的問題。

2、傳統的 FTP, rsync之類的檔案傳輸無法滿足大檔案的傳輸要求。我們經常遇到,辛苦一天傳輸的模闆到一個資料中心節點,結果告知檔案已經損壞,無法部署。可靠性無法保證。

3、客戶迫切需要實作全球各個節點之間的大檔案快速,可靠的分發,同步

實作思路:

1、穩定快速:大檔案的分發的穩定性受限于傳輸網絡,受限于傳輸協定。我們的分發網絡建立在公司專用GPN之上,傳輸網絡的穩定性得到保證,傳輸協定采用的 P2P傳輸,很明顯優于 FTP等相關協定。

這裡其實大家通過公網和私有網絡也可以實作。

2、開發: P2P(BT)相關的的軟體,工具社群已經有很多成型的産品,是以我們沒有必要自己研發。隻需要選擇适合的開源工具,進行二次開發即可。雲計算時代,開發效率是最關鍵的。

3、部署傳遞:分發網絡Docker容器化部署,鏡像傳遞。基于Docker的輕量,跨平台特性,标準統一的打包方案,生成可傳遞的鏡像産品。具有良好的 REST API,很适合自動化測試和繼續內建,分發網絡的動态擴充。

項目實作:

1、網絡:檔案分發網絡建構在我們公司專有GPN 全球網際網路絡之上(部落格裡不打廣告,實際在公網和自有内網裡也可以實作,但注意限速!)。

2、tracker: 采用集中式的 P2P 傳輸模式,tracker使用peertracker。peertracker是一個簡單,高效,快速的 BT Tracker。負責記錄每個peer的資訊;可以搭建多個tracker做備援,防止一個tracker當機導緻叢集不可用。

3、peer: 使用的是 transmission,  是一個跨平台的自由軟體,自帶 web 界面,支援 API 調用,可程式設計性好。

4、agent: 基于flask + dockerapi開發,封裝了一整套dockerapi相關操作,提供認證機制, 接收中心控制節點的排程,建立 peer docker容器,執行相關任務。部署層級與transmission peer端一緻。

5、控制節點:基于django + celery開發。可實作監控整個分發網絡運作情況,分發任務執行情況,動态擴充分發節點,下發任務等操作。

整個原理圖和流程圖如下:

P2P--大檔案分發網絡的搭建
P2P--大檔案分發網絡的搭建

這裡主要分享一個playbook,用于P2P網絡的搭建,docker和實作代碼部分等整理之後在共享出去。

github的位址:

https://github.com/xujpxm/ansible-peertracker

由于寫的比較倉促,有帶後期改善,經測試此腳本在ubuntu14上能夠正常運作。

README:

這是一個用ansible寫的自動化搭建P2P傳輸網絡的腳本。Tracker采用谷歌2010年開源出來的peertracker,p2p種子的生成和傳輸采用transmission。

安裝peertracker:

ansible-playbook install_peertracker.yml

預設建立的資料庫:peertracker,使用者名:peertracker,密碼:yais6Yab

腳本執行完成後,通過網頁建立資料庫,詳見下面peertracker的安裝.

安裝transmission:

預設rpc_username和password: transmission/transmission

可自行修改/etc/transmission-daemon/settings.json檔案自定義.

建立下載下傳目錄

預設下載下傳路徑是:/data/transmission-daemon/downloads可自行更改

P eerTracker是一個簡單、高效、迅速的BitTorent Tracker。

安裝要求:

1. HTTP Web Server.Apache,nginx,lighttpd等隻要支援php均可。

2. PHP5+ 推薦php5.3以上版本

3. Database.支援MySQL、SQLite3、PostgreSQL8.0和txtSQL 腳本裡采用的web server是apache2,資料庫使用mysql。

Development Website: http://code.google.com/p/peertracker/

Issue Tracker: http://code.google.com/p/peertracker/issues/list

Source Code Repository: http://peertracker.googlecode.com/svn/trunk/

github respository:https://github.com/JonnyJD/peertracker

peertracker的安裝

腳本a安裝環境:ubuntu

1. 确認代碼拷貝到網站根目錄之後,浏覽器通路: <http://serverip/peertracker/help.php

2. 編輯配置檔案tracker.mysql.php,這裡已提前編輯好,主要更改了資料庫的db_user、db_pass和db_name,預設資料庫明和user是peertracker,密碼:yais6Yab,也可自行修改templates裡的檔案。

通過help頁面提供的Utilities,安裝Tracker Database。安裝成功後可看到,資料庫結構很簡單,隻有兩個表:pt_peers和pt_tasks,分别記錄peer和任務的資訊。

資料庫建立成功之後實際已可以使用,tracker的url即為:http://serverip/peertracker/mysql/announce.php 如果是外網使用,可以把對應的announce和scrape.php檔案移置網站的頂級目錄,那麼生成的tracker url即為:http://serverip/announce.php

help.php的頁面示例:

也可以檢視peer的狀态:

http://serverip/peertracker/mysql/scrape.php?stats

Transmission是一個強大的BitTorrent開源用戶端,實作了BT協定中描述的大多數功能。目前,在它的官方網站上提供了多個版本可以下載下傳,包括:Mac、GTK+、QT版本,還有Daemon版本。

Transmission支援DHT、Magnet Link、uTP以及PEX等特性。尤其是支援Magnet Link磁力連結下載下傳十分重要,因為目前網上很多資源都是采用這種方式來分享的,而不是傳統的.torrent檔案,例如TPB、BTDigg。

安裝

安裝很簡單,直接apt-get安裝即可,運作transmission的role,腳本會自動安裝。

安裝過程中會順帶把transmission-cli也安裝上,安裝完畢後系統會多出如下一些指令行工具。

transmission-cli: 獨立的指令行用戶端。

transmission-create: 用來建立.torrent種子檔案的指令行工具。

transmission-daemon: 背景守護程式。

transmission-edit: 用來修改.torrent種子檔案的announce URL。

transmission-remote: 控制daemon的程式。

transmission-show:檢視.torrent檔案的資訊。

配置

settings.json是主要的配置檔案,設定daemon的各項參數,包括RPC的使用者名密碼配置。它實際上是一個符号連結,指向的原始檔案是/etc/transmission-daemon/settings.json。

腳本裡提供了一個模闆檔案,主要修改了下載下傳路徑、rpc認證和白名單、預設的rpc認證使用者名/密碼為:transmission/transmission

RPC的幾個配置參數:

rpc-authentication-required: rpc認證,建議開啟

rpc-bind-address: String (default = “0.0.0.0”) Where to listen for RPC connections

rpc-enabled: Boolean (default = true)

rpc-password: String

rpc-port: 預設端口9091Number (default = 9091)

rpc-url: String (default = /transmission/. Added in v2.2)

rpc-username: String

rpc-whitelist: 設定白名單 String (Comma-delimited list of IP addresses. Wildcards allowed using ‘‘. Example: “127.0.0.,192.168..“, Default: “127.0.0.1” )

rpc-whitelist-enabled: Boolean (default = true)

浏覽器中通路:http://serverip:9091/transmission/web/

即可在浏覽器中添加種子檔案,進行p2p網絡傳輸。

種子檔案的生成可以使用transmission自帶的transmission-remote指令,例如:

<code>transmission-create -c "Standard Template " -t http://192.168.1.1/announce.php -o Template.torrent StandardTemplate</code>

下圖是我自己測試的transmission實時速度,限速100M,起了五個peer基本打滿帶寬:

需要注意的是transmission的下載下傳路徑是/data/transmission-daemon/downloads,注意檔案目錄是否存在和權限,可以用mk_download_dir.yml腳本建立

transmission-create 建立的種子檔案的權限是600,需要更改為644,使other可讀