小白都會的rsync遠端同步原理及-------(定期同步與rsync+inotify實時同步)實驗

實在不知道怎麼寫部落格發表於2020-10-23

前言

一:理論

1.1:什麼是rsync?有什麼作用

  • rsync,全稱為:Remote Sync(遠端同步),是一款開源的快速增量備份工具,可以在不同主機之間映象同步整個目錄樹
  • 還支援本地複製,增量備份、保持連線和許可權,或者與其他SSH,rsync主機同步
  • 採用優化的同步演算法,傳輸前執行壓縮,因此非常適用於異地備份、映象伺服器等應用

在這裡插入圖片描述

1.2:rsync源伺服器的關係

在這裡插入圖片描述

1.3:rsync在生產環境中解決了哪些問題?

  1. 內容的一致性 1000 節點 Tomcat網站 (HTML,CSS,JS)
  2. 網站內容更新 scp 1000次 shell指令碼自動執行
  3. 解決問題: rsync出現 只需要更新一個節點,其他所有節點內容同步
    作用:拉取同步
    監控

1.4:rsync實時同步的優點

在這裡插入圖片描述

1.5: rsync配置實時同步的原理

  • 跟定期同步有所不同,實時同步是基於發起端對源端的同步,而定期同步是源端對發起端的同步
  • 發起端通過inotify監控本地的同步記錄對源端進行同步,而且是一直監控的狀態,只要發起端同步資料夾發生變化,源端也會跟著發生變化
  • 侷限性:目前只能針對發起端進行實時同步,源端目前並不能監控自身實時同步發起端

1.6:關於inotify監控

在這裡插入圖片描述

rsync命令的用法

a

二、定期同步實驗

2.1:配置rsync源伺服器

2.1.1:修改配置檔案

[root@localhost html]# vim /etc/rsyncd.conf 
uid = nobody   '只能以普通使用者登入'
gid = nobody
use chroot = yes   '禁錮家目錄'
address = 20.0.0.26   '源ip'
port 873    'rsync服務埠號'
log file = /var/log/rsyncd.log  'rsync服務日誌檔案'
pid file = /var/run/rsyncd.pid  'rsync服務程式'
hosts allow = 20.0.0.0/24     '白名單:允許這個網段的來同步資料'

[wwwroot]  '共享模組'
path = /var/www/html  '指定共享目錄'
comment = www.kgc.cn  '這就是個註釋'
read only = yes   '只讀許可權'
dont compress = *.gz*.tgz*.zip*.z*.Z*.rpm*.deb*.bz2 '這一類的檔案不會被壓縮'
auth users = backuper  '同步連線的使用者'
secrets file = /etc/rsyncd_users.db  '存放使用者名稱對應密碼的檔案'

2.1.2:建立遠端連線賬戶

[root@localhost html]# vim /etc/rsyncd_users.db 
backuper:abc123

chomd 600 /etc/rsyncd_users.db

2.1.3:啟動服務且檢視狀態

//啟動服務
rsync --daemon

//檢視狀態
netstat -ntap | grep rsync

2.1.4:安裝http 生成 /var/www/html 這個目錄

yum -y install httpd


在同步目錄下建立一個 abc的檔案
cd /var/www/html
echo 'this is abc' > abc 

2.2:發起端伺服器

格式一:
[root@localhost opt]# rsync -avz backuper@20.0.0.26::wwwroot /opt/    '密碼為abc123'

格式二:
[root@localhost opt]# rsync -avz rsync://backuper@20.0.0.26::wwwroot /opt/

##免互動設定##
設定系統密碼檔案
vi /etc/server.pass
abc123

chmod 600 /etc/server.pass
delete 這種模式會將發起端請求同步的目錄內容,格式化成源伺服器上的同步目錄的內容
rsync -az --delete --password-file=/etc/server.pass backuper@20.0.0.26::wwwroot /opt

會發現發起端伺服器opt目錄中 已經出現了 abc檔案,說明同步成功

三、rsync+inotify實時同步實驗

哪一臺端需要同步就在哪一個端上面做監控

3.1:在發起端配置監控

3.1.1:修改核心配置檔案

[root@localhost ~]# vi /etc/sysctl.conf

fs.inotify.max_queued_events = 16384   '監控事件佇列大小'
fs.inotify.max_user_instances = 1024   '最多監控例項數'
fs.inotify.max_user_watches = 1048576  '每個例項最多監控檔案數'

使核心配置檔案生效
[root@localhost ~]# sysctl -p

3.1.2:安裝inotify

cd 到 opt 目錄下
將inotify-tools-3.14.tar.gz 放入目錄

解壓
tar zxvf inotify-tools-3.14.tar.gz  
cd inotify-tools-3.14

安裝環境
yum install gcc gcc-c++  make -y

編譯安裝
./configure
make && make install

3.1.3:設定監控

安裝httpd服務 監控自己
yum -y install httpd 
[root@localhost inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /var/www/html/
輸入了以上這條命令 虛擬機器會長時間進入監控狀態   ,想要繼續操作,遠端控制再開一臺就好了
-mrq 持續遞迴監控並簡要輸出     modify更新

3.1.4:測試能否監控同步記錄

試著在同步目錄建立一個檔案,並且刪除
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ls
[root@localhost html]# touch aaa
[root@localhost html]# rm -rf aaa

回到監控介面  看看是否監控到了記錄

3.1.5:編寫同步源伺服器的指令碼

vi /opt/inotify.sh

#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@20.0.0.26::wwwroot"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done

[root@localhost opt]# chmod  +x  inotify.sh 

3.1.6:給/var/www/html設定許可權

檢視html許可權是否給滿 (兩臺機子) 否則不能正常同步

[root@localhost opt]# ls -l /var/www/
total 0
drwxr-xr-x 2 root root  6 Nov  4  2018 cgi-bin
drwxrwxrwx 2 root root 17 Oct 23 06:57 html

3.2:回到源伺服器

重新啟動rsync服務

[root@localhost html]# vi /etc/rsyncd.conf 
read only = no    ##關閉只讀

使其生效
[root@localhost html]# netstat -ntap | grep rsync
tcp        0      0 20.0.0.26:873           0.0.0.0:*               LISTEN      19409/rsync   

[root@localhost html]# kill -9 19409
[root@localhost html]# netstat -ntap | grep rsync

報錯   還得把一個pid檔案刪除
[root@localhost html]# rsync  --daemon
failed to create pid file /var/run/rsyncd.pid: File exists

####解決方案####
[root@localhost html]# cd /var/run/
[root@localhost run]# ls
abrt          crond.pid        gdm            lsm             rpcbind         sshd.pid     user
alsactl.pid   cron.reboot      gssproxy.pid   lvm             rpcbind.lock    sudo         utmp
atd.pid       cryptsetup       gssproxy.sock  lvmetad.pid     rpcbind.sock    svnserve     vmware
auditd.pid    cups             httpd          mdadm           rsyncd.pid      sysconfig    xtables.lock
avahi-daemon  dbus             initramfs      mount           samba           syslogd.pid
blkid         dmeventd-client  ksmtune.pid    netreport       sepermit        systemd
certmonger    dmeventd-server  libvirt        NetworkManager  setrans         tmpfiles.d
chrony        ebtables.lock    libvirtd.pid   plymouth        setroubleshoot  tuned
chronyd.pid   faillock         lock           ppp             sm-notify.pid   udev
console       firewalld        log            radvd           spice-vdagentd  udisks2
[root@localhost run]# cat rsyncd.pid    ###上次的程式號沒有刪除
19409
[root@localhost run]# rm -rf rsyncd.pid   ##刪除程式號

重新開啟rsync 並且生成新的pid
[root@localhost run]# rsync --daemon
[root@localhost run]# netstat -ntap | grep rsync
tcp        0      0 20.0.0.26:873           0.0.0.0:*               LISTEN      76390/rsync    

3.3:回到發起端 執行指令碼

[root@localhost opt]# ./inotify.sh  '正在執行監控'
然後再開一臺遠端控制

在/var/www/html下新建一個文字
[root@localhost html]# echo "this is test" > 333.txt

到源伺服器中的同步目錄檢視是否已經同步備份
[root@localhost html]# cd /var/www/html
[root@localhost html]# ll

最終結果如下圖
發起端
a
源端
a
已成功實時同步

以上就是本次實驗的全部內容了,若有寫的不好的地方,還請多多指教,哈哈!

相關文章