天天看點

ansible 使用bt協定分發大檔案

python源代碼

http://www.361way.com/python-p2p/4737.html

ansible 使用bt協定分發大檔案

http://john88wang.blog.51cto.com/2165294/1793080

# ansible 172.168.2.171  -m service -a "name=murder-tracker state=started"

# ansible 172.168.2.179  -m service -a "name=murder-seeder state=started"

# ansible 172.168.2.179  -m synchronize -a "mode=pull src=/opt/software/download/deploy.torrent dest=/opt/software/download"

# ansible all  -m synchronize -a "src=/opt/software/download/deploy.torrent dest=/opt/software/download"

# ansible all  -m shell -a "sh /opt/app/murder/dist/peer_download.sh"

/etc/init.d/murder-tracker

/etc/init.d/murder-seeder

tracker  seeder peers  172.168.2.171

手動

python /opt/app/murder/dist/murder_make_torrent.py deploy.tar.gz 172.168.2.171:8998 deploy.torrent

python /opt/app/murder/dist/murder_client.py seed  deploy.torrent deploy.tar.gz 172.168.2.171

python /opt/app/murder/dist/murder_client.py peer  deploy.torrent deploy.tar.gz 客戶ip

單台機器80M,8s

ansible自動

ansible -i hostsbt all -m shell -a "mkdir -p /opt/software/download"

ansible -i hostsbt all -m copy -a "src=/opt/software/download/deploy.torrent dest=/opt/software/download/"

ansible -i hostsbt all -m copy -a "src=/opt/app/murder dest=/opt/software/download/"

(時間 5M 1min41s)

ansible -i hostsbt all -m copy -a "src=/opt/software/download/peer_download.sh dest=/opt/software/download/"

ansible -i hostsbt all  -m shell -a "sh /opt/software/download/peer_download.sh"

6台機器1m24.260s

cat peer_download.sh

#!/bin/bash

#this file is used to download bt files

torrent_file=/opt/software/download/deploy.torrent

download_file=/opt/software/download/deploy.tar.gz

#local_ip=$(hostname -I|awk '{print $1}')

local_ip='172.168.2.171'

#murder_client_bin=/opt/software/download/murder_client.py

murder_client_bin=/opt/software/download/murder/dist/murder_client.py

python  $murder_client_bin peer $torrent_file $download_file $local_ip

多台

tracker  172.168.2.171

seeder   172.168.2.179

peers    172.168.2.180~200

1.在tracker伺服器上啟動tracker

ansible 172.168.2.171  -m service -a "name=murder-tracker state=started"

2.注意資料目錄/opt/data/murder

将需要的分發的檔案打包成deploy.tar.gz

在seeder伺服器上制作torrent檔案并啟動seeder

手動:python /opt/app/murder/dist/murder_make_torrent.py deploy.tar.gz 172.168.2.171:8998 deploy.torrent

自動:/etc/init.d/murder-seeder restart

啟動腳本依賴一個配置檔案seeder.conf

# cat /opt/app/murder/dist/seeder.conf (注意不能注釋,切記)

deploy_file=/opt/data/murder/deploy.tar.gz

torrent_file=/opt/data/murder/deploy.torrent

tracker_ip=172.168.2.171:8998

local_ip=172.168.2.179

3.從seeder擷取種子檔案,然後分發到peers

4.在各個peers端執行下載下傳任務

ansible all  -m shell -a "sh /opt/app/murder/dist/peer_download.sh"

peer_download.sh

local_ip=$(hostname -I|awk '{print $1}')

murder_client_bin=/opt/app/murder/dist/murder_client.py

時間 對比  發一個374M的檔案

bt

+ intr=85

+ echo 85/60

+ bc

直接copy

+ intr=137

+ echo 137/60

cat test.sh

D1=`date +"%Y-%m-%d %H:%M:%S"`

D2=`date +%s -d "$D1"`

cd /etc/ansible

ansible -i hostsbt all -m copy -a "src=/opt/software/download/deploy.tar.gz dest=/opt/software/download/deploy.tar.gz"

D3=`date +"%Y-%m-%d %H:%M:%S"`

D4=`date +%s -d "$D3"`

intr=`expr $D4 - $D2`

echo ${intr}/60 | bc

cat murder-tracker 

#! /bin/sh

#

# Start/Stop murder-tracker

# chkconfig: 345 99 99

# description: murder-tracker

# processname: murder-tracker

if [ -f /etc/rc.d/init.d/functions ]; then

    . /etc/rc.d/init.d/functions

fi

name="murder-tracker"

murder_tracker_bin="/opt/app/murder/dist/murder_tracker.py"

murder_tracker_log="/opt/logs/murder/murder_tracker.log"

murder_tracker_data="/opt/data/murder/tracker_data"

murder_user=murder

find_tracker_process () {

    PID=`ps -ef | grep murder_tracker | grep python |grep -v $0|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`

}

start () {

    getent passwd $murder_user  >/dev/null || useradd -r  -s /sbin/nologin $murder_user

    LOG_DIR=`dirname ${murder_tracker_log}`

    DATA_DIR=`dirname ${murder_tracker_data}`

    if [ ! -d $LOG_DIR ]; then

      echo -e  "\e[35mLog dir ${LOG_DIR} doesn't exist. Creating\e[0m"

      mkdir -p $LOG_DIR     

    fi

    if [ ! -d $DATA_DIR ]; then

      echo -e  "\e[35mLog dir ${DATA_DIR} doesn't exist. Creating\e[0m"

      mkdir -p $DATA_DIR

    chown -R $murder_user:$murder_user $DATA_DIR  $LOG_DIR

    find_tracker_process

    if [ "$PID" != "" ]; then

       echo -e  "\e[35m$name is already running!\e[0m"

    else

       daemon --user $murder_user  nohup  python $murder_tracker_bin  > /dev/null 2>&1 &

       echo -e "\e[35mStarting $name Done\e[0m"

stop () {

        echo -e "\e[35mStopping $name\e[0m"

        kill $PID

        echo -e "\e[35m$name is not running yet\e[0m"

case $1 in

start)

        start

        ;;

stop)

        stop

        exit 0

reload)

        sleep 2

restart)

status)

        find_tracker_process

        if [ "$PID" != "" ]; then

          echo -e "\e[35m$name is running: $PID\e[0m"

          exit 0

        else

          echo -e "\e[35m$name is not running\e[0m"

          exit 1

        fi

*)

        echo -e "\e[35mUsage: $0 {start|stop|restart|reload|status|configtest}\e[0m"

        RETVAL=1

esac

exit 0

cat murder-seeder

# Start/Stop murder-seeder

# chkconfig: 345 98 98

# description: murder-seeder

# processname: murder-seeder

name="murder-seeder"

murder_seeder_data="/opt/data/murder/tracker_data"

murder_seeder_log="/opt/logs/murder/murder_seeder.log"

murder_seeder_bin="/opt/app/murder/dist/murder_client.py"

murder_make_torrent_bin="/opt/app/murder/dist/murder_make_torrent.py"

murder_seeder_conf="/opt/app/murder/dist/seeder.conf"

deploy_file=$(awk -F= '/deploy_file/{print $2}' /opt/app/murder/dist/seeder.conf)

torrent_file=$(awk -F= '/torrent_file/{print $2}' /opt/app/murder/dist/seeder.conf)

tracker_ip=$(awk -F= '/tracker_ip/{print $2}' /opt/app/murder/dist/seeder.conf)

local_ip=$(awk -F= '/local_ip/{print $2}' /opt/app/murder/dist/seeder.conf)

find_seeder_process () {

    PID=`ps -ef | grep murder_client|grep seed | grep python |grep -v $0|grep -v grep| awk '{ print $2 }'`

    #PID=`ps -ef | grep murder_client|grep seed | grep python |grep -v $0|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`

    LOG_DIR=`dirname ${murder_seeder_log}`

    DATA_DIR=${murder_seeder_data}

    ####### make torrent 

    python $murder_make_torrent_bin $deploy_file $tracker_ip $torrent_file   

    #######

    find_seeder_process

       nohup  python $murder_seeder_bin  seed  $torrent_file $deploy_file $local_ip     > $murder_seeder_log 2>&1 &

       #daemon --user $murder_user  nohup  python $murder_seeder_bin  seed  $torrent_file $deploy_file $local_ip     > $murder_seeder_log 2>&1 &

        find_seeder_process

可以将這些步驟寫成Ansible playbooks

1.copy部分

copy種子檔案,腳本檔案

2.shell指令

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1920011,如需轉載請自行聯系原作者