Linux下rsync+inotify同步工具的安装和测试使用
![](https://images2018.cnblogs.com/blog/975823/201806/975823-20180622134607827-214519041.png)
添加之后启动系统 按照提示步骤一步步向下就可以
同样的方式再装一个系统 方便测试使用(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里让其开头自动启动