crontab +rsycnc 單進程低延遲文件同步
阿新 • • 發佈:2018-02-14
浪費 次數 多個 解決 txt 一個 進行 服務器 b+ 1.業務需求:網站上傳的文件需要跨國家的服務器之間保持同步。
2.實現方法:
1) .inotify+rsync 。inotify監聽文件變化。然後調用rsync同步變化的目錄。優點:文件變化時同步,減少文件同步次數,因為每次同步需要對比雙方服務器文件列表,故該方法可以降低帶寬占用。缺點:在雙方服務器頻繁上傳的場景下。同一個目錄下多個文件上傳,會導致重復同步調用較多,極大降低了效率。當然可以通過建立同步目錄隊列。過濾重復的同步目錄解決這個缺點
2) .crontab+rsync 。定時同步。優點:實現簡單,幾行代碼即可實現;適合文件變化較多的場景。缺點:不管文件是否變化一直同步。會浪費一些網絡帶寬。需要避免並發。並發時會重復同步文件。
2.實現方法:
1) .inotify+rsync 。inotify監聽文件變化。然後調用rsync同步變化的目錄。優點:文件變化時同步,減少文件同步次數,因為每次同步需要對比雙方服務器文件列表,故該方法可以降低帶寬占用。缺點:在雙方服務器頻繁上傳的場景下。同一個目錄下多個文件上傳,會導致重復同步調用較多,極大降低了效率。當然可以通過建立同步目錄隊列。過濾重復的同步目錄解決這個缺點
2) .crontab+rsync 。定時同步。優點:實現簡單,幾行代碼即可實現;適合文件變化較多的場景。缺點:不管文件是否變化一直同步。會浪費一些網絡帶寬。需要避免並發。並發時會重復同步文件。
3.業務實現
1)rsync.sh 同步腳本。該腳本實現了每10秒檢查一次是否有同步進程。沒有的話啟動同步進程,否則等待正在進行的同步進程。
#!/bin/bash
#rsync all
#每10秒檢查一次,如果沒有同步進程,啟動同步
idx=1
while [ $idx -le 6 ];do
echo "idx=$idx"
date
#判斷是否有正在同步的進程。
pid=ps -ef |grep rsync|grep rsyncd.pw|grep imgrsync|awk ‘{print $2}‘
if [ "$pid" ];then echo "rsync is running,pid:$pid" sleep 10s idx=$((idx+1)) else rsync -avzrt --delete --exclude-from=/opt/rsync/exclude-list.txt --password-file=/etc/rsyncd.pw /path-to-rsync/ rsync://imgrsync@{host}:{port}/images exit 1 fi
done
2)crontab crontab 保證每1分鐘啟動一次rsync.sh
`*/1 * * * * /opt/rsync/rsync.sh>/var/log/rsync/rsync-all.log`
crontab +rsycnc 單進程低延遲文件同步