相信各位小伙伴在日常的工作中,經常會遇到需要將數據定時推送到別的服務器,甚至是要實時同步的情況。
下面筆者將會介紹幾種可行的方式。
一.scp+ssh-key+crontab
這種是最原始的辦法,但也是最基本,最不受限制的,基本只要能ssh到對端,這種方法就是可行的。筆者曾經在項目中遇到過兩端的服務器之間存在多重網絡限制。折騰來折騰去,最后還是選用這種方法。
首先,如果要做到腳本推送,這中方法最大的問題就是在scp的過程中需要輸入密碼,這樣就做不到自動化執行腳本了。技術厲害的同學用expect來實現用戶交互,如果是還在打基礎階段的同學,可以選用ssh密鑰的方式去規避這個問題。
假設:
有兩台server,server1和server2
我們需要定期從server1推從數據到server2。
server1:
ssh-keygen (一路回車到最后)
cd ~/.ssh/ (這個是存放ssh私密文件的路徑)
文件夾會出現下圖的兩個文件

其中id_rsa是私鑰,是要放在本地的。
而id_rsa.pub是公鑰,里面有跟私鑰相互匹配的信息。
vim id_rsa.pub 把里面的信息復制出來

server2:
cd ~/,ssh/ (如果沒有,自行創建)
vim authorized_keys 這個是認證文件
將剛才的公鑰粘貼進去,保存。
這個時候回到server1,ssh到server2就不用使用密碼啦。
接下來就是自由發揮的時間了,可以針對想要傳輸、備份的數據,進行匹配、打包,最后scp到對端相應的目錄。
例如:
#!/bin/bash
find /home/gzdssapp-service/peizhi/decision/jcrd -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/jcrd \; find /home/gzdssapp-service/peizhi/decision/mrtqbg -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/mrtqbg \; find /home/gzdssapp-service/peizhi/decision/qhyc -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/qhyc/ \; find /home/gzdssapp-service/peizhi/decision/qtyb -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/qtyb \; find /home/gzdssapp-service/peizhi/decision/ssxx -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/ssxx \; find /home/gzdssapp-service/peizhi/decision/tqybqs -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/tqybqs \; find /home/gzdssapp-service/peizhi/decision/ywzy -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/ywzy \; find /home/gzdssapp-service/peizhi/decision/zdqxkb -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zdqxkb \; find /home/gzdssapp-service/peizhi/decision/zdqxzb -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zdqxzb \; find /home/gzdssapp-service/peizhi/decision/zdtqgc -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zdtqgc \; find /home/gzdssapp-service/peizhi/decision/zjtx -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zjtx \; find /home/gzdssapp-service/peizhi/decision/zx -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zx \; find /home/gzdssapp-service/peizhi/decision/zxxx -type f -mmin -10 -exec scp {} 10.12.13.30:/home/gzdssapp/peizhi/decision/zxxx \;
上面的腳本是在指定的目錄下搜索最新十分鍾內更新的文件,並推送到對端。
最后把這個腳本加進定時任務
crontab -uroot -e
*/5 * * * * /bin/bash /scripts/decision.sh > /dev/null 2&>1
這樣就實現了實時推送了。
二.ftp
這種方法就建立在對端有ftp的情況下可以實現,筆者在項目中經常用到這種方法來對數據做出實時備份。
#!/bin/bash date=`date "+%Y%m%d"` full_date=`date "+%Y-%m-%d %H:%m:%S"` tar -cvzf /scripts/test.$date.tar.gz /scripts/test/ cd /scripts/ ftp -in << EOF open 172.16.1.199 user backup1 tqw961110 put test.$date.tar.gz bye EOF rm -f /scripts/test.$date.tar.gz echo "$full_date test.$date.tar.gz has been put!!!" >> /scripts/backup.logs
上述的腳本主要是針對需要備份的目錄進行打包,並且通過ftp的方式將數據推送到對端。這里的精髓是
ftp -in << EOF
open 172.16.1.199 user backup1 tqw961110 put test.$date.tar.gz bye EOF
這里的ftp -i -n 經常在腳本中會用到,其意思是不要自動登陸並取消用戶交互模式,這樣就不會出現系統向你詢問用戶名和密碼的情況了。
后續就是ftp里面的一些操作了,手動操作是怎樣的,腳本里面就是怎樣寫的,最后通過bye來登出ftp即可。
同樣,這個腳本添加進定時任務里面,就可以實現定時備份拉。
--------------------------------------------------華麗的分割線------------------------------------------------------
上述兩種方法都是定時推送數據,其兩端的數據會存在一定的延時。
接下來為大家介紹另外兩種方法,可以做到數據的實時同步。
一.inotify+rsync
inotify這款軟件主要是實時監測系統中的某個目錄,當目錄下某個文件發生增刪改的操作的時候,就會把文件的全路徑打印出來,后續配合我們的腳本中的while read file
就可以對這些被打印出來的文件做出下一步的處理了。而rsync則是一個數據傳輸工具,其有三種工作方式,在這里筆者就不一一介紹了,感興趣的同學可以自動搜索,接下來將會
着重介紹他的daemon模式。
同樣假設有兩台server,server1需要把數據實時同步到server2
server1:
配置rsync
vim /etc/rsyncd.conf
##rsync.conf start
uid = rsync 進程用戶
gid = rsync 進程用戶組
use chroot = no 安全相關
max connections = 200 最大連接數
timeout = 300 超時時間
pid file = /var/run/rsyncd.pid 進程對應的進程號文件
lock file = /var/run/rsync.lock 鎖文件
log file = /var/log/rsyncd.log 日志文件
[backup] 模塊名稱
path = /backup/ 服務器端提供訪問的目錄
ignore errors 忽略錯誤
read only = false 可寫
list = false 不能列表
#hosts allow = 172.16.1.0/24 #這里默認的是全部都allow
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsyncd.password
##rsync.conf end
創建密碼文件
vim /etc/rsyncd.password
rsync_backup:tqw961110
修改密碼文件的權限(這里是一定要修改的,不然會報錯。)
chmod 600 /etc/rsyncd.password
創建用戶
useradd rsync -s /sbin/nologin -M (不能登陸,沒有家目錄)
創建推送文件夾
mkdir /backup/
更改屬主
chown -R rsync:rsync /backup/
啟動服務
rsync --daemon
開放端口
firewall-cmd --add-port=873/tcp --permanent
firewall-cmd --reload
server1
配置密碼文件
vim /etc/rsyncd.password
tqw961110
chmod 600 /etc/rsyncd.password
嘗試將文件推送到server2
rsync ./1 rsync_backup@172.16.1.199::backup/ --password-file=/etc/rsyncd.password
成功則證明rsync搭建成功
配置inotify
server1:
yum -y install inotify-tools
編寫監控腳本
#!/bin/bash Path=/scripts/test/ IP=172.16.1.199 inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path | while read file do cd $Path rsync $file rsync_backup@172.16.1.199::backup/ --password-file=/etc/rsyncd.password done
上述腳本監控/scripts/test/這個目錄,當目錄下有文件創建或者內容更新,則執行下面的rsync命令。
將腳本放到后台運行
nohup /scripts/test.sh &
測試
cd /scripts/test/
touch test1 看看文件有沒有同步到server2上
echo “test123” > test1 看看內容有沒有同步到server2上
有,則證明同步成功。
二.sersync
在上面的方法中,可以做到文件實時同步到對端,但是這個是單層目錄的同步,也就是說,當目錄下有子目錄下面的文件更新,上述方法是監控不到的。而且上面的方法也不知道刪除文件。因此,接下來為大家介紹筆者經常使用的方法。
rsync的配置步驟跟上面方法一樣。不一樣的是,我們不需要用到inotify,而是用到sersync這個工具。
配置sersync
這款軟件直接解壓就可以使用了,無需編譯安裝。
將軟件包解壓到對應的目錄后,進入目錄,會看到兩個文件。

編輯配置文件
vim confxml.xml
<sersync> <localpath watch="/scripts/test/"> #指定監控本地的哪個目錄 <remote ip="172.16.1.199" name="backup"/> #指定對端ip和rsync模塊名 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-avz"/> #配置rsync命令參數選項 <auth start="true" users="rsync_backup" passwordfile="/etc/rsyncd.password"/> #配置rsync模塊用戶名和密碼文件 <userDefinedPort start="false" port="874"/><!-- port=874 --> #這里可以修改rsync的傳輸端口,當對端rsync不是啟動在873端口上,這里就需要配置。 <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/scripts/sersync.log" timeToExecute="60"/><!--default every 60mins execute once--> #指定錯誤日志的路徑 <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync>
執行命令
/usr/local/sersync/GNU-Linux-x86/sersync2 -d -r -n 8 -o /usr/local/sersync/GNU-Linux-x86/confxml.xml
一般來說,出現下面信息,則證明運行成功。可以到監控的目錄進程文件增刪改的操作,看看server2對應的目錄是否有同步到。

sersync的參數詳解
參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
c參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序
本文原創
轉載請注明出處!
