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、启动调度中心

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

shell启动脚本

  1. #!/bin/bash
  2. #
  3. # Start/Stop murder-tracker
  4. #
  5. # description: murder-tracker
  6. # processname: murder-tracker
  7.  
  8. if [ -f /etc/rc.d/init.d/functions ]; then
  9. . /etc/rc.d/init.d/functions
  10. fi
  11.  
  12. name="murder-tracker"
  13. murder_tracker_bin="/usr/local/dist/murder_tracker.py"
  14. murder_tracker_log="/usr/local/dist/logs/murder_tracker.log"
  15. murder_tracker_data="/usr/local/dist/var/tracker_data"
  16. murder_user=murder
  17.  
  18. find_tracker_process () {
  19. PID=`ps -ef | grep murder_tracker | grep python |grep -v $|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`
  20. echo $PID
  21. }
  22.  
  23. start () {
  24. getent passwd $murder_user >/dev/null || useradd -r -s /sbin/nologin $murder_user
  25. LOG_DIR=`dirname ${murder_tracker_log}`
  26. DATA_DIR=`dirname ${murder_tracker_data}`
  27. if [ ! -d $LOG_DIR ]; then
  28. echo -e "\e[35mLog dir ${LOG_DIR} doesn't exist. Creating\e[0m"
  29. mkdir -p $LOG_DIR
  30. fi
  31. if [ ! -d $DATA_DIR ]; then
  32. echo -e "\e[35mLog dir ${DATA_DIR} doesn't exist. Creating\e[0m"
  33. mkdir -p $DATA_DIR
  34. fi
  35. chown -R $murder_user:$murder_user $DATA_DIR $LOG_DIR
  36.  
  37. find_tracker_process
  38. if [ "$PID" != "" ]; then
  39. echo -e "\e[35m$name is already running!\e[0m"
  40. else
  41. daemon --user $murder_user nohup python $murder_tracker_bin --dfile $murder_tracker_data --logfile $murder_tracker_log > /dev/null >& &
  42. echo -e "\e[35mStarting $name Done\e[0m"
  43. fi
  44. }
  45.  
  46. stop () {
  47. find_tracker_process
  48. if [ "$PID" != "" ]; then
  49. echo -e "\e[35mStopping $name\e[0m"
  50. kill $PID
  51. else
  52. echo -e "\e[35m$name is not running yet\e[0m"
  53. fi
  54. }
  55.  
  56. case $ in
  57. start)
  58. start
  59. ;;
  60. stop)
  61. stop
  62. exit
  63. ;;
  64. restart)
  65. stop
  66. sleep
  67. start
  68. ;;
  69. status)
  70. find_tracker_process
  71. if [ "$PID" != "" ]; then
  72. echo -e "\e[35m$name is running: $PID\e[0m"
  73. exit
  74. else
  75. echo -e "\e[35m$name is not running\e[0m"
  76. exit
  77. fi
  78. ;;
  79. *)
  80. echo -e "\e[35mUsage: $0 {start|stop|restart|status}\e[0m"
  81. RETVAL=
  82. esac
  83. exit

2、生成种子文件

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

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

  1. 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获取文件包,这些服务器下载文件,同时也承担播种节点

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

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

  1. ('minport', 10000, 'minimum port to listen on, counts up if unavailable'),
  2. ('maxport', 60000, 'maximum port to listen on'),
  3. ('random_port', 1, 'whether to choose randomly inside the port range ' +
  4. '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. webVR全景图多种方案实现(pannellum,aframe,Krpano,three,jquery-vrview)

    前言 有一篇文章我说了H5实现全景图预览,全景视频播放的原理,有需要的小伙伴可以自行去看一下 今天我就拿出我的实践干货出来,本人实测实测过 需求 老板:我需要可以上传全景图片,然后手机网站上都可以36 ...

  2. 我的SQL SERVER数据库会装满吗?

    概述 今天有个客户问我一个蛮有意思的问题.我使用的SQL SERVER 2008数据库,目前数据库130多G,其中某个表的记录条数就有3亿1千多万,占用了50多G.那SQL SERVER 数据库中的表 ...

  3. 《Effective Java》学习笔记 —— 枚举、注解与方法

    Java的枚举.注解与方法... 第30条 用枚举代替int常量 第31条 用实例域代替序数 可以考虑定义一个final int 代替枚举中的 ordinal() 方法. 第32条 用EnumSet代 ...

  4. ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨

    ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨. 当前越来越多的大大小小的中国企业已经接受了ERP的思想,大多数的商店,企业,工厂都会上一套 ...

  5. 基于tensorflow 1.x 的检索机器人chatbot-retrieval

    Chatbot-retrieval说基于tensorflow的检索机器人,原版的代码路径是 https://github.com/dennybritz/chatbot-retrieval, 但是在te ...

  6. Linux第二章读书笔记

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  7. Git学习笔记 --第一章

    本系列学习笔记参考廖雪峰Git教程 安装Git Linux平台 Ubuntu/Debian命令:sudo apt-get install git 其他版本  Git官网下载源码,然后解压,依次输入:. ...

  8. dispatch_block_t

    通常我写一个不带参数的块回调函数是这样写的 在 . h 头文件中 定义类型 typedef void (^leftBlockAction)(); 在定义一个回调函数 -(void)leftButton ...

  9. ELK 性能(2) — 如何在大业务量下保持 Elasticsearch 集群的稳定

    ELK 性能(2) - 如何在大业务量下保持 Elasticsearch 集群的稳定 介绍 如何在大业务量下保持 Elasticsearch 集群的稳定? 内容 当我们使用 Elasticsearch ...

  10. 【补】debug

    懒得翻别人博客了,之前的按钮不显示名字,应该是文字ui文件名写错了. 现在不存在任何已知bug.