项目实战: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-下篇…