Linux利用inotify和rsync服務實現數據實時同步的原理解析
文件定時同步的實現:
使用rsync和cron進行任務規劃;
rsync -av --delete /data/ 10.0.0.12:/back-a:保留文件屬性-v:顯示過程-delete:如果源文件沒有的,目標文件里面有,就把目標文件里面的刪除掉文件實時同步的實現:
前提:
& emsp& emsp當文件改變時,它觸發同步,但是觸發同步需要依賴于文件狀態改變的功能。
無知
& emsp& emspInotify是系統內核的監控服務,屬于操作系統內核特有的機制,用于監控文件的信息變化。
檢查內核是否支持inotify;
[root@LAP1 data]# ls -l /proc/sys/fs/inotify ls: cannot access ' ': No such file or directory/proc/sys/fs/inotify:total 0-rw-r--r-- 1 root root 0 Oct 24 23:39 max_queued_events-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_instances-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_watchesInotify內核參數:
max_queued_events:inotify 事件隊列最大長度,如值太小會出現 Event Queue Overflow 錯誤,默認值:16384, 生產環境建議調大,比如:327679max_user_instances:每個用戶創建inotify實例最大值,默認值:128max_user_watches:可以監視的文件的總數量(inotifywait 單進程),默認值:8192,建議調大描述:
& emsp;& emspproc中的參數可以通過sysctl工具更改。
inotify-tools包的主要工具:
inotifywait: 在被監控的文件或目錄上等待特定文件系統事件(open ,close,delete等)發生,常用于實時同步的目錄監控(主要使用的就是這個工具)inotifywatch:收集被監控的文件系統使用的統計數據,指文件系統事件發生的次數統計Inotifywait命令:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]選項:
-m, --monitor 始終保持事件監聽-d, --daemon 以守護進程方式執行,和-m相似,配合-o使用-r, --recursive 遞歸監控目錄數據信息變化-q, --quiet 輸出少量事件信息--exclude <pattern> 指定排除文件或目錄,使用擴展的正則表達式匹配的模式實現--excludei <pattern> 和exclude相似,不區分大小寫-o, --outfile <file> 打印事件存到文件中,注意:使用絕對路徑-s, --syslogOutput 發送錯誤到syslog相當于標準錯誤輸出--timefmt <fmt> 指定時間輸出格式--format <fmt> 定義輸出格式;即實際監控輸出內容-e 指定監聽指定的事件,如果省略,表示所有事件都進行監聽例如:
# 10.0.0.11[root@LAP1 data]# cat file1 [root@LAP1 data]# echo hello > file1[root@LAP1 data]# ll file1-rw-r--r-- 1 root root 6 Oct 24 23:50 file1[root@LAP1 data]# chmod 666 # 10.0.0.11[root@LAP1 data]# inotifywait -m file1Setting up watches.Watches established.file1 OPENfile1 CLOSE_NOWRITE,CLOSEfile1 MODIFYfile1 OPENfile1 MODIFYfile1 CLOSE_WRITE,CLOSEfile1 ATTRIB由inoywait-e選項指定的事件類型。
create #文件或目錄創建delete #文件或目錄被刪除modify #文件或目錄內容被寫入attrib #文件或目錄屬性改變close_write #文件或目錄關閉,在寫入模式打開之后關閉的close_nowrite #文件或目錄關閉,在只讀模式打開之后關閉的close #文件或目錄關閉,不管讀或是寫模式open #文件或目錄被打開lsdir #瀏覽目錄內容moved_to #文件或目錄被移動到監控的目錄中moved_from #文件或目錄從監控的目錄中被移動move #文件或目錄不管移動到或是移出監控目錄都觸發事件access #文件或目錄內容被讀取delete_self #文件或目錄被刪除,目錄本身被刪除unmount #取消掛載Inotifywait - timefmt時間格式
%Y #年份信息,包含世紀信息%y #年份信息,不包括世紀信息%m #顯示月份,范圍 01-12%d #每月的第幾天,范圍是 01-31%H #小時信息,使用 24小時制,范圍 00-23 %M #分鐘,范圍 00-59 %S #秒,范例 0-60-格式tifywait的格式定義
%T #輸出時間格式中定義的時間格式信息,通過 --timefmt option 語法格式指定時間信息%w #事件出現時,監控的文件或目錄的名稱信息,相當于dirname%f #事件出現時,將顯示監控目錄下觸發事件的文件或目錄信息,否則為空,相當于basename%e #顯示發生的事件信息,不同的事件默認用逗號分隔%Xe #顯示發生的事件信息,不同的事件指定用X進行分隔例如,監視/data/ directory的變化
[root@CentOS8 data]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format="%T %w---%f event: %;e" /dataSetting up watches.Watches established.2022-10-24 17:12:57 /data/--- event: OPEN;ISDIR2022-10-24 17:12:57 /data/--- event: ACCESS;ISDIR2022-10-24 17:12:57 /data/--- event: CLOSE_NOWRITE;CLOSE;ISDIR2022-10-24 17:13:06 /data/---file3 event: CREATE2022-10-24 17:13:06 /data/---file3 event: OPEN2022-10-24 17:13:06 /data/---file3 event: ATTRIB2022-10-24 17:13:06 /data/---file3 event: CLOSE_WRITE;CLOSErsync工具
Rsync以三種方式工作:
本地模式:本地文件系統上實現同步。命令行語法格式為上述"Local"段的格式基于傳統的ssh協議,本地主機使用遠程shell和遠程主機通信作為一個獨立服務,本地主機通過網絡套接字連接遠程主機上的rsync daemon差異:
& emsp& emsp前兩種方法的本質是通過本地或遠程shell,而第三種方法是在遠程主機上運行rsyncd服務,這樣它就在一個端口上偵聽并等待客戶端的連接。
本地模式:
rsync [OPTION...] SRC... [DEST]例如:
[root@LAP1 data]# rsync file1 file111[root@LAP1 data]# lsfile1 file11 file111 file2基于傳統的ssh協議使用格式:
Pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push:rsync [OPTION...] SRC... [USER@]HOST:DEST例如:
rsync -av --delete /data/ 10.0.0.12:/back#不寫用戶名默認使用的就是當前主機使用的用戶作為一項獨立的服務:
Pull:rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] #協議的形式訪問,效果等同于上面Push:rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DESTRsync常見選項:
-v:顯示rsync過程中詳細信息。可以使用"-vvvv"獲取更詳細信息。-a --archive :歸檔模式,表示遞歸傳輸并保持文件屬性。-t --times:保持mtime屬性。強烈建議任何時候都加上"-t",否則目標文件mtime會設置為系統時間,導致下次更新,檢查出mtime不同從而導致增量傳輸無效--delete :以SRC為主,對DEST進行同步。多則刪之,少則補之Rsync的軟件包:
官方網站:http://rsync.samba.org/
包:rsync,rsync-daemon(CentOS 8)
服務文件:/usr/lib/systemd/system/rsyncd . service
配置文件:/etc/rsyncd.conf
端口:873/tcp
兩種方式實現rsync服務器
& emsp& emspRsync可以用作服務器或客戶端程序。
方法一:rsync服務由rsync守護進程實現。
#在備份服務器啟動 rsync 進程[root@bakup_server ~]# rsync --daemon #--daemon選項表示啟動為守護進程Failed to parse config file: /etc/rsyncd.conf #必須要有這個配置文件才能啟動成功[root@bakup_server ~]# touch /etc/rsyncd.conf #需要創建這個配置文件才能正常啟動[root@bakup_server ~]# rsync --daemon #啟動rsync守護進程[root@bakup_server ~]# ss -ntl #守護進程啟動后會監聽873端口State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 0.0.0.0:873 0.0.0.0:* #設置rsync服務器的共享信息[root@bakup_server ~]# cat /etc/rsyncd.conf #等號之間可以有空格[backup] #定義存放數據共享的名字path = /bakup #真實的路徑,存放共享文件的路徑 (利用rsync將這個目錄共享出去,共享出去的名字叫做bakup)read only = no #指定可讀寫,默認只讀[root@bakup_server ~]# rsync --daemon #更改問配置文件以后需要重新開啟守護進程才會生效[root@bakup_server ~]# setfacl -m u:nobody:rwx /bakup/ #指定目錄給nobody權限,默認用戶以nobody訪問此目錄使用客戶端連接rsync備份服務器:#格式 rsync rsync://host 或者 rsync host::客戶端查看服務器的情況:[root@data_server ~]# rsync rsync://10.0.0.12 #以協議的形式訪問backup #共享出來的名字[root@data_server ~]# rsync 10.0.0.12:: #以服務的形式訪問backup#實現客戶端將文件拷貝到rsync共享的目錄中注意:傳輸的時候不管以誰的身份,都會映射為nobody,所以不用寫用戶名都行[root@data_server ~]# rsync /root/anaconda-ks.cfg root@10.0.0.12::backup[root@bakup_server bakup]# lltotal 8-rw------- 1 nobody nobody 1526 Oct 24 17:48 anaconda-ks.cfg-rw-r--r-- 1 nobody nobody 658 Oct 24 17:49 fstab將rsync作為獨立的服務運行,并實現驗證功能。
& emsp& emspRsync-daemon:安裝這個包后,會提供一個service服務,它會監聽自己獨立的端口。
[root@bakup_server ~]# yum install rsync-daemonInstalled: rsync-daemon-3.1.3-9.el8.noarch[root@bakup_server ~]# systemctl enable rsyncd.service Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.描述:
& emsp& emsp默認情況下,Rsync在傳輸文件時不需要驗證。
啟用rsync認證功能的方法:
[root@backup-centos8 ~]#dnf -y install rsync-daemon#安裝服務的時候自動創建rsync服務器的配置文件[root@centos8 ~]#vi /etc/rsyncd.confuid = root #遠程用戶映射到本機的用戶,默認為nobody 指定以哪個用戶來訪問共享目錄,將之指定為生成的文件所有者,默認為nobodygid = root #默認為nobody#port = 874 #可指定非標準端口,默認873/tcp#use chroot = nomax connections = 0 #不限制最大連接數ignore errors #如果有些錯誤,就跳過這些錯誤exclude = lost+found/ #跳過指定的目錄,不去復制log file = /var/log/rsyncd.log # 日志所在位置pid file = /var/run/rsyncd.pid # 存放進程的pid文件lock file = /var/run/rsyncd.lock # 存放鎖文件reverse lookup = no # 拒絕反向解析,不把ip解析為主機名#hosts allow = 10.0.0.0/24 # 允許連接的主機[backup] #每個模塊名對應一個不同的path目錄,如果同名后面模塊生效 共享名path = /data/backup/ #共享的真實路徑comment = backup dir #描述信息read only = no #默認是yes,即只讀auth users = rsyncuser #默認anonymous可以訪問rsync服務器 用于驗證的賬號,只有這個賬號才能去訪問secrets file = /etc/rsync.pas #存放密碼的文件 格式: 用戶名: 密碼比如實現密碼驗證。
[root@CentOS8 ~]# yum install rsync-daemon[root@CentOS8 ~]# systemctl enable rsyncd --now[root@CentOS8 ~]# cat /etc/rsyncd.confuid = rootgid = rootmax connections = 0ignore errorsexclude = lost+found/log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock file = /var/run/rsyncd.lockreverse lookup = no[backup]path = /data/backup/comment = backup dirread only = noauth users = tomsecrets file = /etc/rsync.pas[root@CentOS8 ~]# systemctl restart rsyncd.service[root@CentOS8 ~]# mkdir /data/backup/ -p[root@CentOS8 ~]# echo "tom:redhat" > /etc/rsync.pas[root@CentOS8 ~]# chmod 600 /etc/rsync.pas#必須要修改密碼文件權限,不然客戶端訪問的時候會提示密碼錯誤客戶端訪問:[root@CentOS8 ~]# rsync /etc/fstab tom@10.0.0.12::backupPassword: #交互輸入tom的密碼或者: [root@CentOS8 ~]# rsync /root/anaconda-ks.cfg rsync://tom@10.0.0.12/backupPassword:注意:不指定用戶名默認就是當前系統的用戶可以提前創建一個文件,把密碼放在文件里。
#非交互式查看共享目錄[root@CentOS8 ~]# echo "redhat" >/etc/rsync.pas #客戶端存放rsync的密碼信息[root@CentOS8 ~]# chmod 600 /etc/rsync.pas #密碼文件權限修改(必須,不然會報錯)測試:[root@CentOS8 ~]# rsync --password-file=/etc/rsync.pas /root/file111 rsync://tom@10.0.0.12/backupinotify+rsync+shell 腳本實現實時數據同步
工作原理:
要利用監控服務(inotify),監控同步數據服務器目錄中信息的變化發現目錄中數據產生變化,就利用rsync服務推送到備份服務器上示例:inotify+rsync+shell腳本實現實時數據同步。
數據服務器:存放數據信息的服務器 10.0.0.11備份服務器:存放備份信息的服務器 10.0.0.12想法:使用inotidy來監控事件是否發生變化,
[root@CentOS8 ~]# cat inotify_rsync.sh #!/bin/bashSRC='/data/www/' #需要同步的目錄文件 #注意最后的/DEST='tom@10.0.0.12::backup' #同步到備份數據器的指定位置rpm -q rsync &> /dev/null || yum -y install rsync #如果不存在rsync這個工具就安裝它inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE; do FILEPATH=${DIR}${FILE} #需要同步的文件 rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.logdone#通過DATE TIME DIR FILE 這四個變量記錄發生的變化 日期 事件 目錄 文件關于Linux使用inotify和rsync服務實現實時數據同步的這篇文章到此為止。關于Linux實時數據同步的更多信息,請搜索Script House以前的文章或繼續瀏覽下面的相關文章。希望大家以后多多支持劇本之家!
如果您的問題還未解決可以聯系站長付費協助。

有問題可以加入技術QQ群一起交流學習
本站vip會員 請加入無憂模板網 VIP群(50604020) PS:加入時備注用戶名或昵稱
普通注冊會員或訪客 請加入無憂模板網 技術交流群(50604130)
客服微信號:15898888535
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若內容侵犯了原著者的合法權益,可聯系站長刪除。