文件定时同步的实现:

利用rsync结合cron计划任务实现:

  1. rsync -av --delete /data/ 10.0.0.12:/back
  2. -a:保留文件属性
  3. -v:显示过程
  4. -delete:如果源文件没有的,目标文件里面有,就把目标文件里面的删除掉

文件实时同步的实现:

前提:

  文件发生发生变化的时候就触发同步,但是触发同步需要一个依赖文件状态变化的功能。

inotify

  inotify是系统内核的一个监控服务,属于操作系统内核的一个特有机制,用于监控文件的信息变化。

查看内核是否支持inotify;

  1. [root@LAP1 data]# ls -l /proc/sys/fs/inotify  
  2. ls: cannot access ' ': No such file or directory
  3. /proc/sys/fs/inotify:
  4. total 0
  5. -rw-r--r-- 1 root root 0 Oct 24 23:39 max_queued_events
  6. -rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_instances
  7. -rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_watches

inotify内核参数:

  1. max_queued_eventsinotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679
  2. max_user_instances:每个用户创建inotify实例最大值,默认值:128
  3. max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大

说明:

  proc里面的参数可以通过sysctl工具来进行更改。

inotify-tools包主要工具:

  • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控(主要使用的就是这个工具)

  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令:

  1. inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

选项:

  1. -m, --monitor 始终保持事件监听
  2. -d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
  3. -r, --recursive 递归监控目录数据信息变化
  4. -q, --quiet 输出少量事件信息
  5. --exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
  6. --excludei <pattern> exclude相似,不区分大小写
  7. -o, --outfile <file> 打印事件存到文件中,注意:使用绝对路径
  8. -s, --syslogOutput 发送错误到syslog相当于标准错误输出
  9. --timefmt <fmt> 指定时间输出格式
  10. --format <fmt> 定义输出格式;即实际监控输出内容
  11. -e 指定监听指定的事件,如果省略,表示所有事件都进行监听

例如:

  1. # 10.0.0.11
  2. [root@LAP1 data]# cat file1
  3. [root@LAP1 data]# echo hello > file1
  4. [root@LAP1 data]# ll file1
  5. -rw-r--r-- 1 root root 6 Oct 24 23:50 file1
  6. [root@LAP1 data]# chmod 666
  7. # 10.0.0.11
  8. [root@LAP1 data]# inotifywait -m file1
  9. Setting up watches.
  10. Watches established.
  11. file1 OPEN
  12. file1 CLOSE_NOWRITE,CLOSE
  13. file1 MODIFY
  14. file1 OPEN
  15. file1 MODIFY
  16. file1 CLOSE_WRITE,CLOSE
  17. file1 ATTRIB
inotifywait -e 选项指定的事件类型
  1. create #文件或目录创建
  2. delete #文件或目录被删除
  3. modify #文件或目录内容被写入
  4. attrib #文件或目录属性改变
  5. close_write #文件或目录关闭,在写入模式打开之后关闭的
  6. close_nowrite #文件或目录关闭,在只读模式打开之后关闭的
  7. close #文件或目录关闭,不管读或是写模式
  8. open #文件或目录被打开
  9. lsdir #浏览目录内容
  10. moved_to #文件或目录被移动到监控的目录中
  11. moved_from #文件或目录从监控的目录中被移动
  12. move #文件或目录不管移动到或是移出监控目录都触发事件
  13. access #文件或目录内容被读取
  14. delete_self #文件或目录被删除,目录本身被删除
  15. unmount #取消挂载
inotifywait 的--timefmt 时间格式
  1. %Y #年份信息,包含世纪信息
  2. %y #年份信息,不包括世纪信息
  3. %m #显示月份,范围 01-12
  4. %d #每月的第几天,范围是 01-31
  5. %H #小时信息,使用 24小时制,范围 00-23
  6. %M #分钟,范围 00-59
  7. %S      #秒,范例 0-60
inotifywait 的 --format 格式定义
  1. %T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
  2. %w #事件出现时,监控的文件或目录的名称信息,相当于dirname
  3. %f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
  4. %e #显示发生的事件信息,不同的事件默认用逗号分隔
  5. %Xe #显示发生的事件信息,不同的事件指定用X进行分隔

例如:监控/data/目录的变化

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

rsync工具

rsync有三种工作方式:

  • 本地模式:本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式

  • 基于传统的ssh协议,本地主机使用远程shell和远程主机通信

  • 作为一个独立服务,本地主机通过网络套接字连接远程主机上的rsync daemon

区别:

  前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

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

例如:

  1. [root@LAP1 data]# rsync file1 file111
  2. [root@LAP1 data]# ls
  3. file1 file11 file111 file2
基于传统的ssh协议使用格式:
  1. Pull:
  2. rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  3. Push:
  4. rsync [OPTION...] SRC... [USER@]HOST:DEST

例如:

  1. rsync -av --delete /data/ 10.0.0.12:/back
  2. #不写用户名默认使用的就是当前主机使用的用户
作为一个独立服务:
  1. Pull:
  2. rsync [OPTION...] [USER@]HOST::SRC... [DEST]
  3. rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] #协议的形式访问,效果等同于上面
  4. Push:
  5. rsync [OPTION...] SRC... [USER@]HOST::DEST
  6. rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
rsync常用选项:
  1. -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
  2. -a --archive :归档模式,表示递归传输并保持文件属性。
  3. -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新,检查出mtime不同从而导致增量传输无效
  4. --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服务

  1. #在备份服务器启动 rsync 进程
  2. [root@bakup_server ~]# rsync --daemon #--daemon选项表示启动为守护进程
  3. Failed to parse config file: /etc/rsyncd.conf #必须要有这个配置文件才能启动成功
  4. [root@bakup_server ~]# touch /etc/rsyncd.conf #需要创建这个配置文件才能正常启动
  5. [root@bakup_server ~]# rsync --daemon #启动rsync守护进程
  6. [root@bakup_server ~]# ss -ntl #守护进程启动后会监听873端口
  7. State Recv-Q Send-Q Local Address:Port Peer Address:Port
  8. LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
  9. #设置rsync服务器的共享信息
  10. [root@bakup_server ~]# cat /etc/rsyncd.conf #等号之间可以有空格
  11. [backup] #定义存放数据共享的名字
  12. path = /bakup #真实的路径,存放共享文件的路径 (利用rsync将这个目录共享出去,共享出去的名字叫做bakup)
  13. read only = no #指定可读写,默认只读
  14. [root@bakup_server ~]# rsync --daemon #更改问配置文件以后需要重新开启守护进程才会生效
  15. [root@bakup_server ~]# setfacl -m u:nobody:rwx /bakup/ #指定目录给nobody权限,默认用户以nobody访问此目录
  16. 使用客户端连接rsync备份服务器:
  17. #格式 rsync rsync://host 或者 rsync host::
  18. 客户端查看服务器的情况:
  19. [root@data_server ~]# rsync rsync://10.0.0.12 #以协议的形式访问
  20. backup #共享出来的名字
  21. [root@data_server ~]# rsync 10.0.0.12:: #以服务的形式访问
  22. backup
  23. #实现客户端将文件拷贝到rsync共享的目录中
  24. 注意:传输的时候不管以谁的身份,都会映射为nobody,所以不用写用户名都行
  25. [root@data_server ~]# rsync /root/anaconda-ks.cfg root@10.0.0.12::backup
  26. [root@bakup_server bakup]# ll
  27. total 8
  28. -rw------- 1 nobody nobody 1526 Oct 24 17:48 anaconda-ks.cfg
  29. -rw-r--r-- 1 nobody nobody 658 Oct 24 17:49 fstab

以独立服务方式运行rsync并实现验证功能

  rsync-daemon:安装这个软件包以后会提供一个service服务,它会监听自己的独立端口

  1. [root@bakup_server ~]# yum install rsync-daemon
  2. Installed:
  3. rsync-daemon-3.1.3-9.el8.noarch
  4. [root@bakup_server ~]# systemctl enable rsyncd.service
  5. Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service /usr/lib/systemd/system/rsyncd.service.

说明:

  rsync默认传输文件的时候不需要验证

启用rsync的验证功能的方法:

  1. [root@backup-centos8 ~]#dnf -y install rsync-daemon
  2. #安装服务的时候自动创建rsync服务器的配置文件
  3. [root@centos8 ~]#vi /etc/rsyncd.conf
  4. uid = root   #远程用户映射到本机的用户,默认为nobody 指定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody
  5. gid = root   #默认为nobody
  6. #port = 874 #可指定非标准端口,默认873/tcp
  7. #use chroot = no
  8. max connections = 0 #不限制最大连接数
  9. ignore errors #如果有些错误,就跳过这些错误
  10. exclude = lost+found/ #跳过指定的目录,不去复制
  11. log file = /var/log/rsyncd.log # 日志所在位置
  12. pid file = /var/run/rsyncd.pid # 存放进程的pid文件
  13. lock file = /var/run/rsyncd.lock # 存放锁文件
  14. reverse lookup = no # 拒绝反向解析,不把ip解析为主机名
  15. #hosts allow = 10.0.0.0/24 # 允许连接的主机
  16. [backup]   #每个模块名对应一个不同的path目录,如果同名后面模块生效 共享名
  17. path = /data/backup/   #共享的真实路径
  18. comment = backup dir #描述信息
  19. read only = no     #默认是yes,即只读
  20. auth users = rsyncuser  #默认anonymous可以访问rsync服务器 用于验证的账号,只有这个账号才能去访问
  21. secrets file = /etc/rsync.pas #存放密码的文件 格式: 用户名: 密码

例如:实现密码验证

  1. [root@CentOS8 ~]# yum install rsync-daemon
  2. [root@CentOS8 ~]# systemctl enable rsyncd --now
  3. [root@CentOS8 ~]# cat /etc/rsyncd.conf
  4. uid = root
  5. gid = root
  6. max connections = 0
  7. ignore errors
  8. exclude = lost+found/
  9. log file = /var/log/rsyncd.log
  10. pid file = /var/run/rsyncd.pid
  11. lock file = /var/run/rsyncd.lock
  12. reverse lookup = no
  13. [backup]
  14. path = /data/backup/
  15. comment = backup dir
  16. read only = no
  17. auth users = tom
  18. secrets file = /etc/rsync.pas
  19. [root@CentOS8 ~]# systemctl restart rsyncd.service
  20. [root@CentOS8 ~]# mkdir /data/backup/ -p
  21. [root@CentOS8 ~]# echo "tom:redhat" > /etc/rsync.pas
  22. [root@CentOS8 ~]# chmod 600 /etc/rsync.pas
  23. 客户端访问:
  24. [root@CentOS8 ~]# rsync /etc/fstab tom@10.0.0.12::backup
  25. Password: #交互输入tom的密码
  26. 或者:
  27. [root@CentOS8 ~]# rsync /root/anaconda-ks.cfg rsync://tom@10.0.0.12/backup
  28. Password:
  29. 注意:不指定用户名默认就是当前系统的用户

可以提前建立一个文件,将密码放在文件中

  1. #非交互式查看共享目录
  2. [root@CentOS8 ~]# echo "redhat" >/etc/rsync.pas #客户端存放rsync的密码信息
  3. [root@CentOS8 ~]# chmod 600 /etc/rsync.pas #密码文件权限修改(必须,不然会报错)
  4. 测试:
  5. [root@CentOS8 ~]# rsync --password-file=/etc/rsync.pas /root/file111 rsync://tom@10.0.0.12/backup

inotify+rsync+shell 脚本实现实时数据同步

工作原理:

  • 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

范例:inotify+rsync+shell 脚本实现实时数据同步

  1. 数据服务器:存放数据信息的服务器 10.0.0.11
  2. 备份服务器:存放备份信息的服务器 10.0.0.12

思路:利用inotidy监控事件是否发生变化,

  1. [root@CentOS8 ~]# cat inotify_rsync.sh
  2. #!/bin/bash
  3. SRC='/data/www/' #需要同步的目录文件 #注意最后的/
  4. DEST='tom@10.0.0.12::backup' #同步到备份数据器的指定位置
  5. rpm -q rsync &> /dev/null || yum -y install rsync #如果不存在rsync这个工具就安装它
  6. 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
  7. FILEPATH=${DIR}${FILE} #需要同步的文件
  8. 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
  9. done
  10. #通过DATE TIME DIR FILE 这四个变量记录发生的变化 日期 事件 目录 文件

利用inotify和rsync服务实现数据实时同步的更多相关文章

  1. centos7服务搭建常用服务配置之二:Rsync+sersync实现数据实时同步

    目录 1.RSYNC数据备份 1.1 rsync服务简介 1.2 rsync特点和优势 1.3 rysnc运行模式简介 1.4 数据同步方式 2 Rsync实验测试 2.1 实验环境说明 2.2 服务 ...

  2. Linux下Rsync+Inotify-tools实现数据实时同步

    Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...

  3. Linux下Rsync+sersync实现数据实时同步

    inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...

  4. Rsync+sersync实现数据实时同步

    前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...

  5. CentOS7下Rsync+sersync实现数据实时同步

    近期公司要上线新项目,后台框架选型我选择当前较为流行的laravel,运行环境使用lnmp. 之前我这边项目tp32+apache,开发工具使用phpstorm. 新建/编辑文件通过phpstorm配 ...

  6. centos 6.9使用Rsync+Inotify-tools实现数据实时同步

    centos 6.9使用Rsync+Inotify-tools实现数据实时同步 说明: 操作系统:CentOS 6.9 源服务器:192.168.1.222 备份服务器:192.168.1.1.233 ...

  7. 项目实战:rsync+sersync实现数据实时同步

    一.组网介绍 本次实验使用两台主机: qll251 角色:Rsync server + Sersync server qll252 角色: Rsync client 本次实验采用CentOS7.7系统 ...

  8. Rsync+Inotify-tools实现数据实时同步

    inotify是一种强大的,细粒度的,异步文件系统时间监控机制,它可以替代crond实现与rsync的触发式文件同步,从而监控文件系统中添加,删除,修改,移动等细粒事件,从LINUX 2.6.13起, ...

  9. CentOS7+rsync+sersync实现数据实时同步

    一.全网数据备份方案 1.需要备份的文件目录有(原则上,只要运维人员写入或更改的数据都需要备份)./data,/etc/rc.local,/var/spool/cron/root等,根据不同都服务器做 ...

随机推荐

  1. 开源云真机平台-Sonic应用实践

    前言 Sonic是一款开源.支持分布式部署.在线自动化测试的私有云真机平台.偶然接触到这个平台是源于虫师的一篇公众号文章<基于Linux 部署 Sonic>,于是结合文章内容和官网尝试搭建 ...

  2. Java源码分析 | Object

    本文基于 OracleJDK 11, HotSpot 虚拟机. Object 定义 Object 类是类层次结构的根.每个类都有 Object 类作为超类.所有对象,包括数组等,都实现了这个类的方法. ...

  3. Java Script的认识

     JavaScript的诞生 1.Java Script诞生于1995年.由Netscape(网景公司)的程序员Brendan Eich(布兰登)与Sun公司联手开发一门脚本语言,  最初名字叫做Mo ...

  4. 线性代数 | Jordan 标准型的笔记

    内容概述: 把方阵 A 的特征多项式 \(c(λ)=|λE-A|\) 展开成 \(c(λ)=\sum_ia_i\lambda^i\) 的形式,然后使用神乎其技的证明,得到 \(c(A)=O\),特征多 ...

  5. CSP2021-S游记

    前言 年纪大了,脑子乱了,渐渐被低年级吊打了. 大家这么内卷下去,高年级的普遍后悔自己生早了,低年级永远占优势,不只是机会优势,还有能力优势. 快进到改变基因出生国家队算了-- Day0 非常不幸地被 ...

  6. 彻底搞懂C#异步编程 async和await的原理

    1.前提 熟练掌握Task并行编程. 2.用Task并行解释async和await异步 因为控制台有多线程操作的优化,因此这里选择winform来做示例. 测试代码如下所示: 有三个textbox,一 ...

  7. RHEL7从安装的字符界面转为桌面GUI图形化步骤

    1.光驱装载原版光盘镜像 2.挂载光盘镜像 mount /dev/sr0 /media 3.配置本地yum源 vi /etc/yum.repos.d/local.repo [rhel] name=rh ...

  8. 二极管1N4148和1N4007的区别

    二极管1N4148和1N4007的定义 1N4148 是开关二极管,耐压100V,电流150mA,反向恢复速度快,为nS级别. 1N4007 是普通整流二极管,耐压1000V,电流1A ,反向恢复时间 ...

  9. 大家都能看得懂的源码之ahooks useInfiniteScroll

    本文是深入浅出 ahooks 源码系列文章的第十七篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 简介 useInfiniteScroll 封装了常见的无限滚动逻 ...

  10. KingbaseES不同字符类型比较转换规则

    Postgresql 常用的字符数据类型的有char.varchar和text,其中 char 固定长度类型, varchar 和 text 是可变长度类型.这三种类型在进行比较时,会进行隐含的类型转 ...