CentOS下(rsync+inotify)监听式实现服务器间的备份实时同步

2024-06-07 17:32

本文主要是介绍CentOS下(rsync+inotify)监听式实现服务器间的备份实时同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

  • 前几天,整理了一篇 (rsync+crontab) 实现文件同步的文章),不过从网上得知,网上很多言论认为在优势上不如监听实现的效果,所以在此进行新的配置尝试,同时建议可以对比两篇文章进行参考,但是要注意服务器扮演角色的不同以及配置方式的差异,切勿混淆

rsync 可以实现服务器间的文件同步,有两种方式

一种是触发式 —— crontab;
另一种是监听式 —— inotify,但是通过 crontab 守护进程方式进行触发;
同步的数据和实际数据会有差异;
而  inotify  可以监控文件系统的各种变化;
当文件有任何变动时,就触发 rsync 同步, 这样刚好解决了同步数据的实时性问题
  • 测试环境: CentOS 6.5CentOS 7
  • 功能亮点: 监听、实时同步、相比上篇文章实现的方式要简单并且配置成功率高!

【声明】 :本文参考了网上很多前辈的言论,并通过自己的实践进行了整理,希望能帮助更多的程序猿探索之路上的顺利 …

一、概念介绍

inotify 是一种强大的、细粒度的、异步的文件系统事件控制机制

  • linux 内核从 2.6.13 起,加入了 inotify 支持,通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施监控的软件

二、功能分析

(1). 角色分配表

服务器名称IP-addrstatus工具安装系统版本操作目录
数据服务器(服务端)192.168.1.161clientrsync、inotify-toolscentos6.5/server/ftpInotify/
备份服务器(客户端)192.168.1.150serverrsynccentos7/server/ftpInotify/
  • 喜欢这个解释:

谁主动谁是客户端,谁被动谁是服务端

如果我们需要实时备份数据;
让 inotify 监控文件系统的各种变化;
当文件有任何变动时,就触发rsync 同步,则该源服务器为主动,那它就是 客户端;
备份服务器为被动方,那它就是 服务端

(2). 简要说明

  • 配置此功能,首先明确的是,在角色上,数据服务端和备份服务器可以(1:N)
1. 在操作上,最简单的配置比例为【1:1】 例如,本次的实际操作中,我配置了一个数据服务器(IP:192.168.1.161)其中的一个备份服务器(IP:192.168.1.150)后期可以根据自己的需求添加 备份服务器 数目比如说,后期个人测试时又添加了第一个备份服务器(IP:192.168.1.160)2. 功能实现的结果为:当数据服务器中的备份目录中数据发生变化时对应的,备份服务器通过监控也会及时的进行同步更新,多台备份服务器

三、配置操作

  • 在此提醒一下,本人在测试过程中,使用的是 root 账户,当然,如果使用的是其他账户,只要保证有足够的权限也可,谢谢 …

(1). 备份服务器(server)配置

(服务器IP):192.168.1.150

①. 安装 rsync(备份服务器只安装 rsync,需要启动)

  • 如今的 linux 系统,很可能已经默认安装了 rsync,可以运行命令 rpm -aq rsync 或者 rsync -v 进行查看,如下信息说明已经安装了 rsync

  • 如果没有默认安装,建议运行如下命令

yum install rsync
  • 或者使用编译安装
[root@bogon rsyncd]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@bogon rsyncd]# tar zxvf rsync-3.0.9.tar.gz  
[root@bogon rsyncd]# cd rsync-3.0.9  
[root@bogon rsyncd]# ./configure --prefix=/etc/rsyncd/rsync  #可自定义
[root@bogon rsyncd]# make  
[root@bogon rsyncd]# make install  

②. 建立 rsync 配置文件

  • 以本人为例,因为系统 centos6.5centos7 已默认安装了 rsync ,为了便于操作,本人创建了目录/etc/rsyncd/,然后添加了一个软链接,并将信息写入该目录下的 rsync.conf 文件

注意: 如果之间就默认安装的 rsync,那么就已存在 /etc/rsyncd.conf文件,所以要先删掉该文件,不然创建软链接会报错 “已存在文件xxx”

mkdir /etc/rsyncd
touch /etc/rsyncd/rsyncd.conf #创建 rsyncd.conf,这是 rsync 服务器的配置文件
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf #创建软链接
  • 在自己安装的 rsync 目录下,创建 rsyncd.conf 文件 ,并写入如下的信息
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2# [ftp]
#        path = /home/ftp
#        comment = ftp export areauid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
hosts allow = 192.168.1.161               #可以空格,允许多个
port = 873                  #默认开启端口
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log  #请定期清除该日志数据,不然数目量太大[inotify]                    
#认证模块名path = /server/ftpInotify/   
#监控目录comment = Hello My Dear!      
#此为注释信息,便于识别,可自定义ignore errors
read only = no
write only = nohosts allow = 192.168.1.161   
#此为数据服务器(client)IP地址hosts deny = *
list = false
uid = root
gid = root
auth users = root             
#赋予权限的用户,此处我用的是root用户secrets file = /etc/rsyncd/rsync.password 
#密码文件exclude = /rs1/
#指定不同步的目录,以空格分割 最前面的斜杠表示当前的‘path = /server/ftpInotify/’根目录,如果不加则表示所有的同名子目录

【注】:

1. 注释部分解释主要的配置信息
2. 尤其要注意的是,注释部分的信息设置多数是换行操作,经测试发现,部分配置信息如果在同一行,就会报 "1503" 或其他错误,比如 "secrets file" 这行同时此处对应的目录在下一步要用到.

③. 建立用户与密码认证文件

  • 以本人操作系统为例,使用 root 用户进行操作,自定义密码为 root123 (此密码并非登录密码,只是一个 rsyncclient 服务器进行交互的凭证,可自定义)
  • 创建 rsync.password 文件,并写入【用户名:密码】,记住此处的密码!
[root@bogon rsyncd]# echo "root:root123"> /etc/rsyncd/rsync.password 
  • 需要给密码文件 600 权限
[root@bogon rsyncd]# chmod 600 /etc/rsyncd/rsync.password 

【注】:

>  1."client" 端建立的密码文件,只有密码,没有用户名
>  2. 而在备份服务端 "server" 里建立的密码文件,用户名与密码都有

④. 启动 rsync

  • 以守护进程方式启动 rsync 服务器
rsync --daemon 

【注】: 修改 rsyncd.conf配置文件后,记得需要重启 rsync 服务

 killall rsyncrsync --daemon lsof -i :873 #可查看是否已启动

(2). 数据服务器(client)配置

(服务器IP):192.168.1.161

①. 安装 rsync(只需安装,无需启动)

  • 请参考上文,此处不再赘述

②. 建立访问服务端的密码认证文件

  • 为了便于操作,本人创建了目录/etc/rsyncd/
echo "root123" >/etc/rsyncd/rsync.password   
#其中 "root123" 可以自己设置密码,rsync.password 名字也可以自己设置
  • 设置权限为只读
[root@bogon rsyncd]# chmod 600 rsync.password 

③. 安装 inotify-tools

  • 查看当前系统是否支持 inotify
[root@bogon etc]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0 12月  5 20:12 max_queued_events
-rw-r--r--. 1 root root 0 12月  5 20:12 max_user_instances
-rw-r--r--. 1 root root 0 12月  5 20:12 max_user_watches
  • 依次执行如下命令
[root@bogon rsyncd]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  
[root@bogon rsyncd]# tar zxvf inotify-tools-3.14.tar.gz  
[root@bogon rsyncd]# cd inotify-tools-3.14  
[root@bogon inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@bogon inotify-tools-3.14]# make  
[root@bogon inotify-tools-3.14]# make install 
  • 如果运行 wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 命令无法获取源包(至少本人获取失败),可以下载源包,再移动到自己的操作目录

【inotify-tools-3.14.tar.gz 】 链接:https://pan.baidu.com/s/1c2OP90 密码:v01s

④. 创建 rsync 复制脚本

  • 此项功能主要是将 client 端的目录 /server/ftpInotify/ 里的内容,如果修改了(无论是添加、修改、删除文件)能够通过 inotify 监控到,并通过 rsync 实时的同步给 server/server/ftpInotify/

  • 以本人操作为例子,创建 inotify.sh 脚本文件,并写入下面的信息
    (请根据自己的需求参考注释进行修改,尽量保证该文件不会被删除,可放置于非同步目录中)

#!/bin/bash
host=192.168.1.150    #server的ip(备份服务器)
src=/server/ftpInotify/  #所要监控的备份目录(此处可以自定义,但是要保证存在)
des=inotify   #自定义的模块名,需要与client端定义的一致
password=/etc/rsyncd/rsync.password  #密码文件
user=root    #用户名(一个实际存在的账号)
inotify=/usr/local/inotify    #inotify的安装目录                ${inotify}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
  • 参考截图

  • 保存文件后,为 .sh 脚本增加 764 权限

[root@bogon server]# chmod 764 inotify.sh 
  • 运行脚本 "sh inotify.sh &" 或者 "nohup sh inotify.sh &" (前者会一直打印信息,建议使用后者)
[root@bogon server]# nohup sh inotify.sh &
[1] 1925

此时,日志信息都会默认存储到当前目录下的一个 nohup.out 文件中,可自行查看

  • 可以通过查看命令 ps -ef |grep inotify,查看 进程运行情况,如果想结束线程,可以使用命令 kill -9 xxx

    【注】: (如果可以,请将其设置为开机启动项)
  • 本人通过实测发现,网上的好多方法没能设置成功,最后找到一种适合自己的方案,仅做参考:
echo "setsid /server/inotify.sh &" >> /etc/rc.local


【重点】:

  • 因为日志信息打印的太过频繁,可以通过以下命令进行清除
[root@bogon server]#  cat /dev/null >nohup.out

------ 鄙人建议,使用计划任务定期清除日志信息 ,可参考文章:Linux crontab 定时任务的使用

> 其中提及的就有这个 "nohup.out"文件;
> 同时和前面在配置备份服务器中设置rsync打印日志的目录文件 >>> "/var/log/rsyncd.log"
> 注意不要轻易使用 "rm -rf "命令;
> 测试中发现,有影响网站运行的情况发生!!!

(3). 功能测试

当然为了稳当起见,还是要重启测试下,自启动脚本是否正常运行,保证万无一失

- 首先,保证了服务器对应的位置,都已经建立了操作目录
- 保证相应的服务都已经启动
- 例如,我在 client (192.168.1.161)"/server/ftpInotify" 目录下更改了"RE"文件,并进行了保存,此时,其所在的终端会自动打印如下信息:

  • 此时,查看server (192.168.1.150) 对应的 /server/ftpInotify目录,会发现,文件已经进行了更新

【注】:

> 1. 以上操作也可以在一台服务器实现,同步目录到不同的目录
> 2. 仿照相同的操作,可以扩展多个"server";例如我又根据上述操作,添加了一台备份服务器(IP:192.168.1.160;同时在数据服务器(IP:192.168.1.161)中还需添加一个 "inotify2.sh" 脚本文件;并同样的赋予 764 权限 然后运行脚本

四、附录

(1). 推荐/参考文章

  • rsync+inotify 实现服务器之间文件实时同步
  • rsync+inotify 实现实时同步案例
  • centos6.5 rsync+inotify 实现服务器之间文件实时同步
  • ln 命令讲解
  • Linux中使用rsync——文件和目录排除列表
  • rsync常见错误总结
  • 真正的inotify+rsync实时同步 彻底告别同步慢(特别推荐)

(2). 自测:rsync 指定不需同步的目录操作

  • 以我的备份目录为例,不同步其中的 rs1 目录,但是 rs2 目录下的所有文件不能受影响,包括同名的 rs1 目录也是需要同步的:
- server-ftpInotify-rs1RE.log-rs2-rs1RE.txtre.log

①. 第一种方式:配置 rsyncd.conf 文件

  • 此时可以配置“备份服务器”中的 rsyncd.conf 文件,其中的 “exclude” 参数可用于表示不需要同步的指定目录,注我的备注,如果写成 “rs1/”,那么结果就是所有的 rs1 目录都不同步,文件可以同样类比结论 …
exclude = /rs1/
# 指定不同步的目录,以空格分割 最前面的斜杠表示当前的 "path = /server/ftpInotify/" 根目录
# 如果不加则表示所有的同名子目录
  • 虽然实现了这个功能,却发现“数据服务器”中报出如下的信息,网上多数说文件权限问题,但总觉得不受影响 …
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
sending incremental file list
ERROR: daemon refused to receive directory "rs1"
*** Skipping any contents from this failed directory ***

②. 第二种方式:配置 .sh 脚本

  • 利用参数 --exclude 进行排除,个人测试发现,如果需要排除的是一个目录,应该注意添加后面的/,如果有多个可以依次配置,我网站的实际配置举例如下:
 rsync -avzP --delete --exclude=Public/ --exclude=Application/Runtime/  --timeout=100         --password-file=${password} $src $user@$host::$des
  • 可参考文章 -(rsync多模块配置&排除功能)

(3). 补充

  1. 对于文中涉及到的“客户端”、“服务端”的概念,在理解上或许有些不好理解,对于有所纠结的可以选择忽略这两个概念,可以直接强化“数据服务器”和“备份服务器”这两个概念
  2. 可对比文章 CentOS下(rsync+crontab)实现服务端和客户端文件备份同步 进行比较学习
  3. 执行命令过程中,有类似“文件已存在”的提示,可以先删掉文件,再按步骤进行安装 .

这篇关于CentOS下(rsync+inotify)监听式实现服务器间的备份实时同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039835

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、