P2P分发大文件思路

1、将软件包生成种子文件

2、通过saltstack将种子文件分发至每台服务器

3、每台服务器进行种子下载

推荐使用Twitter开源的murder。Twitter用它来分发大文件完成代码更新。

下载地址: https://github.com/lg/murder

本文介绍murder的dist,它是基于python开发的。

murder dist

  • murder_tracker.py  可以理解它为调度中心
  • murder_make_torrent.py  生成种子,并且注册在调度中心
  • murder_client.py  播种和获取文件包(上传、下载)

举例部署结构:

192.168.1.11  调度中心

192.168.1.12  种子生成、第一个播种文件服务器

192.168.1.100-200  下载文件

1、启动调度中心

python murder_tracker.py --port 8998 --dfile data --logfile urder_tracker.log
  • --port 监听的端口,默认是8998
  • --dfile 存储近期下载信息的文件
  • --logfile 日志文件,默认是标准输出

shell启动脚本

 #!/bin/bash
#
# Start/Stop murder-tracker
#
# 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="/usr/local/dist/murder_tracker.py"
murder_tracker_log="/usr/local/dist/logs/murder_tracker.log"
murder_tracker_data="/usr/local/dist/var/tracker_data"
murder_user=murder find_tracker_process () {
PID=`ps -ef | grep murder_tracker | grep python |grep -v $|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`
echo $PID
} 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
fi
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 --dfile $murder_tracker_data --logfile $murder_tracker_log > /dev/null >& &
echo -e "\e[35mStarting $name Done\e[0m"
fi
} stop () {
find_tracker_process
if [ "$PID" != "" ]; then
echo -e "\e[35mStopping $name\e[0m"
kill $PID
else
echo -e "\e[35m$name is not running yet\e[0m"
fi
} case $ in
start)
start
;;
stop)
stop
exit
;;
restart)
stop
sleep
start
;;
status)
find_tracker_process
if [ "$PID" != "" ]; then
echo -e "\e[35m$name is running: $PID\e[0m"
exit
else
echo -e "\e[35m$name is not running\e[0m"
exit
fi
;;
*)
echo -e "\e[35mUsage: $0 {start|stop|restart|status}\e[0m"
RETVAL=
esac
exit

2、生成种子文件

python murder_make_torrent.py deploy.tar.gz 192.168.1.11:8998 deploy.torrent

3、创建第一个播种文件服务节点

python murder_client.py seed  deploy.torrent deploy.tar.gz 192.168.1.12
  • 最后一个参数是本机的IP地址

4、通过saltstack将种子文件deploy.torrent发送到每台服务器上

5、所有节点192.168.1.100-200获取文件包,这些服务器下载文件,同时也承担播种节点

python murder_client.py peer deploy.torrent deploy.tar.gz 192.168.1.xxx
  • 最后一个参数是本机的IP地址

备注:这些主机分发时防火墙需要放开,程序中默认使用10000-60000之间端口,BitTornado/download_bt1.py中定义

('minport', 10000, 'minimum port to listen on, counts up if unavailable'),
('maxport', 60000, 'maximum port to listen on'),
('random_port', 1, 'whether to choose randomly inside the port range ' +
'instead of counting up linearly'),

参考博文:http://john88wang.blog.51cto.com/2165294/1793080

python BitTornado P2P分发大文件的更多相关文章

  1. 结合P2P软件使用Ansible分发大文件

    一 应用场景描述 现在我需要向50+数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下: 1 ansible all  -m  ...

  2. Python:高效计算大文件中的最长行的长度

    在操作某个很多进程都要频繁用到的大文件的时候,应该尽早释放文件资源(f.close()) 前2种方法主要用到了列表解析,性能稍差,而最后一种使用的时候生成器表达式,相比列表解析,更省内存 列表解析和生 ...

  3. 【Python】实现对大文件的增量读取

    背景 前段时间在做一个算法测试,需要对源于日志的数据进行分析才能获取到结果:日志文件较大,所以想要获取数据的变化曲线,增量读取是最好的方式. 网上有很多人的技术博客都是写的用for循环readline ...

  4. python如何打开一个大文件?

    with open('a.csv','r') as f: for i in f: print(i) while True: a = f.readline() if not a: break f.rea ...

  5. 在python中逐行读取大文件

    在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了,但是如果是将一个10G大小的日志文件读取,即文件大于内存的 ...

  6. Python之requests模块-大文件分片上传

    最近在做接口测试时,拿到一个分片上传文件的接口,http接口请求头中的Content-Type为multipart/form-data.需要在客户端将大文件分片成数据块后,依次传给服务端,由服务端还原 ...

  7. python chunk 方式读取大文件——本质上还是file read自身支持

    参考:https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python 最优雅方式: file ...

  8. python下载大文件

    1. wget def download_big_file_with_wget(url, target_file_name): """ 使用wget下载大文件 Note: ...

  9. Python 大文件处理

    非内存资源可以使用with 在python中逐行读取大文件 在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了 ...

随机推荐

  1. 【第九课】MriaDB密码重置和慢查询日志

    目录 1.如何进行修改MariaDB的密码 2.Mariadb的慢查询日志 1.如何进行修改MariaDB的密码 记得root密码的修改方式: [root@localhost ~]# mysqladm ...

  2. R语言学习 第二篇:矩阵和数组

    向量是一维的,只有行这一个维度,没有其他维度.R可以创建更高维度的数据对象,例如,矩阵.数据框.数组,索引高维度的对象时,需要使用元素的下标.这些对象的下标都使用中括号[]和索引,第一个维度是row, ...

  3. 软件测试 —— Bug

    [Bug规范] Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题尽量简明 做什么操作 + 出现什么结果,比如(点击提交按钮,出现卡顿现象 ...

  4. git 创建标签和删除标签

    创建标签 在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branc ...

  5. SICP读书笔记 1.1

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  6. 基于skip-gram做推荐系统的想法

    一.人工智能之自然语言处理 自然语言处理(Natural Language Processing, NLP),是人工智能的分支科学,意图是使计算机具备处理人类语言的能力. “处理人类语言的能力”要达到 ...

  7. DRF框架获取参数的方式

    DRF获取参数的方式 例如url url(r'^demo/(?P<word>.*)/$', DemoView.as_view()) 在类视图中获取参数 url:http://127.0.0 ...

  8. Android与Unity相互调用

    1. 在Unity里调用Android代码: void OnGUI(){ AndroidJavaClass jc = new AndroidJavaClass("com.some.packa ...

  9. Spring学习总结之面向切面(AOP)

    AOP术语 通知(advice):定义切面是什么以及什么时候使用 连接点(join point):应用在执行过程中能够插入切面的点 切点(pointcut):切点的定义会匹配通知所要织入的一个或多个连 ...

  10. http和https的加密方式

    BS盛行的今天有点网络只是很必要啊,首先需要个网络抓包工具wireshark, http:http通过三次握手来通信,握手过程看图1 https:https = http + ssl(secure s ...