共享文件的实时同步

数据的实时同步

数据实时同步

  • 实现实时同步

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

    • inotify+rsync 方式实现数据同步
    • sersync :在inotify软件基础上进行开发的,功能更加强大
  • inotify:
    异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件

  • 实现inotify软件:
    inotify-tools,sersync,lrsyncd

inotify和rsync实现实时同步

  • inotify+rsync使用方式
    • inotify 对同步数据目录信息的监控
    • rsync 完成对数据的同步
    • 利用脚本进行结合

inotify

  • 查看服务器内核是否支持inotify

    • Linux支持inotify的内核最小版本为2.6.13
    • ls -l /proc/sys/fs/inotify #列出下面的文件,说明服务器内核支持inotify
      -rw-r–r-- 1 root root 0 Dec 7 10:10 max_queued_events
      -rw-r–r-- 1 root root 0 Dec 7 10:10 max_user_instances
      -rw-r–r-- 1 root root 0 Dec 6 05:54 max_user_watches
  • inotify内核参数

    • 参数说明:参看man 7 inotify
      • max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384
      • max_user_watches:可以监视的文件数量(单进程),默认值:8192
      • max_user_instances:每个用户创建inotify实例最大值,默认值:128
  • inotify参考文档

    • https://github.com/rvoicilas/inotify-tools/wiki
  • 安装:基于epel源

    • yum install inotify-tools
  • inotify-tools包主要文件:

    • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
    • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令常见选项

  • -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
    指定监听指定的事件,如果省略,表示所有事件都进行监听

【2.–timefmt <fmt>时间格式】

  • %Y 年份信息,包含世纪信息
  • %y 年份信息,不包括世纪信息
  • %m 显示月份,范围 01-12
  • %d 每月的第几天,范围是 01-31
  • %H 小时信息,使用 24小时制,范围 00-23
  • %M 分钟,范围 00-59
示例:
    --timefmt "%Y-%m-%d %H:%M"

【3.–format <fmt> 格式定义】

  • %T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
  • %w 事件出现时,监控文件或目录的名称信息
  • %f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
  • %e 显示发生的事件信息,不同的事件默认用逗号分隔
  • %Xe显示发生的事件信息,不同的事件指定用X进行分隔
示例:
    --format "%T %w%f event: %;e"
    --format '%T %w %f'

【4. -e 选项指定的事件类型】

  • create 文件或目录创建
  • delete 文件或目录被删除
  • modify 文件或目录内容被写入
  • attrib 文件或目录属性改变
  • close_write 文件或目录关闭,在写入模式打开之后关闭的
  • close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
  • close 文件或目录关闭,不管读或是写模式
  • open 文件或目录被打开
  • moved_to 文件或目录被移动到监控的目录中
  • moved_from 文件或目录从监控的目录中被移动
  • move 文件或目录不管移动到或是移出监控目录都触发事件
  • access 文件或目录内容被读取
  • delete_self 文件或目录被删除,目录本身被删除
  • unmount 取消挂载
示例: -e create,delete,moved_to,close_write, attrib

【5.inotify示例】

监控一次性事件
inotifywait /data


持续监控
inotifywait -mrq /data


持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e" 


持续后台监控特定事件
inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib

实验部分

使用rsync实现数据同步

  • hostA centos7 192.168.38.17
  • hostB centos8 192.168.38.8
  • 将centos8的/data目录下的所有文件同步至centos7的/data/backup目录
    • 因为centos8上执行rsync -av 192.168.38.17:/data/* /data/backup莫名报错
1.在centos7上实现基于key验证
[root@centos7-17 ~]# ssh-keygen
[root@centos7-17 ~]# ssh-copy-id 192.168.38.8


2.[root@centos7-17 ~]# rsync -a 192.168.38.8:/data/* /data/backup


3.可以结合计划任务,每10分钟执行一次数据同步,但是这样将导致可能丢失10分钟的数据


4.解决办法:数据实时同步,监控目录数据变化,文件发生更改,就立即实现数据同步。
    ==>inotify 可实现实时监控某个目录下的文件变化,然后结合rsync同步,可实现数据实时同步。

确定内核支持inotify功能

  • 确定内核具有的功能
  • 调整内核参数的方法
1.inotify属于内核级的功能,查看内核支持的功能:
[root@centos7-17 ~]# grep -i inotify /boot/config-3.10.0-957.el7.x86_64 
    CONFIG_INOTIFY_USER=y

2.属于编译内核时需要添加的内核功能。上述也介绍从kernel 2.6.13开始支持inotify功能,centos6也支持inotify


3.centos6的内核版本
[root@centos6 ~]#uname -r
2.6.32-754.el6.x86_64


4.支持inotify之后,在/proc/sys/fs/inotify 中有三个与inotify相关的文件
[root@centos7-17 ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_queued_events 
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_user_instances
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_user_watches
[root@centos7-17 ~]# cat /proc/sys/fs/inotify/*
16384
128
8192


5.修改inotify的内核参数 
    /proc/目录的参数的配置文件均可以在/etc/sysctl.conf下设置

临时配置:
[root@centos7-17 ~]#  echo 256 > /proc/sys/fs/inotify/max_user_instances

写入配置文件:
[root@centos7-17 ~]# vim /etc/sysctl.conf 
fs.inotify.max_user_instances = 512

生效:
[root@centos7-17 ~]# sysctl -p
fs.inotify.max_user_instances = 512

查看内核参数:
[root@centos7-17 ~]# sysctl -a

安装inotify

1.启用epel:
[root@centos7-17 ~]# epel
    epel定义的别名:alias epel='sed -ir '\''s/^enabled=0/enabled=1/'\'' /etc/yum.repos.d/base.repo'


2.安装inotify-tools
[root@centos7-17 ~]# yum install inotify-tools


3.[root@centos7-17 ~]#  rpm -ql inotify-tools
/usr/bin/inotifywait     就是使用这个工具监控目录下文件变化,inotifywait在被监控文件或目录上等待特定文件系统事件发生
/usr/bin/inotifywatch    inotifywatch:收集被监控的文件系统使用的统计数据


4.不过上述好像结合后面实时同步的规划应该在centos8上安装inotify-tools
[root@centos8-8 ~]# dnf install inotify-tools


5.简单测试inotifywait的使用
[root@centos8-8 ~]# inotifywait  /data/www/
Setting up watches.
Watches established.
/data/www/ CREATE f4.txt
[root@centos8-8 ~]# 

inotifywait的使用

  • 在上述inotifywait的选项中有详细介绍
[root@centos8-8 www]# inotifywait -mrq --format "%T %w%f  Event;%;e"  --timefmt "%Y-%m-%d %H:%M"  /data/www/
    2019-10-18 11:10 /data/www/f2.txt  Event;OPEN
    2019-10-18 11:10 /data/www/f2.txt  Event;MODIFY
    2019-10-18 11:10 /data/www/f2.txt  Event;CLOSE_WRITE;CLOSE
[root@localhost www]# echo >> f2.txt  当对f2.txt文件追时,出现上述输出
  • 使用inotifywait可以实现对特定目录的文件进行状态监控。

rsync服务

  • 以rsync命令的方式同步数据需要实现key验证

  • 但是rsync还可以以服务的方式实现。

    • rsync以独立服务的方式运行可以实现网络监控的作用,即rsync client端可以直接使用网络资源将数据发送至rsync server端
  • 此处实现是测试rsync以服务的方式进行文件同步

    • 规划:
      centos7 192.168.38.17 rsync server
      centos6 192.168.38.16 rsync client

    • :文件同步的方向:server端同步client端数据,即客户端发送数据给server端。

1.rsync包:
[root@centos7-17 ~]# rpm -qf `which rsync`
rsync-3.1.2-4.el7.x86_64
[root@centos7-17 ~]# rpm -ql rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/bin/rsync
/usr/lib/systemd/system/rsyncd.service  提供rsync服务


2.启动rsync服务
[root@centos7-17 ~]# systemctl status rsyncd 默认未启动
[root@centos7-17 ~]# systemctl start rsyncd


3.查看监听端口: TCP 873
[root@centos7-17 ~]# ss -tnlu
    ==> rsync监听tcp的873端口


4.配置 rsync 服务器端的配置文件
[root@centos7-17 ~]# vim /etc/rsyncd.conf
    uid = root                          定义rsync以root身份
    gid = root
    use chroot = no                     不允许根切换
    max connections = 0                 最大连接数0,0表示不限制
    ignore errors                       忽略错误
    exclude = lost+found/               针对lost+found/不检查
    log file = /var/log/rsyncd.log      记录日志
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    reverse lookup = no                 对ip进行反向解析,no表示不解析
    hosts allow = 192.168.38.8/24       允许的客户端访问列表
    [backup]                            [backup]模块名,表示下面的模块属于[backup]模块
    path = /data/backup/ 
    comment = backup 
    read only = no
    auth users = rsyncuser              不需要ssh服务,使用rsync提供的用户
    secrets file = /etc/rsync.pass      密码建议存放至另一个文件,保证安全

5.服务器端生成验证文件
[root@centos7-17 ~]# echo "rsyncuser:centos" >/etc/rsync.pass
[root@centos7-17 ~]# chmod 600 /etc/rsync.pass


6.重启服务
[root@centos7-17 ~]# systemctl restart rsyncd
    
centos6启动rsync服务
    [root@centos6 ~]#rpm -ql rsync
    /etc/xinetd.d/rsync   centos6的rsync是非独立服务    
    非独立服务的启动:
    [root@centos6 ~]#yum install xinetd  先要保证xinetd服务的存在
    [root@centos6 ~]#chkconfig rsync on
    [root@centos6 ~]#service xinetd start


7.客户端配置密码文件
[root@centos6 ~]#echo centos>/etc/rsync.pass
[root@centos6 ~]#chmod 600 /etc/rsync.pass


7.客户端测试同步数据
~]# rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服务器IP::backup
    利用此命令将 rsync client端的/data/目录的数据同步到rsync server端backup模块指定的路径中

[root@centos6 data]#rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.38.17::backup
    注:rsync命令的源目录即数据目录/data
    加不加/data/最后的斜线是由区别的。

注意:

  • rsync -a 192.168.38.8:/data/ /data/backup

    • 加了目录末尾的斜线,只拷贝目录下的文件 等价于:/data/*
  • rsync -a 192.168.38.8:/data /data/backup

    • 不加末尾的斜线,同步时会将/data目录一起同步

实时同步

  • hostA centos7 192.168.38.17
  • hostB centos8 192.168.38.8
  • 将centos8的/data/www/目录下的所有文件同步至centos7的/backup/www/目录
  • 只有centos8的/data/www/目录下的文件发生定义的变化,centos7自动同步
    文件发生变化:文件内容变化、文件的创建删除、文件属性变化等等
centos7上部署:
    rsync的服务器端,部署rsync服务即可


1.更改配置文件
[root@centos7-17 ~]# vim /etc/rsyncd.conf
	uid = root
    gid = root
    use chroot = no
    max connections = 0
    ignore errors
    exclude = lost+found/
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    reverse lookup = no
    hosts allow = 192.168.38.0/24
    [backup]
    path = /backup/www/ 
    comment = backup 
    read only = no
    auth users = rsyncuser
    secrets file = /etc/rsync.pass 


2.创建文件传输时使用的rsyncuser用户
[root@centos7-17 ~]# cat  /etc/rsync.pass 
rsyncuser:centos
[root@centos7-17 ~]# chmod 600 /etc/rsync.pass 基于安全将目录权限设为600
    
    
3.创建同步目录
[root@centos7-17 ~]# mkdir /backup/www/ -pv
    mkdir: created directory ‘/backup’
    mkdir: created directory ‘/backup/www/’    

centos8上部署:inotify-tools工具和作为rsync的客户端
    即使用inotifywait监控需要监控的目录(生产中可能是基于文件共享的目录),有定义的文件变化,就触发数据同步


脚本准备阶段:
1.安装inotify-tools
[root@centos8-8 ~]# dnf install inotify-tools

2.生成rsyncuser用户使用的密码文件
[root@centos8-8 data]# echo centos > /etc/rsync.pass 
[root@centos8-8 data]# chmod 600 /etc/rsync.pass


3.使用脚本实现
[root@centos8-8 data]# vim inotify_rsync.sh
#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@192.168.38.17::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --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.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done


4.将脚本放置于后台并且与终端无关
[root@centos8-8 ~]# ( bash inotify_rsync.sh & )
[root@centos8-8 ~]# nohup /data/inotify_rsync.sh &>/dev/null &
    还可以利用screen实现...

inotify+rsync实现文件同步总结:

  • 1)rsync的同步机制是基于文件级别,即如果一个大文件中只是增加了一个字符,rsync会将整个文件重新拷贝一次。

    • rsync只能知道文件发生了变化,但是不能具体文件内容哪部分变化。
  • 2)基于脚本实现,在同步速率上,对于比较大的文件,同步时间可能较长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值