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. 设计模式 笔记 装饰模式 Decorator

    //---------------------------15/04/17---------------------------- //Decorator 装饰模式----对象结构型模式 /* 1:意 ...

  2. Unity3D Shader 学习笔记(一):初识Shader

    第一节:图形处理器简史 GPU发展简史 GPU英文全称Graphic Procssing Unit. T&L变换和光照流水线 可编程GPU GPU的优点和缺点 第二节:Unity Shader ...

  3. 一、Unity Editor自定义菜单

    官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...

  4. React笔记-事件分发

    事件分发 之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看.当我点击update counter按钮时,触发注册的click事 ...

  5. MiniNet自定义拓扑

    SDN 与 Mininet 概述 SDN 全名为(Software Defined Network)即软件定义网络,是现互联网中一种新型的网络创新架构,其核心技术 OpenFlow 通过网络设备控制面 ...

  6. YQCB冲刺第二周第四天

    站立会议 任务看板 今天的任务为实现精准查账的功能. 昨天的任务为实现查看消费明细的功能. 遇到的问题为忘记在记账记录的表中添加用户名一栏,这样导致不同用户登录时查看消费明细会显示所有用户的所有记录.

  7. PAT-1001 采花生

    题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...

  8. We are a 团队

    虽然在团队中只是拖后腿的存在,但是几个人一起摸索着前进也确实有着不一样的感觉. 我们队伍共有五个人:董强强.张振鑫.王鼎.高庆阳还有我(排名不分先后) 我们有自己的关于软件工程的QQ群,会在群里讨论一 ...

  9. node之文件的静态资源的托管

    /** * 文件的静态资源托管 */ let express = require('express'); let path =require('path'); let app = express(); ...

  10. Linux命令(十二) 分割文件 split 合并文件 join

    一.分割文件 split 命令介绍 当处理文件时,有时需要将文件做分割处理,split 命令用于分割文件,可以分割文本文件,按指定的行数分割,每个分割后的文件都包含相同的行数.split 可以分割非文 ...