- Murder 组件介绍
Murder 是基于 BitTornado 来实现的。有以下几个主要组件:
torrent tracker :tracker 使用 murder_tracker.py 运行,tracker 实际上是运行中一台服务器上的单个服务,其他任何成员都要依赖它。Murder为了保持简单,并没有实现tracker-less distribution(DHT)功能。tracker 实际上是个迷你的 httpd 服务,存放着BitTorrent客户端需要更新状态的路径。
seeder :sender 是存放要分发到其他主机的文件的服务器。这些文件存放在 seeder 的一个目录中,Murder 会将这个目录打包成 tgz 格式并创建一个 .torrent 文件(非常小的文件,包含有关这个tgz文件的基本hash信息)。这个 .torrent 文件让各个 peer 节点知道他们下载的是什么文件。同时,tracker 会保持跟踪有哪些 .torrent 文件正在被分发。一旦 Murder 开始传输文件,seeder 服务器将是各个 peer 节点获取种子的地方。
peers :peer 是成百上千需要接收文件的服务器,并且它们之间可以相互传输文件(下载、上传)。一旦一个peer节点下载完整个 tgz 文件,还将继续 seeding 一段时间,防止蜜罐效应。
- 环境介绍
tracker:192.168.12.254
seeder:192.168.12.254
peers:192.168.12.1-12,192.168.13.1-12共24台
服务器在同机房两个节点
系统都是CentOS_7.7-x86-64
- 软件安装
tracker服务器下安装[在192.168.12.254上操作]:也可以通过跳板机,把tracker和peers一起推送下去
编写安装脚本:/usr/local/src/murder.sh
1 2 3 4 5 |
#/bin/bash cd /usr/local/src curl https://codeload.github.com/lg/murder/zip/master -vo murder.zip unzip murder.zip mv murder-master /usr/local/murder |
使用ansible将软件分发到客户端[在192.168.12.254上操作,推送到所有的客户端]:
1 2 |
ansible -i murdertest all -m copy -a "src=/usr/local/src/murder.sh dest=~ mode=0755" ansible -i murdertest all -m shell -a "~/murder.sh" |
- 启动tracker服务
启动tracker服务,[在192.168.12.254上操作]:实际上是调用 BitTornado/BT1/track.py 这个文件,track.py 有很多参数,如果需要添加参数,可以修改 murder_tracker.py。
几个重要参数:
port :tracker 监听的端口,默认 8998
dfile :存储近期下载信息的文件
logfile :tracker 日志文件,默认是标准输出
1 |
python /usr/local/murder/dist/murder_tracker.py > /var/log/murder_tracker.log 2>&1 & |
- seeder创建并分发种子
创建种子是在seeder服务器上进行操作[在192.168.12.254这台seeder上操作],我这边是要分发serf:
生成种子【按照如下脚本方式生成即可】:/root/software/murder-torrent/serf.sh
1 2 3 4 5 6 7 |
#!/bin/bash # 定义变量 deploy_file=/root/software/serf_0.8.2_linux_amd64.zip Seeder_IP=192.168.12.254 make_torrent_command=/usr/local/murder/dist/murder_make_torrent.py # 生成种子 python ${make_torrent_command} ${deploy_file} ${Seeder_IP}:8998 ${deploy_file}.torrent |
将种子文件推到客户端[在192.168.12.254这台seeder上操作]:
注意,为了防止同步过程中出错,所以这里不用ansible的copy模块了,我们这里使用ansible的synchronize模块[这个模块可以无差异的进行同步,实际使用的是rsync命令]
1 2 |
ansible -i murdertest all -m shell -a "yum install rsync -y" ansible -i murdertest all -m synchronize -a "src=/root/software/serf_0.8.2_linux_amd64.zip.torrent dest=~" |
然后启动seeder服务,启动脚本:/root/software/seeder.sh
1 2 3 4 5 6 7 |
#!/bin/bash #分发的文件 deploy_file=/root/software/serf_0.8.2_linux_amd64.zip start_ip=192.168.12.254 make_torrent_command=/usr/local/murder/dist/murder_client.py # 后台运行启动seeder python ${make_torrent_command} seed ${deploy_file}.torrent ${deploy_file} ${start_ip} & |
执行脚本启动seeder,通过ps -ef|grep torrent查看到对应的python进程即可。
- peer节点下载软件
在ansible的管理设备上创建下载脚本(用于推送到peer节点进行下载:~/software/serf_download.sh)
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # 用于各个 peer 节点根据种子文件信息,执行下载任务 # 定义下载的软件种子 torrent_file=~/serf_0.8.2_linux_amd64.zip.torrent download_file=/usr/local/src/serf_0.8.2_linux_amd64.zip # 这里获取各个 peer 节点自己的内网IP,这里要根据自己设备的情况修改一下 local_ip=$(hostname -I|awk '{print $1}') murder_client_bin=/usr/local/murder/dist/murder_client.py # 在各个 peer 节点执行 P2P 下载 python $murder_client_bin peer $torrent_file $download_file $local_ip |
在ansible的管理设备上面推送peer的下载脚本并执行下载任务:
1 |
ansible -i murdertest all -m script -a "~/software/serf_download.sh" |
很快就执行完了。如果不使用script模块的话还可以把脚本推动到客户端,然后在客户端把脚本启动起来。