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分发大文件的更多相关文章
-
结合P2P软件使用Ansible分发大文件
一 应用场景描述 现在我需要向50+数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下: 1 ansible all -m ...
-
Python:高效计算大文件中的最长行的长度
在操作某个很多进程都要频繁用到的大文件的时候,应该尽早释放文件资源(f.close()) 前2种方法主要用到了列表解析,性能稍差,而最后一种使用的时候生成器表达式,相比列表解析,更省内存 列表解析和生 ...
-
【Python】实现对大文件的增量读取
背景 前段时间在做一个算法测试,需要对源于日志的数据进行分析才能获取到结果:日志文件较大,所以想要获取数据的变化曲线,增量读取是最好的方式. 网上有很多人的技术博客都是写的用for循环readline ...
-
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 ...
-
在python中逐行读取大文件
在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了,但是如果是将一个10G大小的日志文件读取,即文件大于内存的 ...
-
Python之requests模块-大文件分片上传
最近在做接口测试时,拿到一个分片上传文件的接口,http接口请求头中的Content-Type为multipart/form-data.需要在客户端将大文件分片成数据块后,依次传给服务端,由服务端还原 ...
-
python chunk 方式读取大文件——本质上还是file read自身支持
参考:https://*.com/questions/519633/lazy-method-for-reading-big-file-in-python 最优雅方式: file ...
-
python下载大文件
1. wget def download_big_file_with_wget(url, target_file_name): """ 使用wget下载大文件 Note: ...
-
Python 大文件处理
非内存资源可以使用with 在python中逐行读取大文件 在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了 ...
随机推荐
-
【01-05】hibernate BaseDao
BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...
-
Linux Tomcat 6.0安装配置实践总结
系统环境: Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64位 Tomcat下载 从官方网站 http://tomcat.apache ...
-
查看oracle 数据库的DBID
(1)使用rman查看$ rman target /Recovery Manager: Release 11.2.0.4.0 - Production on Fri Jun 12 03:20:19 2 ...
-
NFC(3)Android上的NFC,开启NFC,3种NDEF数据
Android对NFC技术的支持 Android2.3.1(API Level = 9)开始支持NFC技术,但Android2.x和Android3.x对NFC的支持非常有限.而从Android4.0 ...
-
Java四种引用类型
纸上得来终觉浅,绝知此事要躬行 --陆游 问渠那得清如许,为有源头活水来 --朱熹 Java从1.2版本开始引入了4种引用,这四种引用的级别由高到低依次为:强引用>软引用>弱引用 ...
-
EEPROM
EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片. EEPROM 可 ...
-
axios设置application/x-www-form-urlencoded
this.$axios({ method: 'post', url: 'http://www.17huo.com/tusou/deeplorSearch.html', headers: { 'Cont ...
-
cordova打包webapp
cordova打包webapp 在项目开发中,需要将h5页面打包成app,这个时候我们可以使用cordova来打包.在官方文档中,我们可以了解到创建一个app十分简单,你的电脑上有nodejs就行,我 ...
-
JavaScript setInterval(定时/延时调用函数)
setInterval是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval方法会不停地调用函数,直到 clearInterval被调用或窗口被关闭. 由 ...
-
三、持久层框架(Hibernate)
一.Hibernate处理关系 关系主要有三种:1.多对一 2.一对多 3.多对多 1.多对一 一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个 ...