linux下數據推送(同步)方案


相信各位小伙伴在日常的工作中,經常會遇到需要將數據定時推送到別的服務器,甚至是要實時同步的情況。

下面筆者將會介紹幾種可行的方式。

 

一.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參數,則默認執行同步程序

 

本文原創

轉載請注明出處!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM