前言
文件分發是自動化運維平臺設計中不可或缺的原子操作,如何快速的分發文件到目標主機上?如何解決大文件傳輸的性能和帶寬問題?
0.什麼是運維原子操作?
在開始之前有必要澄清下什麼是運維的原子操作,所有的自動化運維平臺,底層通道通過類型區分只有三種原子操作:命令執行、數據採集、文件分發。例如不管你是安裝、啟動一個軟件都是屬於命令執行、監控採集和日誌採集都屬於數據採集。然後就是文件分發。然後通過將這些原子操作組合起來就可以完成非常複雜的作業編排和流程編排。
1.使用Ansible進行文件分發
如果你是Ansible的用戶,我們可以快速的執行一個ad-hoc進行文件分發。
# ansible [pattern] -m [module] -a "[module options]"
案例測試:
# ansible all -m copy -a "src=/etc/resolv.conf dest=/etc/resolv.conf"
linux-node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "cf9cdfda6eb561a6ec4575ca458c80c9058bb8f1",
"dest": "/etc/resolv.conf",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/etc/resolv.conf",
"size": 24,
"state": "file",
"uid": 0
}
更多用法請參考官方文檔:
https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
2.使用SaltStack進行文件分發
如果你是SaltStack的用戶,你可以有兩種選擇。
2.1 salt-cp
首先是可以直接使用salt-cp這個命令進行快速的文件分發:
salt-cp '*' [ options ] SOURCE [SOURCE2 SOURCE3 ...] DEST
案例測試:
# salt-cp '*' /etc/hosts /etc/hosts
linux-node1.example.com:
----------
/etc/hosts:
True
中文支持測試:
# salt-cp '*' 呵呵.txt /tmp/
linux-node1.example.com:
----------
/tmp/呵呵.txt:
True
而且你也可以使用-C, --chunked 採用分塊模式進行文件分發,此模式支持大文件、遞歸目錄複製和壓縮的功能。
2.2 cp.get_file
對於大文件的分發,SaltStack官方建議使用遠程執行模塊cp.get_file進行大文件的分發管理,這個需要使用Salt內置的一個輕量級的file server。而且也支持環境的區分。
# vim /etc/salt/master
...
file_roots:
base:
- /srv/salt/base
test:
- /srv/salt/dev
prod:
- /srv/salt/prod
...
更多的使用方式請參考官方文檔:
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.cp.html#salt.modules.cp.get_file
3. 使用藍鯨作業平臺進行文件分發
如果你是藍鯨的用戶,藍鯨的作業平臺提供了分發文件的功能,主要是靠藍鯨的管控平臺來實現的.
藍鯨管控平臺主要提供了三種類型的服務能力:文件傳輸能力、實時任務執行能力、數據採集與傳輸的能力。架構圖如下:
4.使用P2P工具進行文件分發
不管是使用Ansible還是SaltStack的兩種文件分發模式,都無法解決大文件分發的效率和帶寬的問題,藍鯨的管控平臺是支持P2P進行文件分發,所以BitTorrent成為了海量大文件分發的首選,這裡介紹一下Twitter開源的murder。
不過請注意,該項目在Github上已經不維護了,但不影響使用
https://github.com/lg/murder
Large scale server deploys using BitTorrent and the BitTornado library (NOTE: project no longer maintained) http://twitter.com
Murder是Twitter開源的的一個P2P文件傳輸工具,主要是解決Twitter內部做應用部署發軟件包的問題。
4.1 Murder組件介紹:
- torrent tracker:這是Murder的追蹤器,需要獨立運行的一個服務,通過運行murder_tracker.py就可以啟動,tracker實際上只是一個迷你的httpd,對外提供/announce路徑,Bittorrent客戶端會將他們的狀態更新到這個路徑上。
- seeder:這是一個播種機,將文件存放在seeder的節點的一個目錄下,通過murder_make_torrent.py會生成一個.torrent的文件,保存著要分發的文件的一些信息,在開始進行P2P傳輸之前,其它的節點會先從seeder節點來下載文件分片。
- Peers:指的是所有需要接收文件的節點,它們將接收文件並在彼此之間分發文件分片。一旦有節點同伴完成分發文件的下載,它將繼續播種一段時間,以防止熱點效應的播種機。
4.2 快速實驗:
下面快速的做一個小實驗,為了方便使用murder,這裡簡單的編寫了一個安裝腳本https://github.com/unixhot/filebt.git,使用supervisor來啟動tracker服務。
1.下載代碼
# cd /usr/local/src
# wget https://github.com/unixhot/filebt/archive/master.zip
2.使用Ansible/SaltStack分發到所有機器上
# ansible all -m copy -a "src=/usr/local/src/master.zip dest=/usr/local/src/master.zip"
3.執行安裝
# ansible all -m raw -a 'cd /usr/local/src && unzip master.zip && cd filebt-master/install/ && ./install.sh install'
4.啟動tracker服務
本案例就在Ansible/SaltStack的控制節點啟動。
# cd /usr/local/src/filebt-master/install/
# ./install.sh tracker
可以查看tracker服務的狀態,確保已經啟動。#
# supervisorctl status
filebt-tracker RUNNING pid 29435, uptime 0:00:02
```
查看監聽端口,如果你想修改tracker的端口,可以在/etc/supervisord.d/tracker.ini中修改,修改完畢之後注意重啟服務。
netstat -ntlp | grep 8998
tcp 0 0 0.0.0.0:8998 0.0.0.0:* LISTEN 29435/python
5.準備一個測試文件
cd /usr/local/src
dd if=/dev/zero of=bigfile.tar.gz count=1 bs=100M
6.生成種子文件
python /opt/filebt/murder_make_torrent.py bigfile.tar.gz 192.168.56.234:8998 bigfile.tar.gz.torrent
注意:這裡需要指定tracker的地址,案例是192.168.56.234:8998。
7.啟動seeder
python /opt/filebt/murder_client.py seed bigfile.tar.gz.torrent bigfile.tar.gz 192.168.56.234
done and done
注意:最後一個IP地址,是seed所在服務器的地址,當前是和tracker在同一臺主機上。而且執行完命令執行,會一直等待。
8.將文件種子分發到所有要下載的節點上。
ansible all -m copy -a "src=/usr/local/src/bigfile.tar.gz.torrent dest=/usr/local/src/bigfile.tar.gz.torrent"
9.所有節點進行P2P下載
ansible all -m raw -a 'LOCAL_IP=$(hostname -i) && cd /usr/local/src && python /opt/filebt/murder_client.py peer bigfile.tar.gz.torrent bigfile.tar.gz $LOCAL_IP'
注意:最後一個IP為各個節點本地IP地址。
> 警告⚠️
如果需要分發的節點比較少,文件也特別小,不要使用P2P的方式進行文件分發,因為速度還沒有直接使用Ansible或者SaltStack快。
> 建議:
在實際的應用過程中,你可以通過自定義腳本來簡化這些操作,通過自定義Web界面也可以很好的隱藏掉複雜的細節,同時也可以根據文件大小和分發節點的數量,自動判斷是否開啟P2P傳輸。
> 總結: