Linux下rsync+inotify同步工具的安装和测试使用

工具:macbookpro
环境:VirtualBox虚拟机装了两个CentOs7 (源文件下载 https://pan.baidu.com/s/1hvhTSWV0WG5iBcO16PoxSw)
(注意事项:装系统的时候需要先下载后缀iso的镜像https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/ 在系统右键设置的存储中添加)

 

添加之后启动系统 按照提示步骤一步步向下就可以

同样的方式再装一个系统 方便测试使用(PS:本来以为一个装好 用virtualBox的导入导出功能复制一个就行了 但是这里会出现一个问题就是复制的虚拟电脑ip是相同的 尝试过设置成静态ip但是没效果 所以这里建议新建 网络连接用桥接自动分配ip的方式)

这里我配的两个服务器分别为 A : 10.0.0.132(centos) B : 10.0.0.199(centos-2)

rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件, 通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器。但是rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输,当文件较多时比较耗时。rsync不能实时的去监测、同步数据,虽然它可以通过crontab方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致。所以下面我来试一下通过rsync+inotify的组合来实时同步

1、安装rsync

直接yum安装:yum -y install rsync

报错:

貌似centos7用yum的时候就会报这个错,解决方式

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

修改 ONBOOT=yes

重启网络:service network restart

这时候再运行yum安装就可以了😁

然后就是rsync的配置问题了 这里为了除掉同步时候的密码问题 可以采用添加认证密钥的方式先让两台服务器可以无密码互相访问

ssh-keygen -b 2048 -t rsa (这里的-b 2048 是密钥加密的长度)

回车三次 key文件会保存在/root/.ssh目录下

id_rsa.pub  公钥文件,这个文件里的内容复制到B服务器的/root/.ssh/authorized_keys中 (B服务器同理)

修改sshd 的主配置文件,关闭密码认证登陆,使用key登陆。

vim /etc/ssh/sshd_config

修改 PasswordAuthentication no

service sshd restart

配置文件 /etc/rsyncd.conf ,内容如下:
#port=873        #监听端口默认为873,也可以是别的端口
log file=/var/log/rsync.log  #指定日志
pid file=/var/run/rsyncd.pid  #指定pid
#address=192.168.0.10  #可以定义绑定的ip
以上部分为全局配置部分,以下为模块内的设置
[abc]    #为模块名,自定义
path=/tmp/123   # 指定该模块对应在哪个目录下
use chroot=true #是否限定在该目录下,默认为true,当有软连接时,需要改为fasle,如果为true就限定为模块默认目录
max connections=4  # 指定最大可以连接的客户端数
read only=no #是否为只读,如果是no的话,客服端推送给服务端的时候不成功,这时候要改成yes
list=true #是否可以列出模块名    rsync --port 8730   172.16.37.139::  如果为yes的话会列出客户端所有的模块名字。  
uid=root #以哪个用户的身份来传输   
gid=root  #以哪个组的身份来传输
auth users=test #指定验证用户名,可以不设置,不设置默认不用密码,设置的话安全性更高点
secrets file=/etc/rsyncd.passwd #指定密码文件,如果设定验证用户,这一项必须设置,设定密码权限为400.
hosts allow=192.168.0.101 #设置可以允许访问的主机,可以是网段,多个Ip地址用空格隔开
密码文件/etc/rsyncd.passwd的内容格式为:username:password 
启动服务的命令是:rsync --daemon 
默认去使用/etc/rsyncd.conf这个配置文件,也可以指定配置文件 rsync --daemon --config=/etc/rsyncd2.conf,更改配置文件不用重启服务,即时生效。

rsync -avPz  --port 873 123/   root@10.0.0.132::/abc 

(建议关闭防火墙selinux,可能会由于强访问控制导致同步报错)

服务端不需要同步给客户端的文件,加上--exclude=filename

2、inotify(事件监控机制)

执行

ll /proc/sys/fs/inotify/

有三个max_开头的文件表示系统支持

inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口库函数,它提供两种工具,一是inotifywait,用来监控文件或目录的变化,二是inotifywatch,用来统计文件系统访问的次数。

安装

yum install -y epel-release && yum update
yum install inotify-tools

 

3、rsync联合inotify-tools完成实时同步

核心是在客户端创建一个脚本rsync.sh,用inotifywait监控本地目录的变化,触发rsync将变化的文件传输到远程备份服务器上。存在不需要同步的目录需要排除的情况

排除不需要同步的文件或目录有两种做法,第一种是inotify监控整个目录,在rsync中加入排除选项;第二种是inotify排除部分不监控的目录,同时rsync中也要加入排除选项,可以减少不必要的网络带宽和CPU消耗。我们选择第二种。

inotifywait排除监控目录有--exclude <pattern>--fromfile <file>两种格式

rsync排除可以将将要排除同步的目录卸载单独的文件列表里,便于管理

使用--include-from=FILE时,排除文件列表用绝对路径,但FILE里面的内容请用相对路径,如:
/etc/rsyncd.d/rsync_exclude.lst

cache/2014/
src/*.html*
src/2014/20140[1-9]/

下面尝试写一个sh

vim /tmp/zyy/1.sh

#!/bin/sh
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read events do rsync -a --delete /test/ 10.0.0.199:/test1/ echo "`date +'%F %T'`$events" >> /var/log/rsync.log 2>&1 done

PS:rsync加入--delete选项可以同步删除

在客户端运行脚本# ./1.sh即可实时同步目录 可以用 & 在程序结尾来让程序自动运行

这里存在注销之后就是自动停止的问题 所以可以使用nohup 命令 不挂断的运行

nohup sh /tmp/zyy/1.sh  &

设置脚本开机自启动

vim /etc/rc.local        --加到rc.local里让其开头自动启动
posted @ 2018-06-22 13:40  拥抱变化的Y姑娘  阅读(961)  评论(0编辑  收藏  举报