項目實戰1:Rsync + Sersync 實現文件實時同步

項目實戰:Rsync + Sersync 實現文件實時同步

客戶端中數據發生變化,同步到server端(備份服務器)。

Rsync:負責數據同步,部署在server端

Sersync:負責監控數據目錄變化,并調用rsync進行同步,*部署在client端。

部署 Rsync 服務

安裝軟件包
[root@server ~]# yum install -y rsync-daemon
配置 rsync

本次實驗使用驗證用戶同步。

#web服務器的數據變化,同步給 backup# 準備同步目錄,該目錄任何用戶都可以讀寫。
[root@server ~]# mkdir -m 777 /backup# 配置rsync,不驗證用戶,直接同步
[root@server ~]# vim /etc/rsyncd.conf
......
# 添加如下配置
[backup]
# 描述信息
comment = backup# 備份路徑
path = /backup# 設置可寫
read only = no# 指定用戶名
auth users = rsync# 指定用戶密碼文件
secrets file = /etc/rsyncd.secrets# 創建用戶憑據文件
[root@server ~]# echo 'rsync:123' > /etc/rsyncd.secrets
[root@server ~]# chmod 400 /etc/rsyncd.secrets# 啟用并啟動rsyncd服務
[root@server ~]# systemctl enable rsyncd --now# 配置防火墻
[root@server ~]# firewall-cmd --add-service=rsyncd 
[root@server ~]# firewall-cmd --add-service=rsyncd --permanent

更多 rsyncd.conf 配置參考 rsyncd.conf(5)

客戶端配置和測試
# 準備密碼文件
[root@client ~]# echo 123 > rsyncd.secrets
#只讀權限(僅編輯用戶擁有)
[root@client ~]# chmod 400 rsyncd.secrets# 傳輸測試
#關閉	SELinux
[root@server baoshenghui]# setenforce 0[root@client ~]# rsync -av /etc/hostname rsync@server::backup
Password: 
sending incremental file list
hostnamesent 114 bytes  received 35 bytes  59.60 bytes/sec
total size is 20  speedup is 0.13# 驗證結果
[root@server ~]# ls /backup/
hostname

部署 Sersync 服務

Sersync 服務介紹

sersync 使用c++編寫,類似于inotify,同樣用于監控,但它克服了inotify的缺點。

inotify 最大的不足是會產生重復事件,或者同一個目錄下多個文件的操作會產生多個事件,例如,當監控目錄中有5個文件時,刪除目錄時會產生6個監控事件,從而導致重復調用rsync命令。比如:vim文件時,inotify會監控到臨時文件的事件,但這些事件相對于rsync來說是不應該被監控的。

sersync 優點:

  • sersync 同步效率更高,它會對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾,節省了運行時耗和網絡資源。
  • sersync配置很簡單,其中提供了靜態編譯好的二進制文件和xml配置文件,直接使用即可。
  • sersync使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
  • sersync有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
  • sersync自帶crontab功能,只需在xml配置文件中開啟,按要求隔一段時間整體同步一次。
  • sersync 可以二次開發。

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

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

安裝軟件包
# 下載軟件
[root@client ~]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz# 解壓文件
[root@client ~]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@client ~]# ls GNU-Linux-x86/
confxml.xml  sersync2

文件說明:

  • sersync2,是二進制程序。
  • confxml.xml,是sersync2程序的配置文件。
配置 Sersync
配置文件說明
[root@client ~]# cat GNU-Linux-x86/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5"><!-- hostip與port是針對插件的保留字段,對于同步功能沒有任何作用,保留默認即可。  --><host hostip="localhost" port="8008"></host><!-- 是否開啟debug模式 --><debug start="false"/><!-- 如果是xfs文件系統,則需要設置為true才能同步,rehat/REEL/CentOS/Fedora新版本默認都是xfs文件系統,可使用df -Th命令查看 --><fileSystem xfs="true"/><!-- 過濾器,設置為true則會對里面的exclude對應的正則匹配到的文件進行過濾,即不同步 --><filter start="true"><!-- <exclude expression="(.*)\.svn"></exclude> --><!-- <exclude expression="(.*)\.gz"></exclude> --><!-- <exclude expression="^info/*"></exclude> --><!-- <exclude expression="^static/*"></exclude> --><exclude expression="^cache/*"></exclude></filter><!-- inotify是linux的內核功能,這里用于設置創建/刪除/修改/移動文件時,是否視為文件改變(進而進行同步) --><inotify><!-- 刪除一個文件是否視為文件改變(很明顯我們要設置為true) --><delete start="false"/><!-- 創建一個文件夾是否視為文件改變(很明顯我們要設置為true) --><createFolder start="true"/><!-- 創建一個文件是否觸發文件改變事件(這里要設置false,因為創建一個文件除了有createFile事件還會有closeWrite事件,我們只要把closeWrite事件設置為true即可監控到創建          一個文件) --><createFile start="false"/><!-- 創建文件或修改文件后再關閉會觸發該事件,比如vim打開一個文件,修改后用(:wq)保存,則會觸發該事件,當然創建新文件一樣會觸發 --><closeWrite start="true"/><!-- 從別的地方移到被監控目錄是否視為文件改變,毫無疑問要設置為true --><moveFrom start="true"/><!-- 被監控目錄中的某個文件被移動到其他地方算不算文件改變?毫無疑問要設置為true --><moveTo start="true"/><!-- 文件屬性改變了,是否視為文件改變?這個我們可以認為文件沒有改,所以設置false --><attrib start="false"/><!-- 文件內容被修改了是否視為文件改變?感覺文件改變肯定要設置為true,但其實不用,因為這個改變有可能是vim(:w)保存,還沒有關閉文件,所以保存的時候沒必要同步,而關閉的時候會觸發closeWrite,所以修改的文件也是通過closeWrite來同步的 --><modify start="false"/></inotify><!-- servsync的模塊 --><sersync><!-- 指定要監控(即同步)的本地目錄 --><localpath watch="/data"><!-- ip指定同步到遠程的哪個服務器,name填寫遠程服務器中rsync配置文件中的自定義模塊名稱(即中括號括起來的那個名稱) --><remote ip="10.1.8.10" name="laoma"/><!-- 如果你要同步到多臺服務器,繼續填寫即可,每個服務器一個remote標簽 --><!--<remote ip="192.168.8.40" name="tongbu"/>--></localpath><!-- rsync模塊配置 --><rsync><!-- 公共參數,即我們手動執行rsync的時候要帶的選項就填在這里,servsync會自動組裝 --><commonParams params="-azP"/><!-- 密碼文件及指定用戶名(用戶名就是rsync服務器端配置文件中的"auth user =" 指定的用戶名) --><auth start="true" users="rsync" passwordfile="/etc/rsyncd.secrets"/><!-- 如果你rsync服務器不是默認端口873,那么就要在這里指定具體的端口,當然是默認的你也可以指定一下 --><userDefinedPort start="false" port="873"/><!-- rsync超時時間 --><timeout start="false" time="100"/><!-- timeout=100 --><!-- 是否使用ssh方式傳輸 --><ssh start="false"/></rsync><!-- 對于失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然后每隔一段時間(timeToExecute進行設置,單位sec)執行該腳本再次重新傳送,然后清空該腳本。可以          通過path來設置日志路徑。 --><failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><!-- 定期整體同步功能,schedule表示crontab執行間隔,單位是min --><crontab start="false" schedule="600"><!--600mins--><!-- 同步過濾器,要開啟請把start設置為true,用于 整體同步時,排除一些文件或目錄,比如緩存目錄可以不需要同步 --><crontabfilter start="false"><exclude expression="*.php"></exclude><exclude expression="info/*"></exclude></crontabfilter></crontab><!-- 同步完成后,執行一個插件,name表示執行哪些插件,而這個插件必須在后邊用plugin標簽定義 --><plugin start="false" name="command"/></sersync><!-- 定義一個command插件(command插件類型的一種,另外的類型有socket,refreshCDN,http(目前由于兼容性問題,http插件暫時不能用)) --><plugin name="command"><!-- command插件其實就是“.sh”結尾的shell腳本文件,prefix和subffix用于拼成一條執行shell命令的命令 --><param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /data/wwwroot/mmm.sh suffix--><!-- 該腳本做操作時要過濾的文件正則 --><filter start="false"><include expression="(.*)\.php"/><include expression="(.*)\.sh"/></filter></plugin><!-- 定義一個socket插件,注意插件定義了但沒有調用的話,是不會被執行的 --><plugin name="socket"><localpath watch="/data"><deshost ip="192.168.138.20" port="8009"/></localpath></plugin><!-- 定義一個refreshCDN插件,主要用于同步數據到cdn --><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>
配置文件示例

本次實驗使用的示例文件。

[root@client ~]# vim 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="true"/><filter start="true"><exclude expression="^cache/*"></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="/app_data"><remote ip="10.1.8.10" name="backup"/></localpath><rsync><commonParams params="-azP"/><auth start="true" users="rsync" passwordfile="/root/rsyncd.secrets"/><userDefinedPort start="false" port="873"/><timeout start="false" time="100"/><ssh start="false"/></rsync><failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><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"/><filter start="false"><include expression="(.*)\.php"/><include expression="(.*)\.sh"/></filter></plugin>
</head>
運行 Sersync
# 準備同步目錄
[root@client ~]# mkdir /app_data# 復制程序到$PATH中
[root@client ~]# cp GNU-Linux-x86/sersync2 /usr/local/bin/[root@client ~]# 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命令推送一遍
參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序________________________________________________________________# 運行 Sersync
[root@client ~]# sersync2 -o confxml.xml -d
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
option: -o 	config xml name:  confxml.xml
option: -d 	run as a daemon
daemon thread num: 10
parse xml config file
host ip : localhost	host port: 8008
now the filter work ,if you set the crontab,you have to set crontab filter 
WARNING XFS FILE SYSTEM WORK
daemon start,sersync run behind the console 
use rsync password-file :
user is	rsync
passwordfile is 	/root/rsyncd.secrets
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
run the sersync: 
watch path is: /app_data
測試
# server 端監控目錄 /backup
[root@server ~]# watch -n 1 ls /backup# 客戶端創建文件和目錄
[root@client ~]# echo hello world > /app_data/welcome.txt
[root@client ~]# mkdir /app_data/dbdata# 客戶端刪除文件
[root@client ~]# rm -fr /app_data/*

監控運行效果如下:(創建welcome.txt–>刪除welcome.txt)

在這里插入圖片描述

配置 systemd 管理 Sersync
[root@client ~]# cp confxml.xml /etc/sersyncd.conf
[root@client ~]# vim /etc/systemd/system/sersyncd.service
[Unit]
Description=SerSync server daemon[Service]
Type=forking
ExecStart=/usr/local/bin/sersync2 -o /etc/sersyncd.conf -d[Install]
WantedBy=multi-user.target[root@client ~]# systemctl daemon-reload 
[root@client ~]# systemctl enable sersyncd.service

oot@client ~]# cp confxml.xml /etc/sersyncd.conf
[root@client ~]# vim /etc/systemd/system/sersyncd.service
[Unit]
Description=SerSync server daemon

[Service]
Type=forking
ExecStart=/usr/local/bin/sersync2 -o /etc/sersyncd.conf -d

[Install]
WantedBy=multi-user.target

[root@client ~]# systemctl daemon-reload
[root@client ~]# systemctl enable sersyncd.service


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91929.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 全 YAML 配置 Liquibase 教程

一、項目初始化配置 1.1 創建 Spring Boot 項目 通過 Spring Initializr 生成基礎項目&#xff0c;配置如下&#xff1a; ??Project??: Maven??Language??: Java??Spring Boot??: 3.5.3&#xff08;最新穩定版&#xff09;??Project Metadata??: Group: com…

STM32-驅動OLED顯示屏使用SPI(軟件模擬時序)實現

本章概述思維導圖&#xff1a;SPI通信協議SPI通信協議介紹SPI通訊&#xff1a;高速的、串行通訊、全雙工、同步、總線協議&#xff1b;&#xff08;通過片選信號選中設備&#xff09;&#xff1b;注&#xff1a;SPI通訊通過片選信號選中設備&#xff0c;串口通訊通過端口號選中…

Easy系列PLC相對運動指令實現定長輸送(ST源代碼)

匯川Easy系列PLC總線伺服轉矩控制功能塊 Easy系列PLC總線伺服轉矩控制功能塊(詳細PDO配置+完整ST源代碼)_pdo中添加目標力矩然后映射到軸中-CSDN博客文章瀏覽閱讀215次。Easy系列PLC如何實現輪廓速度模式PV速度模式Easy系列PLC如何實現輪廓速度模式PV速度控制_匯川easy plc輪廓…

SpringCloud學習第一季-4

目錄 16.SpringCloud Alibaba Nacos服務注冊和配置中心 SpringCloud Alibaba簡介 1. 為什么出現 SpringCloud Alibaba 2. SpringCloud Alibaba帶來了什么 2.1 能干什么 2.2 去哪里下載 2.3 怎么玩 3. 學習資料的獲取 17.SpringCloud Alibaba Nacos服務注冊和配置中心 …

嵌入式開發學習———Linux環境下數據結構學習(五)

折半查找&#xff08;二分查找&#xff09;適用于已排序的數組&#xff0c;通過不斷縮小查找范圍定位目標值。int binarySearch(int arr[], int size, int target) {int left 0, right size - 1;while (left < right) {int mid left (right - left) / 2;if (arr[mid] t…

(一)React +Ts(vite創建項目/useState/Props/Interface)

文章目錄 項目地址 一、React基礎 1.1 vite創建 1. 創建項目 2. 安裝項目所需環境 1.2 jsx 1. 三元表達式 1.3 基礎 1. 創建第一個組件 2. 安裝boostrap 3. 插件常用命令 4. map 二、組件 2.1 useState 1. useState 2. 使用 3.更新對象 4. 更新數組(增,刪,改) 5. 使用immer…

網關和BFF是如何演化的

BFF&#xff08;Backend For Frontend&#xff09;:對返回的數據結構進行聚合、裁剪、透傳等適配邏輯。 適用于API網關之后的數據聚合、裁剪與透傳簡化客戶端邏輯&#xff0c;減少網絡開銷敏感數據過濾 BFF邏輯層 架構沒有最好&#xff0c;要看是否滿足當前的業務場景。 業務的…

SQL中的WITH語句(公共表表達式CTE)解釋

SQL中的WITH語句&#xff08;公共表表達式CTE&#xff09; WITH語句&#xff0c;也稱為公共表表達式&#xff08;Common Table Expression&#xff0c;CTE&#xff09;&#xff0c;是SQL中一種強大的功能&#xff0c;它允許你創建臨時結果集&#xff0c;這些結果集可以在后續的…

服務器地域選擇指南:深度分析北京/上海/廣州節點對網站速度的影響

更多云服務器知識&#xff0c;盡在hostol.com你準備開一個覆蓋全國的線上零食店&#xff0c;現在萬事俱備&#xff0c;只差一個核心問題沒解決&#xff1a;你唯一的那個總倉庫&#xff0c;應該建在哪里&#xff1f;是建在哈爾濱&#xff0c;讓南方的朋友下單后&#xff0c;一包…

桶排序-Java實現

桶排序是一種分配式排序算法&#xff0c;將元素分到有限數量的桶里&#xff0c;每個桶再單獨排序&#xff08;比如用插入排序&#xff09;&#xff0c;最后依次把各個桶中的元素取出來即完成排序。 時間復雜度&#xff1a;最佳 O(n) | 平均 O(n n/k k) | 最差 O(n) 空間復雜…

oracle知識

這里寫自定義目錄標題Oracle常用的數據類型&#xff1a;Oracle實操&#xff1a;創建數據表Oracle約束建表的時候設置約束&#xff1a;表創建后添加添加約束&#xff1a;Oracle常用的數據類型&#xff1a; Oracle實操&#xff1a;創建數據表 Oracle約束 建表的時候設置約束&…

超級人工智能+無人機操控系統,振興鄉村經濟的加速器,(申請專利應用),嚴禁抄襲!

無人機邊緣智能系統&#xff1a;山林珍稀資源探測的完整架構與實戰指南本人設計的多模態邊緣AI系統已在秦嶺山區完成實地驗證&#xff0c;對7種高價值食用菌識別準確率達94.3%&#xff0c;定位誤差小于0.8米一、前沿技術融合的商業化機遇根據Gartner 2025年技術成熟度曲線分析&…

用騰訊地圖寫一個逆地址解析(很詳細)

首先說明以下代碼適合有前端基礎知識的同學。以下是css和html部分<!DOCTYPE html><html lang"zh-CN"><!-- lang是用來申明語言類型&#xff0c;這里申明為中文&#xff08;zh&#xff09;中國大陸&#xff08;CN&#xff09;補充中文繁體為zh-TW --&g…

在 Vue3+Vite+TypeScript 項目中使用 svg 文件并支持自定義樣式

參考文檔&#xff1a;vite-svg-loader 安裝與配置 安裝插件 pnpm add vite-svg-loader -D配置 // vite.config.ts import svgLoader from vite-svg-loaderexport default defineConfig({plugins: [vue(),svgLoader({defaultImport: component})] })使用 <script setup …

ShimetaPi M4-R1:國產高性能嵌入式平臺的異構計算架構與OpenHarmony生態實踐

在全球化芯片供應鏈波動及樹莓派等硬件持續漲價的背景下&#xff0c;ShimetaPi M4-R1 作為全棧國產化嵌入式開發平臺&#xff0c;以 高性能異構計算架構 和 開源鴻蒙原生支持 為核心突破點&#xff0c;填補了中高端邊緣設備開發的國產方案空白。其基于瑞芯微 RK3568B2 的硬件設…

zookeeper分布式鎖 -- 讀鎖和寫鎖實現方式

讀鎖和寫鎖讀鎖: 是共享鎖,讀鎖與讀鎖是可以兼容的,所以同時有多個請求都可以持有寫鎖: 是獨占鎖,寫鎖與任何鎖都互斥,所以只有一個請求持有,這個請求釋放寫鎖其他請求才能持有一旦持有寫鎖,說明數據在發送變化就不能讀了,自然一個請求就不能出現讀鎖和寫鎖共存的情況總結: 讀鎖…

第二篇:Linux 文件系統操作:從基礎到進階

目錄 一、文件與目錄管理基礎 創建文件 創建目錄 目錄結構查看 二、鏈接文件深入理解 創建軟鏈接 創建硬鏈接 核心區別對比 三、文件壓縮與解壓縮全攻略 1、壓縮命令對比 2、解壓縮命令 3、三種壓縮方式性能對比 4、通用解壓技巧 四、文件查找與搜索 1、按文件名…

嗶哩嗶哩招游戲內容產品運營

游戲內容產品運營【2026屆】&#xff08;崗位信息已獲jobleap.cn授權轉發到csdn&#xff09;嗶哩嗶哩集團 上海收錄時間&#xff1a; 2025年08月01日職位描述1、負責研究B站游戲創作者的創作過程、動機及遇到的問題&#xff0c;產出研究報告&#xff1b; 2、結合用研分析和相關…

談談Flutter中的Key

目錄 前言 一、什么是Key 1.StatelessWidget 2.StatefulWidget 3.加入Key后的效果 二、什么時候應該使用 Key&#xff1f; 1.Flutter判斷widget的邏輯 1.Flutter判斷組件身份的規則 1.Widget的類型&#xff08;runtimeType&#xff09;相同 2. Key相同&#xff08;ke…

重生之我在暑假學習微服務第八天《OpenFeign篇》

個人主頁&#xff1a;VON文章所屬專欄&#xff1a;微服務 微服務系列文章 重生之我在暑假學習微服務第一天《MybatisPlus-上篇》重生之我在暑假學習微服務第二天《MybatisPlus-下篇》重生之我在暑假學習微服務第三天《Docker-上篇》重生之我在暑假學習微服務第四天《Docker-下篇…