Linux服务器和客户端之间的数据同步(备份)
最近實(shí)驗(yàn)室總是停電,電腦今天系統(tǒng)出現(xiàn)了點(diǎn)問題,所以需要對(duì)數(shù)據(jù)進(jìn)行備份,以防硬盤發(fā)生突然損壞。目前用到的方法是通過rysnc和inotify協(xié)同數(shù)據(jù)同步,數(shù)據(jù)可以實(shí)時(shí)更新。另外,對(duì)于經(jīng)常改變且比較大的數(shù)據(jù),實(shí)時(shí)更新不是那么可能,所以可以通過Linux操作系統(tǒng)自帶的crond服務(wù),定時(shí)讓系統(tǒng)自動(dòng)更新數(shù)據(jù)。通過這兩種方法可以達(dá)到同步數(shù)據(jù)的目的。下面詳細(xì)介紹具體操作。
具體的結(jié)構(gòu)如下圖,我們就是想將存儲(chǔ)服務(wù)器的文件推送到rsync服務(wù)器上:
?
| 10.1.2.102 | Centos 7.1 |
| 10.1.2.104 | Centos 7.1 |
其中?Smaba?服務(wù)器為共享文件服務(wù)器,其中?Backup?為備份服務(wù)器。本次目地:監(jiān)控?Smaba?服務(wù)器下的?/data?目錄下文件的實(shí)時(shí)變化,并實(shí)時(shí)備份至?Backup?服務(wù)器的?/data/SambaBackup?目錄。
1、使用?inotifywait?工具監(jiān)控文件變化情況,使用?rsync?工具做同步
介紹
Rsync(remote?synchronize)是一個(gè)遠(yuǎn)程文件同步工具;Rsync使用“Rsync算法”來同步文件,該算法只傳送兩個(gè)文件的不同部分,因此速度相當(dāng)快;Rsync是替代rcp的一個(gè)工具,目前由rsync.samba.org維護(hù),因而rsync.conf文件的格式類似于samba的主配置文件;Rsync可通過rsh或ssh使用,也能以daemon模式運(yùn)行,以daemon方式運(yùn)行時(shí),Rsync?Server會(huì)打開一個(gè)873端口等待客戶端連接.連接時(shí),Rsync?Server會(huì)檢查口令是否相符,若口令相符,則進(jìn)行文件傳輸.第一次會(huì)把整份文件傳輸一次,以后則為增量傳輸。
?Inotify 是一個(gè) Linux特性,它監(jiān)控文件系統(tǒng)操作,比如讀取、寫入和創(chuàng)建。Inotify 反應(yīng)靈敏,用法非常簡(jiǎn)單,并且比 cron 任務(wù)的繁忙輪詢高效得多。學(xué)習(xí)如何將 inotify 集成到您的應(yīng)用程序中,并發(fā)現(xiàn)一組可用來進(jìn)一步自動(dòng)化系統(tǒng)治理的命令行工具。是一個(gè)非常好的輔助性工具軟件,后期本博客還會(huì)有更加多與inotify嵌合的功能發(fā)布!
安裝
以下在?Backup?機(jī)器上操作安裝配置。這里我先配置備份服務(wù)器,方便后續(xù)說明。
分別在服務(wù)器端Backup安裝rsync,在客戶端Smaba安裝rsync、inotify-tools,如下所示:
[root@Backup ~]# yum install -y rsync [root@Samba~]#yum install inotify-tools配置
1、在服務(wù)器端配置?rsync --daemon?模式運(yùn)行,默認(rèn)使用?/etc/rsyncd.conf?主配置文件:
[root@Backup ~]# cat /etc/rsyncd.conf port = 873 uid = root gid = root use chroot = no max connections = 2 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log lock file = /var/run/rsyncd.lock [SambaBackup] ##模塊名 path = /data/SambaBackup ##文件復(fù)制的路徑 read only = no auth users = rsync #這個(gè)名字不一定是用戶名 # 虛擬賬號(hào)配置文件,格式:username:password secrets file = /etc/rsyncd.secrets #密碼文件上述密碼文件配置
# 設(shè)置虛擬賬密信息 [root@Backup ~]# echo "rsync:123456" > /etc/rsyncd.secrets # 權(quán)限務(wù)必設(shè)為 600 權(quán)限 [root@Backup ~]# chmod -R 600 /etc/rsyncd.secrets # 創(chuàng)建模塊目錄 [root@Backup ~]# mkdir -p /data/SambaBackup # 啟動(dòng) [root@Backup ~]# rsync --daemon詳細(xì)安裝參見:https://www.jianshu.com/p/0df0633613d8
2、客戶端配置
客戶端的配置文件只需做簡(jiǎn)單的修改,設(shè)置log file和pid file路徑即可,然后啟動(dòng)rsync即可。
[root@Samba ~]# cat /etc/rsyncd.conf pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # 配置密碼文件及密碼 [root@Samba ~]# echo '123456' > /etc/rsyncd.secrets [root@Samba ~]# chmod -R 600 /etc/rsyncd.secrets ##這里的密碼是上面服務(wù)器中創(chuàng)建的密碼文件中的密碼 # 啟動(dòng) [root@Samba ~]# rsync --daemon3、創(chuàng)建監(jiān)控腳本--inotifywait.sh
#!/bin/bash # 配置監(jiān)控目錄 path='/data/' /usr/bin/inotifywait --exclude '\.(part|swp|swx)' -mrq --format '%T %e : %w%f' --timefmt '%Y-%m-%d %H:%M:%S' -e create,delete,move,close_write ${path} | while read file; do# 執(zhí)行同步# /usr/bin/rsync -auvrtzopgP --delete ${path} root@10.1.2.104:/data/SamabaBackup/# 使用 rsync 的守護(hù)模式同步/usr/bin/rsync -vazu --delete --password-file=/etc/rsyncd.secrets /data rsync@10.1.2.104::SambaBackup##這里的密碼文件直接寫入上述服務(wù)器端配置的密碼文件的密碼即可 done做以下說明: #同步文件夾到遠(yuǎn)程 $?rsync?-avI?dir_name?remote_ip:dir_name #同步文件夾到遠(yuǎn)程,傳輸時(shí)進(jìn)行壓縮 $?rsync?-avzI?dir_name?remote_ip:dir_name #同步文件夾到遠(yuǎn)程(保持嚴(yán)格同步,即本地刪除,遠(yuǎn)程也同步刪除) $?rsync?-avzI?–-delete?dir_name?remote_ip:dir_name #排除指定的文件或目錄,可多次使用,支持通配符(比如.svn、.git等目錄) $?rsync?-avzI?--exclude=/a/b/*.svn?--exclude=/a/b/*.git?dir_name?remote_ip:dir_name #當(dāng)排除的文件較多時(shí),可將文件寫到某文件中,同時(shí)使用?--exclude-from?指定該文件即可。 $?rsync?-avzI?--exclude-from=/a/exclude_file_list.txt?dir_name?remote_ip:dir_name 以上使用的選項(xiàng)說明如下: -a,?--archive?歸檔模式,等于-rlptgoD; -r,?--recursive?遞歸模式; -l?保持符號(hào)連接; -p?保持文件原有權(quán)限; -t?保持文件原有修改時(shí)間; -g?保持文件原有用戶組; -o?保持文件原有屬主; -D?-devices?-specials,保持塊設(shè)備文件和特殊文件; -I?強(qiáng)制掃描,放棄“quick?check”策略(quick?check策略,通過查看文件的時(shí)間戳和文件大小,先排除一批認(rèn)為相同的文件[rsync不會(huì)對(duì)文件夾本身做“quick?check”]); -z,?--compress?壓縮,默認(rèn)的壓縮算法和gzip一樣; -v,?--verbose?顯示進(jìn)度詳細(xì)信息; -q,?--quiet?精簡(jiǎn)輸出模式; -R,?--relative?保持全路徑; --progress??顯示傳輸進(jìn)度(百分百); --delete?本地刪除某一文件,遠(yuǎn)程也同步的刪除該文件,保持嚴(yán)格的一致(不加該參數(shù),則表示只增不減); --exclude="*.tmp"?排除某些文件; --exclude-from=FILE?排除FILE中指定模式的文件; --port=PORT?指定其他的rsync服務(wù)端口;注意:就路徑格式而言,如果源路徑末尾使用/,則rsync會(huì)將源路徑尾端目錄中的所有內(nèi)容復(fù)制到目的端;如果沒有使用/,rsync會(huì)將源路徑尾端目錄本身復(fù)制到目的端。 $?rsync?-av?/home/test/?/home/backup;?#將test目錄中的內(nèi)容備份; $?rsync?-av?/home/test?/home/backup;?#將test目錄本身備份; 如果目的路徑末尾使用/,則rsync會(huì)將來自源端的內(nèi)容復(fù)制到目的端的目錄中;如果沒有使用/,則rsync會(huì)在目的端路徑尾部創(chuàng)建一個(gè)和目的端尾部目錄同名的目錄,并將源端內(nèi)容復(fù)制到該目錄中。 $?rsync?-av?/home/test?/home/backup/;?#將源端內(nèi)容復(fù)制到backup目錄中; $?rsync?-av?/home/test?/home/backup;?#在/home/backup創(chuàng)建下級(jí)目錄backup,并將源端內(nèi)容復(fù)制到/home/backup/backup目錄中;上述操作完成后就可以實(shí)時(shí)同步了。
最后運(yùn)行以下命令
# 不掛斷的放后臺(tái)運(yùn)行 nohup sh /root/inotifywait.sh > /dev/null 2>&1 &2、使用?crontab?配合rsync定時(shí)同步
介紹
cron是一個(gè)linux下的定時(shí)執(zhí)行工具,可以在無需人工干預(yù)的情況下運(yùn)行作業(yè)。cron?是Linux的內(nèi)置服務(wù),但它不自動(dòng)起來,可以用以下的方法啟動(dòng)、關(guān)閉這個(gè)服務(wù):
/sbin/service?crond?status?//查看服務(wù)當(dāng)前狀態(tài)
/sbin/service?crond?start?//啟動(dòng)服務(wù)
/sbin/service?crond?stop?//關(guān)閉服務(wù)
/sbin/service?crond?restart?//重啟服務(wù)
/sbin/service?crond?reload?//重新載入配置
你也可以將這個(gè)服務(wù)在系統(tǒng)啟動(dòng)的時(shí)候自動(dòng)啟動(dòng):
在/etc/rc.d/rc.local這個(gè)腳本的末尾加上:/sbin/service?crond?start
現(xiàn)在cron這個(gè)服務(wù)已經(jīng)在進(jìn)程里面了,我們就可以用這個(gè)服務(wù)了.
同時(shí)cron服務(wù)提供以下幾種接口供大家使用:
1.直接用crontab命令編輯
cron服務(wù)提供crontab命令來設(shè)定cron服務(wù),以下是這個(gè)命令的一些參數(shù)與說明:
$>?crontab?-u?zhangsan?-l
$>?crontab?-u?zhangsan?-e
$>?crontab?-u?zhangsan?-r
-u?//指定用戶,一般root用戶在執(zhí)行這個(gè)命令的時(shí)候需要此參數(shù)(如省略,則默認(rèn)為當(dāng)前登錄用戶)
-l?//列出cron服務(wù)
-r?//刪除cron服務(wù)
-e?//編輯cron服務(wù)
每次編輯完某個(gè)用戶的cron設(shè)置后,cron自動(dòng)在/var/spool/cron下生成一個(gè)與此用戶同名的文件,此用戶的cron信息都記錄在這個(gè)文件中,這個(gè)文件不可以直接編輯,只可用crontab?-e?來編輯。cron啟動(dòng)后每過一份鐘讀一次這個(gè)文件,檢查是否要執(zhí)行里面的命令。因此此文件修改后不需要重新啟動(dòng)cron服務(wù)。
2.編輯/etc/crontab?文件配置cron
cron服務(wù)每分鐘不僅要讀一次/var/spool/cron內(nèi)的所有文件,還需要讀一次/etc/crontab,因此我們配置這個(gè)文件也能運(yùn)用cron服務(wù)做一些事情。用crontab配置是針對(duì)某個(gè)用戶的,而編輯/etc/crontab是針對(duì)系統(tǒng)的任務(wù)。此文件的文件格式是:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現(xiàn)錯(cuò)誤,或者有數(shù)據(jù)輸出,數(shù)據(jù)作為郵件發(fā)給這個(gè)帳號(hào) HOME=/ //使用者運(yùn)行的路徑,這里是根目錄 # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly以上cron命令格式為:*?*?*?*?*?[root?run-parts]?command
前面五個(gè)*號(hào)代表時(shí)間,用數(shù)字,數(shù)字的取值范圍和含義如下:
第一個(gè)*:分鐘?(0-59)[整數(shù)]
第二個(gè)*:小時(shí)(0-23)[整數(shù)]
第三個(gè)*:日期(1-31)[整數(shù)(必須是指定月份的有效日期)]
第四個(gè)*:月份(1-12)[整數(shù)(或如Jan或Feb簡(jiǎn)寫的月份)]
第五個(gè)*:星期(0-7)[0或7用來描述周日(或用Sun或Mon簡(jiǎn)寫來表示)]
command:需要執(zhí)行的命令(可用as?ls?/proc?>>?/tmp/proc或?執(zhí)行自定義腳本的命令)
root:以root用戶身份來執(zhí)行
run-parts:表示后面跟著的是一個(gè)文件夾,要執(zhí)行的是該文件夾下的所有腳本
注意"run-parts"這個(gè)參數(shù),如果去掉這個(gè)參數(shù),后面就可以寫要運(yùn)行的某個(gè)腳本名,而不是文件夾名。
以下舉幾個(gè)例子說明問題:
0 6 * * * echo "Good morning." >> /tmp/test.txt #每天早上6點(diǎn) 0 */2 * * * echo "Have a break now." >> /tmp/test.txt #每?jī)蓚€(gè)小時(shí) 0 11 4 * 1-3 command line #每個(gè)月的4號(hào)和每個(gè)禮拜的禮拜一到禮拜三的早上11點(diǎn) 0 4 1 1 * command line #1月1日早上4點(diǎn)如果一個(gè)cron任務(wù)需要定期而不是按小時(shí),天,周,月來執(zhí)行,則需要添加/etc/cron.d目錄。這個(gè)目錄下的所有文件和文件/etc/crontab語法相同。cron服務(wù)會(huì)每分鐘檢查一次/etc/crontab、/etc/cron.d/、/var/spool/cron/下的變更。如果發(fā)現(xiàn)變化,就會(huì)下載到存儲(chǔ)器中。因此,即使?crontab文件改變了,程序也不需要重新啟動(dòng)。推薦自定義的任務(wù)使用crontab?-e命令添加,退出后用/etc/init.d/crond?restart命令重啟crond進(jìn)程,官方文件說不用重啟進(jìn)程,但我遇到不重啟無法運(yùn)行任務(wù)的情況。
3、具體使用
1、添加定時(shí)任務(wù)
$>?crontab?-e
*/10?*?*?*?*?sh?/opt/app/tomcat/test/monitorbamboo.sh
2、重啟?crond?服務(wù)
$>?service?crond?restart
如此,ok?了。
對(duì)于rsync的配置都是服務(wù)器和客戶端的模式,與第一種方法的配置是完全相同的,只是在上述第一步中將rsync的同步命令加入到定時(shí)任務(wù)表中即可,這樣就可以讓系統(tǒng)自動(dòng)定時(shí)備份了。
常見問題可參見:
https://blog.csdn.net/l821133235/article/details/79568167
https://www.cnblogs.com/fawaikuangtu123/p/8185312.html
https://www.cnblogs.com/wang-xd/p/6551402.html
http://blog.sina.com.cn/s/blog_4ac726fe0102xy47.html
參考文獻(xiàn)
https://www.linuxidc.com/Linux/2017-12/149355.htm
https://linux.cn/article-6032-1.html
https://www.chenghuajie.cn/1302.html?(強(qiáng)烈推薦)
https://www.cnblogs.com/hackerer/p/5243639.html
https://www.jianshu.com/p/f387b45f0f1d
https://blog.csdn.net/wangjunjun2008/article/details/38755959
https://blog.csdn.net/wangjunjun2008/article/details/38658539
https://blog.csdn.net/wangjunjun2008/article/details/19497803
http://ju.outofmemory.cn/entry/327439
https://yq.aliyun.com/articles/372019
http://blog.chinaunix.net/uid-29099879-id-5818553.html
總結(jié)
以上是生活随笔為你收集整理的Linux服务器和客户端之间的数据同步(备份)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: filesaver.js 导出文件路径_
- 下一篇: Linux常用命令集锦