Linux sersync + rsync 實現實時數據同步

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

sersync: sersync類似於inotify,同樣用於監控,但它剋服了inotify的缺點. inotify+rsync 缺點: 一個操作可能會產生重覆的事件,這樣可能會觸發rsync的多次同步。 serync特點: 基於inotify基礎上開發而來的。 sersync的作用: 用來替代in ...


sersync:

  sersync類似於inotify,同樣用於監控,但它剋服了inotify的缺點.

inotify+rsync 缺點:

  一個操作可能會產生重覆的事件,這樣可能會觸發rsync的多次同步。

serync特點:

  基於inotify基礎上開發而來的。

sersync的作用:

  用來替代inotify+resync的腳本文件。

  • 會對對linux系統文件系統產生的臨時文件和重覆的文件操作進行過濾,在結合rsync同步的時候,節省了運行時耗和網路資源

  • 配置簡單,提供了要給xml配置文件和一個二進位可執行文件

  • 採用多線程模式

  • 自帶crontab共呢個

sersync項目地址: https://code.google.com/archive/p/sersync/
sersync下載地址: https://code.google.com/archive/p/sersync/downloads

sersync配置文件說明:

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>        # 是否開啟調試模式
    <fileSystem xfs="false"/>
    <filter start="false">    #不開啟文件過濾功能,當為true時,以下類型的文件將不同步
	<exclude expression="(.*)\.svn"></exclude>  #過濾特定尾碼的文件
	<exclude expression="(.*)\.gz"></exclude>
	<exclude expression="^info/*"></exclude>
	<exclude expression="^static/*"></exclude>
    </filter>
    <inotify> # 監控事件,表示inotify的監控事件  sersync背後調用的就是inotify,
	<delete start="true"/>
	<createFolder start="true"/>
	<createFile start="false"/>
	<closeWrite start="true"/>
	<moveFrom start="true"/>
	<moveTo start="true"/>
	<attrib start="false"/>	   #預設為false,修改此行為true,文件屬性變化後也會觸發同步。
	<modify start="false"/>
    </inotify>

    <sersync>   # rsync命令的配置段,sersync背後會嗲用rsync工具
	<localpath watch="/data/www">   #修改此行,設置需要同步的源目錄或文件,建議同步目錄 後面會監控這個目錄的變化
		<remote ip="10.0.0.12" name="backup"/>   #修改此行,指定備份伺服器地址和rsync daemon的 共用模塊名(相當於實際目錄的別名) ,如果下麵開啟了ssh start,此時name為遠程shell方式運行時的目標目錄
	    <!--<remote ip="192.168.8.39" name="tongbu"/>-->
	    <!--<remote ip="192.168.8.40" name="tongbu"/>-->
	</localpath>
	<rsync>
	    <commonParams params="-artuz"/>  # sersync是基於rsync同步的,這裡是指定rsync選項
	    <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>  #預設為false,表示驗證之後才同步。改此行為true,指定備份伺服器的rsync配置的用戶和密碼文件
	    <userDefinedPort start="false" port="874"/><!-- port=874 -->  #指定rsync的非標準埠號
	    <timeout start="false" time="100"/><!-- timeout=100 -->
	    <ssh start="false"/>  #預設使用rsync daemon運行rsync命令,true為使用遠程shell模式
	</rsync>
	<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->  #錯誤重傳及日誌文件路徑
	<crontab start="false" schedule="600"><!--600mins-->  #不開啟crontab功能
	    <crontabfilter start="false">  #不開啟crontab定時傳輸的篩選功能
		<exclude expression="*.php"></exclude>
		<exclude expression="info/*"></exclude>
	    </crontabfilter>
	</crontab>
	<plugin start="false" name="command"/>
    </sersync>

#####################################以下行不需要修改
    <plugin name="command">
	<param prefix="/bin/sh" suffix="" ignoreError="true"/>	<!--prefix /opt/tongbu/mmm.sh suffix-->
	<filter start="false">
	    <include expression="(.*)\.php"/>
	    <include expression="(.*)\.sh"/>
	</filter>
    </plugin>

    <plugin name="socket">
	<localpath watch="/opt/tongbu">
	    <deshost ip="192.168.138.20" port="8009"/>
	</localpath>
    </plugin>
    <plugin name="refreshCDN">
	<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
	    <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
	    <sendurl base="http://pic.xoyo.com/cms"/>
	    <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
	</localpath>
    </plugin>
</head>

範例:基於rsync daemon 實現 sersync

前提:
  使用rsync配置備份伺服器為rsync伺服器
  https://www.cnblogs.com/heyongshen/p/16822630.html

數據伺服器的相關配置

#在數據伺服器上下載sersync,並拷貝至相應的目錄,設置PATH變數

#下載sersync工具並解壓到指定目錄
[root@data-centos8 ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@data-centos8 ~]#cp -a GNU-Linux-x86 /usr/local/sersync

[root@data-centos8 ~]#echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh

[root@data-centos8 ~]#source /etc/profile.d/sersync.sh

#sersync目錄只有兩個文件:一個是二進位程式文件,一個是xml格式的配置文件
[root@data-centos8 ~]#ls /usr/local/sersync/confxml.xml sersync2

#安裝rsync工具

#備份sersync配置文件
[root@data-centos8 ~]#cp /usr/local/sersync/confxml.xml{,.bak}

#修改sersync配置文件
[root@CentOS8 www]# cat /usr/local/sersync/confxml.xml 
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>
    <filter start="false">
	<exclude expression="(.*)\.svn"></exclude>
	<exclude expression="(.*)\.gz"></exclude>
	<exclude expression="^info/*"></exclude>
	<exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
	<delete start="true"/>
	<createFolder start="true"/>
	<createFile start="false"/>
	<closeWrite start="true"/>
	<moveFrom start="true"/>
	<moveTo start="true"/>
	<attrib start="false"/>
	<modify start="false"/>
    </inotify>

    <sersync>
	<localpath watch="/data/www">
		<remote ip="10.0.0.12" name="backup"/>
	    <!--<remote ip="192.168.8.39" name="tongbu"/>-->
	    <!--<remote ip="192.168.8.40" name="tongbu"/>-->
	</localpath>
	<rsync>
	    <commonParams params="-artuz"/>
	    <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>
	    <userDefinedPort start="false" port="874"/><!-- port=874 -->
	    <timeout start="false" time="100"/><!-- timeout=100 -->
	    <ssh start="false"/>
	</rsync>
	<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
	<crontab start="false" schedule="600"><!--600mins-->
	    <crontabfilter start="false">
		<exclude expression="*.php"></exclude>
		<exclude expression="info/*"></exclude>
	    </crontabfilter>
	</crontab>
	<plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
	<param prefix="/bin/sh" suffix="" ignoreError="true"/>	<!--prefix /opt/tongbu/mmm.sh suffix-->
	<filter start="false">
	    <include expression="(.*)\.php"/>
	    <include expression="(.*)\.sh"/>
	</filter>
    </plugin>

    <plugin name="socket">
	<localpath watch="/opt/tongbu">
	    <deshost ip="192.168.138.20" port="8009"/>
	</localpath>
    </plugin>
    <plugin name="refreshCDN">
	<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
	    <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
	    <sendurl base="http://pic.xoyo.com/cms"/>
	    <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
	</localpath>
    </plugin>
</head>

#創建連接rsynd伺服器的用戶密碼文件,並必須修改許可權
[root@data-centos8 ~]#echo magedu > /etc/rsync.pas
[root@data-centos8 ~]#chmod 600 /etc/rsync.pas  #必須要修改密碼文件的許可權,不然會報錯

#查看幫助
[root@data-centos8 ~]#sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
c參數-n: 指定開啟守護線程的數量,預設為10個
參數-o:指定配置文件,預設使用當前工作目錄下的confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則預設執行同步程式

#以後臺方式執行同步
[root@data-centos8 ~]#sersync2 -dro /usr/local/sersync/confxml.xml  #d:守護進程模式 r:剛開始就先同步一次  o:指定配置文件的路徑

#sersync支持多實例,也即監控多個目錄時,只需分別配置不同配置文件,然後使用sersync2指定對應配置
文件運行

基於遠程shell 實現 sersync

  不需要配置rsync daemon,只需要配置基於key驗證的ssh即可

[root@data_server ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:VUxYvaSINtyfERTWH6bpMrrFeP7pfLo6+RwLU/LJvqY [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|           *B+   |
|          .oo +o |
|       . o.. ++o.|
|        =.o oo. .|
|       .S. o.+   |
|          ooB..  |
|         ..*+=   |
|         .+o*.+. |
|         ..EO&=  |
+----[SHA256]-----+

[root@data_server ~]# ssh-copy-id 10.0.0.12
# 不需要配置rsync daemon,只需要配置基於key驗證的ssh即可
[root@data-centos8 ~]#ssh-keygen
[root@data-centos8 ~]#ssh-copy-id 10.0.0.12

# 下載sersync,並拷貝至相應的目錄,設置PATH變數

# 修改sersync配置文件
[root@data-centos8 ~]#cat /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
   <host hostip="localhost" port="8008"></host>
   <debug start="false"/>
   <fileSystem xfs="false"/>
   <filter start="false">
 <exclude expression="(.*)\.svn"></exclude>
 <exclude expression="(.*)\.gz"></exclude>
 <exclude expression="^info/*"></exclude>
 <exclude expression="^static/*"></exclude>
   </filter>
   <inotify>
 <delete start="true"/>
 <createFolder start="true"/>
 <createFile start="false"/>
 <closeWrite start="true"/>
 <moveFrom start="true"/>
 <moveTo start="true"/>
 <attrib start="true"/>   # 修改此行為true,表示保留文件屬性
 <modify start="false"/>
   </inotify>
   <sersync>
 <localpath watch="/data/www">  # 修改此行,指定源數據目錄
   <remote ip="備份伺服器IP" name="/data/backup"/>  # 修改此行指定備份伺服器地址和備份目標目錄  這裡需要填寫真實路徑
   <!--<remote ip="192.168.8.39" name="tongbu"/>-->
   <!--<remote ip="192.168.8.40" name="tongbu"/>-->
 </localpath>
 <rsync>
   <commonParams params="-artuz"/>
   <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>  # 必須修改此行,表示不啟用認證,改為false
   <userDefinedPort start="false" port="874"/><!-- port=874 -->
   <timeout start="false" time="100"/><!-- timeout=100 -->
   <ssh start="true"/>    # 修改此行為true,使用遠程shell方式的rsync連接方式,無需在目標主機上配置啟動rsync daemon服務

#####################################以下行不需要修改####################################
 </rsync>
 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 
60mins execute once-->
 <crontab start="false" schedule="600"><!--600mins-->
   <crontabfilter start="false">
 <exclude expression="*.php"></exclude>
 <exclude expression="info/*"></exclude>
   </crontabfilter>
 </crontab>
 <plugin start="false" name="command"/>
   </sersync>
# 將中間的行可以刪除
</head>

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

-Advertisement-
Play Games
更多相關文章
  • 公司新開發的項目上線了,出於好奇心,打算將網站服務改為swoole測一下性能,正好換了個新電腦,可以從頭安裝一下Swoole擴展,卻發現蘋果電腦M1晶元安裝起擴展來有很多坑,花了一下午時間才搞好,網路上的解決方案都不全或者很分散,在此整合記錄一下。 一、下載 Mac上安裝擴展有兩種方式,可以用PHP ...
  • 分散式鎖的演進 基本原理 我們可以同時去一個地方“占坑”,如果占到,就執行邏輯。否則就必須等待,直到釋放鎖。“占坑”可以去redis,可以去資料庫,可以去任何大家都能訪問的地方。等待可以自旋的方式。 階段一 public Map<String, List<Catalog2Vo>> getCatalo ...
  • Python正則表達式 快速參考 常用函數: re.match():從字元串的起始位置匹配一個正則表達式。 re.search():掃描整個字元串並返回第一個成功的匹配。 re.sub():用於替換字元串中的匹配項。 re.compile():用於編譯正則表達式,生成一個正則表達式(Pattern) ...
  • 一:背景 1.講故事 前段時間有位朋友加微信,說他的程式直接 CPU=100%,每次只能手工介入重啟,讓我幫忙看下到底怎麼回事,哈哈,這種CPU打滿的事故,程式員壓力會非常大, 我讓朋友在 CPU 高的時候抓 2 個 dump 下來,然後發給我分析。 二:WinDbg 分析 1. CPU 真的被打滿 ...
  • 之前嘗試用swarm部署redis集群時網上看了很多帖子,發現大多數都是單機集群,也就是在一個伺服器上啟多個redis容器,然後進入其中一個容器執行redis搭建,經過研究,我實現了只需要通過docker-compose.yml文件和一個啟動命令就完成redis分散式部署的方式,讓其分別部署在不同機 ...
  • LVS: lvs是一個負載均衡的一個集群軟體,由內核集成,性能強大,支持百萬計併發。 LVS集群的相關概念: VS:虛擬伺服器,指LVS伺服器自身 RS:提供服務的伺服器 CIP:客戶端ip地址 VIP:lvs伺服器對外發佈的ip地址,用戶通過vip訪問集群 DIP:LVS連內網的ip地址叫DIP, ...
  • 記錄一下 Macbook 本地折騰 Wordpress 的完整過程 第一步 安裝 MySQL 詳見上一篇筆記 MacOS 安裝 MySQL 與配置環境變數 第二步 新建資料庫、用戶、分配許可權 mysql> create database 資料庫名; //註意SQL命令結尾要帶分號 mysql> SE ...
  • 寫在本文開始之前.... 從本文開始我們就正式開啟了 Linux 內核記憶體管理子系統源碼解析系列,筆者還是會秉承之前系列文章的風格,採用一步一圖的方式先是詳細介紹相關原理,在保證大家清晰理解原理的基礎上,我們再來一步一步的解析相關內核源碼的實現。有了源碼的輔證,這樣大家看得也安心,理解起來也放心,最 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...