rsync和inotify遠程同步

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	'//同步成功'
'//查看剛剛運行的腳本監控'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章