rsync和inotify遠程同步
文章目錄
1.什麼是rsync和inotify
- rsync是linux系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地複製,或者與其他SSH、rsync主機同步。
- Inotify 是一個 Linux特性,它監控文件系統操作,比如讀取、寫入和創建。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。學習如何將 inotify 集成到您的應用程序中,並發現一組可用來進一步自動化系統治理的命令行工具。
2.inotify產生背景和詳細介紹
- 產生背景
- 系統治理就像日常生活一樣。就像刷牙和喫蔬菜一樣,日常的維護能保持機器的良好狀態。您必須定期清空廢物,比如臨時文件或無用的日誌文件,以及花時間填寫表單、回覆電話、更新和監控進程等。幸好自動化 shell 腳本、使用 Nagios 等工具進行監控、通過常見的 cron 進行任務調度可以減輕這個負擔。
- 但稀奇的是,這些工具沒有一個具有響應性。當然,您可以安排一個頻繁運行的 cron 任務來監控條件,但這樣繁忙的輪詢 — 消耗大量資源並且具有不確定性 — 並不是很理想。例如,假如您必須監控輸入數據的幾個 Transfer Protocol(FTP)收存箱,您可能要通過 find 命令掃描每個目標目錄,列舉新的內容。然而,儘管這個操作看起來並沒有什麼害處,但每個調用都產生一個新的 shell 和 find 命令,這需要許多系統調用來打開目錄,然後掃描目錄,等等。這會造成過於頻繁的或大量的輪詢任務(更糟糕的是,繁忙的輪詢並不總是很好。想象一下一個文件系統瀏覽器,比如 Mac OS X 的 Finder,輪詢更新時需要的大量資源及其複雜性)。
- 那麼,管理員應該怎麼辦呢?令人興奮的是,您可以再次求助於可以信賴的計算機。
- 詳細介紹
- Inotify 是一個 Linux 內核特性,它監控文件系統,並且及時向專門的應用程序發出相關的事件警告,比如刪除、讀、寫和卸載操作等。您還可以跟蹤活動的源頭和目標等細節。
- 使用 inotify 很簡單:創建一個文件描述符,附加一個或多個監視器(一個監視器 是一個路徑和一組事件),然後使用 read 方法從描述符獲取事件。read 並不會用光整個週期,它在事件發生之前是被阻塞的。
- 更好的是,因爲 inotify 通過傳統的文件描述符工作,您可以利用傳統的 select 系統調用來被動地監控監視器和許多其他輸入源。兩種方法 — 阻塞文件描述符和使用 select— 都避免了繁忙輪詢。
- 現在,深入瞭解 inotify,寫一些 C 代碼,然後看看一組命令行工具,可以構建並使用它們將命令和腳本附加到文件系統事件。Inotify 不會在中途失去控制,但它可以運行 cat 和 wget,並且在必要時嚴格執行。
- 要使用 inotify,必須具備一臺帶有 2.6.13 或更新內核的 Linux 機器(以前的 Linux 內核版本使用更低級的文件監控器dnotify)。如果不知道內核的版本,請轉到 shell,輸入 uname -a:% uname -a
- Linux ubuntu-desktop 2.6.24-19-generic #1 SMP … i686 GNU/Linux
- 如果列出的內核版本不低於 2.6.13,系統就支持 inotify。還可以檢查機器的 /usr/include/sys/inotify.h 文件。如果它存在,表明內核支持 inotify。
- 注意:FreeBSD 和 Mac OS X 提供一個類似於 inotify 的 kqueue。在 FreeBSD 機器上輸入 man 2 kqueue 獲取更多信息。
3.rsync特性
它的特性如下:
- 可以鏡像保存整個目錄樹和文件系統。
- 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。
- 無須特殊權限即可安裝。
- 快速:第一次同步時 rsync 會複製全部內容,但在下一次只傳輸修改過的文件。rsync 在傳輸數據的過程中可以實行壓縮及解壓縮操作,因此可以使用更少的帶寬。
- 安全:可以使用scp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接。
- 支持匿名傳輸,以方便進行網站鏡像。
4.操作流程
- 服務器端啓動
- /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
- 可能需要root權限運行.
- /etc/rsyncd/rsyncd.conf 是你剛纔編輯的rsyncd.conf的位置.
- 也可以在/etc/rc.d/rc.local里加入讓系統自動啓動等.
- 客戶端同步
- rsync -參數 用戶名@同步服務器的IP::rsyncd.conf中那個方括號裏的內容 本地存放路徑 如: rsync -avzP [email protected]::nemo /backup
- 說明:
- -a 參數,相當於-rlptgoD
- -r 是遞歸
- -l 是鏈接文件 , 意思是拷貝鏈接文件
- -p 表示保持文件原有權限
- -t 保持文件原有時間
- -g 保持文件原有用戶組
- -o 保持文件原有屬主
- -D 相當於塊設備文件
- -z 傳輸時壓縮
- -P 傳輸進度;
- -v 傳輸時的進度等信息,和-P有點關係,自己試試。可以看文檔
5.參數詳解
- -v, --verbose 詳細模式輸出
- -q, --quiet 精簡輸出模式
- -c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
- -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD
- -r, --recursive 對子目錄以遞歸模式處理
- -R, --relative 使用相對路徑信息
- -b, --backup 創建備份,也就是對於目的已經存在有同樣的文件名時,將老的文件重新命名爲~filename。可以使用–suffix選項來指定不同的備份文件前綴。
- –backup-dir 將備份文件(如~filename)存放在在目錄下。
- -suffix=SUFFIX 定義備份文件前綴
- -u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且文件時間晚於要備份的文件。(不覆蓋更新的文件)
- -l, --links 保留軟鏈結
- -L, --copy-links 像對待常規文件一樣處理軟鏈接
- –copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鏈接
- –safe-links 忽略指向SRC路徑目錄樹以外的鏈接
- -H, --hard-links 保留硬鏈接
- -p, --perms 保持文件權限
- -o, --owner 保持文件屬主信息
- -g, --group 保持文件屬組信息
- -D, --devices 保持設備文件信息
- -t, --times 保持文件時間信息
- -S, --sparse 對稀疏文件進行特殊處理以節省DST的空間
- -n, --dry-run顯示哪些文件將被傳輸
- -W, --whole-file 拷貝文件,不進行增量檢測
- -x, --one-file-system 不要跨越文件系統邊界
- -B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
- -e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步
- –rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息
- -C, --cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件
- –existing 僅僅更新那些已經存在於DST的文件,而不備份那些新創建的文件
- –delete 刪除那些DST中SRC沒有的文件
- –delete-excluded 同樣刪除接收端那些被該選項指定排除的文件
- –delete-after 傳輸結束以後再刪除
- –ignore-errors 即使出現IO錯誤也進行刪除
- –max-delete=NUM 最多刪除NUM個文件
- –partial 保留那些因故沒有完全傳輸的文件,以是加快隨後的再次傳輸
- –force 強制刪除目錄,即使不爲空
- –numeric-ids 不將數字的用戶和組ID匹配爲用戶名和組名
- –timeout=TIME IP超時時間,單位爲秒
- -I, --ignore-times 不跳過那些有同樣的時間和長度的文件
- –size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
- –modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0
- -T --temp-dir=DIR 在DIR中創建臨時文件
- –compare-dest=DIR 同樣比較DIR中的文件來決定是否需要備份
- -P 等同於 --partial
- –progress 顯示備份過程
- -z, --compress 對備份的文件在傳輸時進行壓縮處理
- –exclude=PATTERN 指定排除不需要傳輸的文件模式
- –include=PATTERN 指定不排除而需要傳輸的文件模式
- –exclude-from=FILE 排除FILE中指定模式的文件
- –include-from=FILE 不排除FILE指定模式匹配的文件
- –version 打印版本信息
- –address 綁定到特定的地址
- –config=FILE 指定其他的配置文件,不使用默認的rsyncd.conf文件
- –port=PORT 指定其他的rsync服務端口
- –blocking-io 對遠程shell使用阻塞IO
- -stats 給出某些文件的傳輸狀態
- –progress 在傳輸時顯示傳輸過程
- –log-format=formAT 指定日誌文件格式
- –password-file=FILE 從FILE中得到密碼
- –bwlimit=KBPS 限制I/O帶寬,KBytes per second
- -h, --help 顯示幫助信息
6.rsync服務搭建
- 實驗環境
- VMware Workstation
- centos7(master),IP地址:192.168.73.200
- centos7(slave),IP地址:192.168.73.201
- 實驗拓撲圖
- 修改IP地址
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static '//改爲static'
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=0f49a612-24ff-4410-8185-c13a60922cdc
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.73.200 '//添加下面三個IP地址'
NETMASK=255.255.255.0
GATEWAY=192.168.73.2
DNS1=8.8.8.8
[root@localhost ~]# systemctl restart network
'//另一臺IP地址修改爲192.168.73.201'
- 關閉防火牆和安全功能
[root@localhost ~]# systemctl stop firewalld '//關閉防火牆'
[root@localhost ~]# systemctl disable firewalld '//禁止防火牆開機自啓'
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0 '//關閉核心防護'
[root@localhost ~]# vi /etc/sysconfig/selinux '//禁止核心防護開啓自啓'
SELINUX=disabled
- 修改主機名和主機映射文件
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# su
[root@slave ~]# vi /etc/hosts
192.168.73.201 slave
192.168.73.200 master
[root@slave ~]# ping master
'//master主機操作相同,不在贅述'
- 配置本地yum源
[root@slave ~]# cd /etc/yum.repos.d/
[root@slave yum.repos.d]# mkdir bak
[root@slave yum.repos.d]# mv * bak '//備份原有yum文件'
mv: 無法將目錄"bak" 移動至自身的子目錄"bak/bak" 下
[root@slave yum.repos.d]# vi local.repo '//創建本地yum文件'
[mnt]
name=mnt
baseurl=file:///mnt
gpgcheck=0
enbaled=1
[root@slave yum.repos.d]# mount /dev/sr0 /mnt '//手動掛載光盤'
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@slave yum.repos.d]# vi /etc/fstab '//設置自動掛載'
/dev/sr0 /mnt iso9660 defaults 0 0
[root@slave yum.repos.d]# yum clean all '//清理緩存'
[root@slave yum.repos.d]# yum makecache '//創建緩存'
- 配置rsync源服務器
[root@master yum.repos.d]# yum install httpd rsync -y
[root@master yum.repos.d]# vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes '//禁錮在源目錄'
address = 192.168.73.200 '//監聽地址'
port 873 '//監聽端口號'
log file = /var/log/rsyncd.log '//日誌文件位置'
pid file = /var/run/rsyncd.pid '//存放進程ID的文件位置'
hosts allow = 192.168.73.201 '//允許訪問的客戶機地址'
[wwwroot] '//共享模塊名稱'
path = /var/www/html '//源目錄的實際路徑'
comment = Document Root of www.51xit.top
read only =yes '//是否只讀'
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z '//同步時不在壓縮的文件類型'
auth users = lisi '//授權賬戶'
secrets file = /etc/rsyncd_users.db '//存放賬戶信息的數據文件'
[root@master yum.repos.d]# vi /etc/rsyncd_users.db '//創建存放賬戶信息的數據文件'
lisi:lisi123 '//採用“用戶名:密碼”的記錄格式,每行一個用戶記錄獨立的賬號數據,不依賴於系統賬號'
[root@master yum.repos.d]# chmod 600 /etc/rsyncd_users.db '//給數據文件設置權限'
[root@master yum.repos.d]# ll -ld /var/www/html/ '//查看下源目錄的文件權限'
drwxr-xr-x. 2 root root 6 8月 4 2017 /var/www/html/
- 啓動rsync服務
[root@master yum.repos.d]# rsync --daemon '//啓動rsync服務,如果要停止這個服務請使用kill $(cat /var/run/rsyncd.pid)'
[root@master yum.repos.d]# netstat -ntap |grep rsync
tcp 0 0 192.168.73.200:873 0.0.0.0:* LISTEN 4371/rsync
- 在/var/www/html目錄下面新建文件
[root@master yum.repos.d]# cd /var/www/html/
[root@master html]# ls
[root@master html]# touch 111.html
[root@master html]# touch 222.html
[root@master html]# ls
111.html 222.html
'//創建完成後,我們稍後到客戶機上操作,進行驗證'
- 客戶端配置
[root@slave yum.repos.d]# yum install -y rsync
命令格式:rsync [選項] 原始位置 目標位置
[root@slave yum.repos.d]# cd /opt
[root@slave opt]# ls
rh
[root@slave opt]# rsync /etc/fstab /opt '//將本機的/etc/fstab文件同步到本機/opt下'
[root@slave opt]# ls
fstab rh
[root@slave opt]# rsync -rl /boot/grub /opt '//將本機的/boot/grub目錄同步到本機/opt下'
[root@slave opt]# ls
fstab grub rh
[root@slave opt]# mkdir myweb
'//方法一'
[root@slave opt]# rsync -avzH --delete [email protected]::wwwroot /opt/myweb
Password:
receiving incremental file list
./
111.html
222.html
sent 98 bytes received 207 bytes 87.14 bytes/sec
total size is 0 speedup is 0.00
[root@slave opt]# ls /opt/myweb/
111.html 222.html
'//方法二'
[root@slave opt]# rsync -avz rsync://[email protected]/wwwroot /root
Password:
receiving incremental file list
./
111.html
222.html
sent 98 bytes received 207 bytes 87.14 bytes/sec
total size is 0 speedup is 0.00
7.rsync源的免密交互處理
- rsync源的免密交互處理
[root@slave opt]# vi /etc/server.pass '//創建密碼文件'
lisi123
[root@slave opt]# chmod 600 /etc/server.pass '//給密碼文件權限'
[root@slave opt]# rm -rf myweb/* '//先刪除/opt/myweb目錄下的內容用來測試
[root@slave opt]# ls myweb/
[root@slave opt]# rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt/myweb '//指定剛剛創建的密碼文件,發現已經不需要輸入密碼了'
[root@slave opt]# ls myweb/
111.html 222.html
- 可以創建週期性計劃任務進行同步源服務器
[root@slave opt]# crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt/myweb/ '//每天晚上10點半對服務器網站目錄更新一次'
[root@slave opt]# systemctl restart crond
[root@slave opt]# systemctl enable crond
8.rsync實時同步
- 服務器配置
[root@master html]# vi /etc/rsyncd.conf
read only = no '//改爲no'
[root@master html]# kill `cat /var/run/rsyncd.pid` '//關閉rsync服務'
[root@master html]# netstat -ntap |grep rsync
[root@master html]# rsync --daemon '//開啓rsync服務'
[root@master html]# netstat -ntap |grep rsync
tcp 0 0 192.168.73.200:873 0.0.0.0:* LISTEN 88302/rsync
[root@master html]# chmod 777 /var/www/html
- 客戶端配置
[root@slave opt]# cat /proc/sys/fs/inotify/max_queued_events '//監控隊列大小'
16384
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_instances '//最多監控實例數'
128
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_watches '//每個實例最多監控文件數'
8192
[root@slave opt]# vi /etc/sysctl.conf
[root@slave opt]# sysctl -p
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
- 安裝inotify-tools輔助工具
[root@slave opt]# tar zxf inotify-tools-3.14.tar.gz
[root@slave opt]# cd inotify-tools-3.14/
[root@slave inotify-tools-3.14]# yum install gcc gcc-c++ -y
[root@slave inotify-tools-3.14]# ./configure
[root@slave inotify-tools-3.14]# make && make install
- 重新打開一個終端
[root@slave ~]# inotifywait -mrq -e modify,create,move,delete /opt/myweb '//運行持續監控監控'
inotifywait:用於持續監控,實時輸出結果
inotifywatch:用於短期監控,任務完成後再出結果
- 服務端編輯腳本並啓動
[root@slave inotify-tools-3.14]# vim /opt/inotify.sh
[root@slave inotify-tools-3.14]# chmod 777 /opt/myweb/
[root@slave inotify-tools-3.14]# chmod +x /opt/inotify.sh
[root@slave inotify-tools-3.14]# cd ..
[root@slave opt]# ./inotify.sh '//執行腳本進行監控'
- 重新打開終端,測試rsync上傳同步
[root@slave myweb]# touch 111.html '//客戶機創建文件,刪除文件也可以同步成功'
[root@master html]# ll '//服務端查看'
總用量 0
-rw-r--r--. 1 root root 0 3月 24 09:22 111.html '//同步成功'
'//查看剛剛運行的腳本監控'