那么对于这种大文件的大规模分发,能想到的好的解决方案就是利用P2P网络实现,节省带宽,提高效率。关于p2p网络,大家可以自行搜索,典型的代表就是BitTorrent(BT下载)。
这里介绍的P2P文件分发的软件是Twitter开源的Murder。早期Twitter每次版本更新,需要向上万台服务器分发代码,从中央服务器向那么多台服务器上分发文件,服务器越多,分发时间越长。后来Twitter研发了Murder,用来解决这个问题,以前需要40-60分钟完成的代码发布任务,使用Murder之后,只需要几十秒就可以完成。
整个Murder由三个组件构成:
它是运行在一台服务器上的单个服务,用来根据哪些torrent文件正在被分发,以及管理和维护Peer节点的信息和状态。
存放需要向其他主机分发的文件的服务器。Seeder将要分发的真实文件制作成torrent,这个torrent文件很小,只存放关于真实文件的基本Hash信息,torrent文件需要先分发到要下载文件的服务器(peer)上。
就是要接收文件的服务器,他们之间可以互相传输文件。
我这里有4台服务器,角色分别如下:
tracker 192.168.1.220
seeder 192.168.1.220
peers 192.168.1.222、192.168.1.228、192.168.1.229
Tracker和Seeder在同一服务器上。
从https://github.com/lg/murder下载zip包,并解压到/opt目录下;
在所有的服务器(Tracker、Seeder、Peers)上,将Murder部署在/opt目录下,部署后的目录为:/opt/murder-master
在Tracker服务器上执行:
cd /opt/murder-master/dist
nohup python murder_tracker.py –port 8998 –dfile data –logfile urder_tracker.log &
–port tracker监听的端口,默认是8998
–dfile 存储近期下载信息的文件
–logfile tracker日志文件,默认是标准输出
在Seeder服务器上,要分发的文件:
[liuxiaowen@test04v ~/lxw]$ du -h /home/liuxiaowen/lxw/test.tar.gz
3.1G /home/liuxiaowen/lxw/test.tar.gz
制作种子:
cd /opt/murder-master/dist/
python murder_make_torrent.py /home/liuxiaowen/lxw/test.tar.gz 192.168.1.220:8998 /tmp/test.tar.gz.torrent
其中,第一个参数为要分发的文件;第二个参数为Tracker服务器的地址和端口;第三个参数为torrent文件路径。
将种子文件分发至Peers:
用Ansible将很小的torrent文件,分发至所有peers节点,关于Ansible的使用,请自行搜索,你也可以使用SCP。
ansible myhosts -m synchronize -a “src=/tmp/test.tar.gz.torrent dest=/tmp/”
启动Seeder服务:
cd /opt/murder-master/dist/
python murder_client.py seed /tmp/test.tar.gz.torrent /home/liuxiaowen/lxw/test.tar.gz 192.168.1.220
最后一个IP是Seeder服务器本机IP。
单个节点下载:在peer节点上,
cd /opt/murder-master/dist/
python murder_client.py peer /tmp/test.tar.gz.torrent /tmp/test.tar.gz 192.168.1.220
单台当然不能体现Murder的优势了,使用Ansible命令,在多台Peer节点上同时下载:
ansible myhosts -m shell -a “python /opt/murder-master/dist/murder_client.py peer /tmp/test.tar.gz.torrent /tmp/test.tar.gz 192.168.1.220″
PS:这种P2P分发,在大规模服务器环境下才能体现出优势,节点越多,分发任务消耗的整体时间越短。
原文 http://lxw1234.com/archives/2018/07/915.htm