利用inotify和rsync服務實現數據實時同步

来源:https://www.cnblogs.com/heyongshen/archive/2022/10/24/16822630.html
-Advertisement-
Play Games

文件定時同步的實現: 利用rsync結合cron計劃任務實現: rsync -av --delete /data/ 10.0.0.12:/back -a:保留文件屬性 -v:顯示過程 -delete:如果源文件沒有的,目標文件裡面有,就把目標文件裡面的刪除掉 文件實時同步的實現: 前提: 文件發生髮 ...


文件定時同步的實現:

利用rsync結合cron計劃任務實現:

rsync -av --delete /data/  10.0.0.12:/back

-a:保留文件屬性
-v:顯示過程
-delete:如果源文件沒有的,目標文件裡面有,就把目標文件裡面的刪除掉

文件實時同步的實現:

前提:

  文件發生髮生變化的時候就觸發同步,但是觸發同步需要一個依賴文件狀態變化的功能。

inotify

  inotify是系統內核的一個監控服務,屬於操作系統內核的一個特有機制,用於監控文件的信息變化。

查看內核是否支持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_watches

inotify內核參數:

max_queued_events:inotify 事件隊列最大長度,如值太小會出現 Event Queue Overflow 錯誤,預設值:16384, 生產環境建議調大,比如:327679

max_user_instances:每個用戶創建inotify實例最大值,預設值:128

max_user_watches:可以監視的文件的總數量(inotifywait 單進程),預設值:8192,建議調大

說明:
  proc裡面的參數可以通過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  file1
Setting up watches.
Watches established.
file1 OPEN
file1 CLOSE_NOWRITE,CLOSE
file1 MODIFY
file1 OPEN
file1 MODIFY
file1 CLOSE_WRITE,CLOSE
file1 ATTRIB
inotifywait -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
inotifywait 的 --format 格式定義
%T #輸出時間格式中定義的時間格式信息,通過 --timefmt option 語法格式指定時間信息

%w #事件出現時,監控的文件或目錄的名稱信息,相當於dirname

%f #事件出現時,將顯示監控目錄下觸發事件的文件或目錄信息,否則為空,相當於basename

%e #顯示發生的事件信息,不同的事件預設用逗號分隔

%Xe #顯示發生的事件信息,不同的事件指定用X進行分隔

例如:監控/data/目錄的變化

[root@CentOS8 data]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format="%T %w---%f event: %;e" /data
Setting up watches.
Watches established.
2022-10-24 17:12:57 /data/--- event: OPEN;ISDIR
2022-10-24 17:12:57 /data/--- event: ACCESS;ISDIR
2022-10-24 17:12:57 /data/--- event: CLOSE_NOWRITE;CLOSE;ISDIR
2022-10-24 17:13:06 /data/---file3 event: CREATE
2022-10-24 17:13:06 /data/---file3 event: OPEN
2022-10-24 17:13:06 /data/---file3 event: ATTRIB
2022-10-24 17:13:06 /data/---file3 event: CLOSE_WRITE;CLOSE


rsync工具

rsync有三種工作方式:

  • 本地模式:本地文件系統上實現同步。命令行語法格式為上述"Local"段的格式

  • 基於傳統的ssh協議,本地主機使用遠程shell和遠程主機通信

  • 作為一個獨立服務,本地主機通過網路套接字連接遠程主機上的rsync daemon

區別:

  前兩者的本質是通過本地或遠程shell,而第3種方式則是讓遠程主機上運行rsyncd服務,使其監聽在一個埠上,等待客戶端的連接。

本地模式:
rsync [OPTION...] SRC... [DEST]

例如:

[root@LAP1 data]# rsync file1  file111

[root@LAP1 data]# ls
file1  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::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
rsync常用選項:
-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伺服器

  rsync即可以作為伺服器端,也可以作為客戶端程式。

方式一:通過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 [email protected]::backup


[root@bakup_server bakup]# ll
total 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並實現驗證功能

  rsync-daemon:安裝這個軟體包以後會提供一個service服務,它會監聽自己的獨立埠

[root@bakup_server ~]# yum install rsync-daemon
Installed:
  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.

說明:

  rsync預設傳輸文件的時候不需要驗證

啟用rsync的驗證功能的方法:

[root@backup-centos8 ~]#dnf -y install rsync-daemon

#安裝服務的時候自動創建rsync伺服器的配置文件
[root@centos8 ~]#vi /etc/rsyncd.conf
uid = root             #遠程用戶映射到本機的用戶,預設為nobody    指定以哪個用戶來訪問共用目錄,將之指定為生成的文件所有者,預設為nobody
gid = root             #預設為nobody
#port = 874            #可指定非標準埠,預設873/tcp
#use chroot = no
max 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.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no

[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = tom
secrets 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   [email protected]::backup
Password:  #交互輸入tom的密碼

或者: 
[root@CentOS8 ~]# rsync /root/anaconda-ks.cfg  rsync://[email protected]/backup
Password:

註意:不指定用戶名預設就是當前系統的用戶

可以提前建立一個文件,將密碼放在文件中

#非互動式查看共用目錄
[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://[email protected]/backup

inotify+rsync+shell 腳本實現實時數據同步

工作原理:

  • 要利用監控服務(inotify),監控同步數據伺服器目錄中信息的變化
  • 發現目錄中數據產生變化,就利用rsync服務推送到備份伺服器上

範例:inotify+rsync+shell 腳本實現實時數據同步

數據伺服器:存放數據信息的伺服器 10.0.0.11

備份伺服器:存放備份信息的伺服器 10.0.0.12

思路:利用inotidy監控事件是否發生變化,

[root@CentOS8 ~]# cat inotify_rsync.sh 
#!/bin/bash
SRC='/data/www/'  #需要同步的目錄文件 #註意最後的/

DEST='[email protected]::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.log
done

#通過DATE  TIME DIR FILE 這四個變數記錄發生的變化 日期 事件 目錄 文件 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 緩存概述 解決不同設備間速度不匹配問題。 互聯網分層架構:降低資料庫壓力,提升系統整體性能,縮短訪問時間。 高併發問題 緩存併發(擊穿):緩存過期後將嘗試從後端資料庫獲取數據 緩存穿透:不存在的 key,請求直接落庫查詢 緩存雪崩:緩存大面積失效,請求直接落庫查詢 需求說明 通過在方法上增加緩存註解 ...
  • 文章配合圖文詳細的講解瞭如何在使用VSCode或者PHPStorm進行php的斷點調試。相關的配置內容,和需要的插件,一些要註意的點都有介紹到。說簡單挺簡單的,但是可能少了某一步就是斷點不了,讓人很頭疼。主要是瀏覽器插件可能沒裝,導致不能配合刷新瀏覽器進行斷點。希望這篇文章能對你配置php斷點能有所... ...
  • 1、依賴 <!-- swagger 核心 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependenc ...
  • 參考文檔 COM Coding Practices Audio File Format Specifications Core Audio APIs Loopback Recording #include <iostream> #include <fstream> #include <vector> ...
  • 抽象基類 ​ 現有如下代碼: class Abstract_base { public: virtual ~Abstract_base() = 0; virtual void interface() const = 0; virtual const char* mumble() const { re ...
  • 一、導入相關依賴 <dependencies> <!--文件上傳--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</versi ...
  • C++基礎 VS快捷鍵 Ctrl +或- 跳轉到上次滑鼠焦點位置 Ctrl K F 按住Ctrl 然後按K 然後按F Ctrl J 代碼提示 變數 聲明方式:數據類型 變數名 = 變數初始值 #include <iostream> using namespace std; int main() { ...
  • 背景 最近遇到一個比較特殊需求,需要修改一個的RabbitMQ消費者,以實現在消費某種特定的類型消息時,延遲1小時再處理,幾個需要註意的點: 延遲是以小時為單位 不是所有消息都延遲消費,只延遲特定類型的消息 只在第一次消費時延遲1小時,容錯機制產生的重新消費(也即消息消費失敗,多次進入延遲隊列重試) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...