Linux利用inotify和rsync服务实现数据实时同步的原理解析
文件定时同步的实现:
使用rsync和cron进行任务规划;
rsync -av --delete /data/ 10.0.0.12:/back-a:保留文件属性-v:显示过程-delete:如果源文件没有的,目标文件里面有,就把目标文件里面的删除掉文件实时同步的实现:
前提:
& emsp& emsp当文件改变时,它触发同步,但是触发同步需要依赖于文件状态改变的功能。
无知
& emsp& emspInotify是系统内核的监控服务,属于操作系统内核特有的机制,用于监控文件的信息变化。
检查内核是否支持inotify;
[root@LAP1 data]# ls -l /proc/sys/fs/inotify ls: cannot access ' ': No such file or directory/proc/sys/fs/inotify:total 0-rw-r--r-- 1 root root 0 Oct 24 23:39 max_queued_events-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_instances-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_watchesInotify内核参数:
max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679max_user_instances:每个用户创建inotify实例最大值,默认值:128max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大描述:
& emsp;& emspproc中的参数可以通过sysctl工具更改。
inotify-tools包的主要工具:
inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控(主要使用的就是这个工具)inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计Inotifywait命令:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]选项:
-m, --monitor 始终保持事件监听-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用-r, --recursive 递归监控目录数据信息变化-q, --quiet 输出少量事件信息--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现--excludei <pattern> 和exclude相似,不区分大小写-o, --outfile <file> 打印事件存到文件中,注意:使用绝对路径-s, --syslogOutput 发送错误到syslog相当于标准错误输出--timefmt <fmt> 指定时间输出格式--format <fmt> 定义输出格式;即实际监控输出内容-e 指定监听指定的事件,如果省略,表示所有事件都进行监听例如:
# 10.0.0.11[root@LAP1 data]# cat file1 [root@LAP1 data]# echo hello > file1[root@LAP1 data]# ll file1-rw-r--r-- 1 root root 6 Oct 24 23:50 file1[root@LAP1 data]# chmod 666 # 10.0.0.11[root@LAP1 data]# inotifywait -m file1Setting up watches.Watches established.file1 OPENfile1 CLOSE_NOWRITE,CLOSEfile1 MODIFYfile1 OPENfile1 MODIFYfile1 CLOSE_WRITE,CLOSEfile1 ATTRIB由inoywait-e选项指定的事件类型。
create #文件或目录创建delete #文件或目录被删除modify #文件或目录内容被写入attrib #文件或目录属性改变close_write #文件或目录关闭,在写入模式打开之后关闭的close_nowrite #文件或目录关闭,在只读模式打开之后关闭的close #文件或目录关闭,不管读或是写模式open #文件或目录被打开lsdir #浏览目录内容moved_to #文件或目录被移动到监控的目录中moved_from #文件或目录从监控的目录中被移动move #文件或目录不管移动到或是移出监控目录都触发事件access #文件或目录内容被读取delete_self #文件或目录被删除,目录本身被删除unmount #取消挂载Inotifywait - timefmt时间格式
%Y #年份信息,包含世纪信息%y #年份信息,不包括世纪信息%m #显示月份,范围 01-12%d #每月的第几天,范围是 01-31%H #小时信息,使用 24小时制,范围 00-23 %M #分钟,范围 00-59 %S #秒,范例 0-60-格式tifywait的格式定义
%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息%w #事件出现时,监控的文件或目录的名称信息,相当于dirname%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename%e #显示发生的事件信息,不同的事件默认用逗号分隔%Xe #显示发生的事件信息,不同的事件指定用X进行分隔例如,监视/data/ directory的变化
[root@CentOS8 data]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format="%T %w---%f event: %;e" /dataSetting up watches.Watches established.2022-10-24 17:12:57 /data/--- event: OPEN;ISDIR2022-10-24 17:12:57 /data/--- event: ACCESS;ISDIR2022-10-24 17:12:57 /data/--- event: CLOSE_NOWRITE;CLOSE;ISDIR2022-10-24 17:13:06 /data/---file3 event: CREATE2022-10-24 17:13:06 /data/---file3 event: OPEN2022-10-24 17:13:06 /data/---file3 event: ATTRIB2022-10-24 17:13:06 /data/---file3 event: CLOSE_WRITE;CLOSErsync工具
Rsync以三种方式工作:
本地模式:本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式基于传统的ssh协议,本地主机使用远程shell和远程主机通信作为一个独立服务,本地主机通过网络套接字连接远程主机上的rsync daemon差异:
& emsp& emsp前两种方法的本质是通过本地或远程shell,而第三种方法是在远程主机上运行rsyncd服务,这样它就在一个端口上侦听并等待客户端的连接。
本地模式:
rsync [OPTION...] SRC... [DEST]例如:
[root@LAP1 data]# rsync file1 file111[root@LAP1 data]# lsfile1 file11 file111 file2基于传统的ssh协议使用格式:
Pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push:rsync [OPTION...] SRC... [USER@]HOST:DEST例如:
rsync -av --delete /data/ 10.0.0.12:/back#不写用户名默认使用的就是当前主机使用的用户作为一项独立的服务:
Pull:rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] #协议的形式访问,效果等同于上面Push:rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DESTRsync常见选项:
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。-a --archive :归档模式,表示递归传输并保持文件属性。-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新,检查出mtime不同从而导致增量传输无效--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服务器
& emsp& emspRsync可以用作服务器或客户端程序。
方法一:rsync服务由rsync守护进程实现。
#在备份服务器启动 rsync 进程[root@bakup_server ~]# rsync --daemon #--daemon选项表示启动为守护进程Failed to parse config file: /etc/rsyncd.conf #必须要有这个配置文件才能启动成功[root@bakup_server ~]# touch /etc/rsyncd.conf #需要创建这个配置文件才能正常启动[root@bakup_server ~]# rsync --daemon #启动rsync守护进程[root@bakup_server ~]# ss -ntl #守护进程启动后会监听873端口State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 0.0.0.0:873 0.0.0.0:* #设置rsync服务器的共享信息[root@bakup_server ~]# cat /etc/rsyncd.conf #等号之间可以有空格[backup] #定义存放数据共享的名字path = /bakup #真实的路径,存放共享文件的路径 (利用rsync将这个目录共享出去,共享出去的名字叫做bakup)read only = no #指定可读写,默认只读[root@bakup_server ~]# rsync --daemon #更改问配置文件以后需要重新开启守护进程才会生效[root@bakup_server ~]# setfacl -m u:nobody:rwx /bakup/ #指定目录给nobody权限,默认用户以nobody访问此目录使用客户端连接rsync备份服务器:#格式 rsync rsync://host 或者 rsync host::客户端查看服务器的情况:[root@data_server ~]# rsync rsync://10.0.0.12 #以协议的形式访问backup #共享出来的名字[root@data_server ~]# rsync 10.0.0.12:: #以服务的形式访问backup#实现客户端将文件拷贝到rsync共享的目录中注意:传输的时候不管以谁的身份,都会映射为nobody,所以不用写用户名都行[root@data_server ~]# rsync /root/anaconda-ks.cfg root@10.0.0.12::backup[root@bakup_server bakup]# lltotal 8-rw------- 1 nobody nobody 1526 Oct 24 17:48 anaconda-ks.cfg-rw-r--r-- 1 nobody nobody 658 Oct 24 17:49 fstab将rsync作为独立的服务运行,并实现验证功能。
& emsp& emspRsync-daemon:安装这个包后,会提供一个service服务,它会监听自己独立的端口。
[root@bakup_server ~]# yum install rsync-daemonInstalled: rsync-daemon-3.1.3-9.el8.noarch[root@bakup_server ~]# systemctl enable rsyncd.service Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.描述:
& emsp& emsp默认情况下,Rsync在传输文件时不需要验证。
启用rsync认证功能的方法:
[root@backup-centos8 ~]#dnf -y install rsync-daemon#安装服务的时候自动创建rsync服务器的配置文件[root@centos8 ~]#vi /etc/rsyncd.confuid = root #远程用户映射到本机的用户,默认为nobody 指定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobodygid = root #默认为nobody#port = 874 #可指定非标准端口,默认873/tcp#use chroot = nomax connections = 0 #不限制最大连接数ignore errors #如果有些错误,就跳过这些错误exclude = lost+found/ #跳过指定的目录,不去复制log file = /var/log/rsyncd.log # 日志所在位置pid file = /var/run/rsyncd.pid # 存放进程的pid文件lock file = /var/run/rsyncd.lock # 存放锁文件reverse lookup = no # 拒绝反向解析,不把ip解析为主机名#hosts allow = 10.0.0.0/24 # 允许连接的主机[backup] #每个模块名对应一个不同的path目录,如果同名后面模块生效 共享名path = /data/backup/ #共享的真实路径comment = backup dir #描述信息read only = no #默认是yes,即只读auth users = rsyncuser #默认anonymous可以访问rsync服务器 用于验证的账号,只有这个账号才能去访问secrets file = /etc/rsync.pas #存放密码的文件 格式: 用户名: 密码比如实现密码验证。
[root@CentOS8 ~]# yum install rsync-daemon[root@CentOS8 ~]# systemctl enable rsyncd --now[root@CentOS8 ~]# cat /etc/rsyncd.confuid = rootgid = rootmax connections = 0ignore errorsexclude = lost+found/log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock file = /var/run/rsyncd.lockreverse lookup = no[backup]path = /data/backup/comment = backup dirread only = noauth users = tomsecrets file = /etc/rsync.pas[root@CentOS8 ~]# systemctl restart rsyncd.service[root@CentOS8 ~]# mkdir /data/backup/ -p[root@CentOS8 ~]# echo "tom:redhat" > /etc/rsync.pas[root@CentOS8 ~]# chmod 600 /etc/rsync.pas#必须要修改密码文件权限,不然客户端访问的时候会提示密码错误客户端访问:[root@CentOS8 ~]# rsync /etc/fstab tom@10.0.0.12::backupPassword: #交互输入tom的密码或者: [root@CentOS8 ~]# rsync /root/anaconda-ks.cfg rsync://tom@10.0.0.12/backupPassword:注意:不指定用户名默认就是当前系统的用户可以提前创建一个文件,把密码放在文件里。
#非交互式查看共享目录[root@CentOS8 ~]# echo "redhat" >/etc/rsync.pas #客户端存放rsync的密码信息[root@CentOS8 ~]# chmod 600 /etc/rsync.pas #密码文件权限修改(必须,不然会报错)测试:[root@CentOS8 ~]# rsync --password-file=/etc/rsync.pas /root/file111 rsync://tom@10.0.0.12/backupinotify+rsync+shell 脚本实现实时数据同步
工作原理:
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化发现目录中数据产生变化,就利用rsync服务推送到备份服务器上示例:inotify+rsync+shell脚本实现实时数据同步。
数据服务器:存放数据信息的服务器 10.0.0.11备份服务器:存放备份信息的服务器 10.0.0.12想法:使用inotidy来监控事件是否发生变化,
[root@CentOS8 ~]# cat inotify_rsync.sh #!/bin/bashSRC='/data/www/' #需要同步的目录文件 #注意最后的/DEST='tom@10.0.0.12::backup' #同步到备份数据器的指定位置rpm -q rsync &> /dev/null || yum -y install rsync #如果不存在rsync这个工具就安装它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 FILEPATH=${DIR}${FILE} #需要同步的文件 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.logdone#通过DATE TIME DIR FILE 这四个变量记录发生的变化 日期 事件 目录 文件关于Linux使用inotify和rsync服务实现实时数据同步的这篇文章到此为止。关于Linux实时数据同步的更多信息,请搜索Script House以前的文章或继续浏览下面的相关文章。希望大家以后多多支持剧本之家!
如果您的问题还未解决可以联系站长付费协助。
有问题可以加入技术QQ群一起交流学习
本站vip会员 请加入无忧模板网 VIP群(50604020) PS:加入时备注用户名或昵称
普通注册会员或访客 请加入无忧模板网 技术交流群(50604130)
客服微信号:15898888535
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若内容侵犯了原著者的合法权益,可联系站长删除。