一、相关简介
1、rsync(remote synchronize)
rsync是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。
Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp ,scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。
但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。
2、inotify
inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux 内核从2.6.13版本起,加入了对 inotify 的支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,inotify-tools 便可以监控文件系统下文件的各种变化情况了。
二、前期准备
1、关闭selinux、防火墙(或防火墙开端口)
[root@localhost ~]# setenforce 0
[root@localhost ~]# vi /etc/sysconfig/selinux
2、检查内核是否支持inotify
[root@localhost ~]# ll /proc/sys/fs/inotify
若出现以下三个文件表示系统默认支持inotify
3、整体架构示意图
三、同步节点部署(rsync)
注:一般系统都是会预安装rsync服务,如果没安装,可直接使用yum install -y rsync
1、编写配置文件
[root@localhost ~]# vi /etc/rsyncd.conf
添加以下内容:
uid = nobody
gid = nobody
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup] #共享模块名称,可自定义
path = /usr/local/ #将数据同步到指定目录下
comment = this is rsync for nginx #共享模块备注,根据需求自定义
ignore errrors
read only=no
write only=no
hosts allow=192.168.7.98 #源服务器节点IP
hosts deny=*
list=false
uid=root
gid=root
auth users=ffs #服务器之间相互认证的用户名,可自定义,但是需与源服务器保持一致
secrets file=/etc/rsync.password #服务器之间用于认证的密码文件
[root@localhost ~]# vi /etc/rsync.password
ffs:123456
[root@localhost ~]# chmod 600 /etc/rsync.password
注:密码文件的权限必须设置为600,否则会认证失败
2、启动服务
[root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf
注:
(1)可添加系统自启动文件
[root@localhost ~]# echo “/usr/bin/rsync --daemon” >> /etc/rc.local
[root@localhost ~]# chmod 755 /etc/rc.local
(2)若开启了防火墙,则需开放对应端口
[root@localhost ~]# firewall-cmd --add-port=873/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
3、查看rsync服务是否有启动
四、源服务器节点部署(rsync+inotify)
1、配置rsync配置文件
[root@localhost ~]# vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup] #共享模块名称,可自定义
path = /usr/local/ #路径只写到需要同步的文件夹上一级,脚本会自动将整个目录同步过去
comment = this is rsync for nginx #共享模块备注,根据需求自定义
ignore errrors
read only=no
write only=no
hosts allow=192.168.7.97 #同步节点IP
hosts deny=*
list=false
uid=root
gid=root
auth users=ffs #用户名与源服务器一样
secrets file=/etc/rsync.password #密码与源服务器一样,此文件只需要写密码,不需要用户名
[root@localhost ~]# vi /etc/rsync.password
123456
[root@localhost ~]# chmod 600 /etc/rsync.password
2、启动服务
[root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf
注:
(1)可添加系统自启动文件
[root@localhost ~]# echo “/usr/bin/rsync --daemon” >> /etc/rc.local
[root@localhost ~]# chmod 755 /etc/rc.local
(2)若开启了防火墙,则需开放对应端口
[root@localhost ~]# firewall-cmd --add-port=873/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
3、安装inotify
[root@localhost ~]# yum install -y inotify-tools
注:inotify依赖于epel源,若没有该yum源,则需进行yum -y install epel-relese操作
五、在源服务器上创建用于rsync同步的shell脚本
[root@localhost work]# cat inotify.sh
#!/bin/bash
host1=192.168.7.97 #同步节点IP
src=/usr/local/ffmpeg_flie/ #源服务器需要同步到同步节点的数据目录
dst1=backup #rsync配置文件中定义的共享模块名称
user1=ffs #rsync配置文件中定义的用户名
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src | while read files
do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1
echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
done
[root@localhost work]# chmod 755 inotify.sh
在后台运行该脚本
[root@localhost work]# nohup inotify.sh &
注:有需要可将其加入系统自启动文件中
[root@localhost work]# echo “/root/work/inotify.sh &” >> /etc/rc.local
以上步骤完成后,则可测试实时备份是否成功,在192.168.7.98的/usr/local/ffmpeg_flie/目录下创建test.txt文件,随后在192.168.7.87的/usr/local/ffmpeg_flie/目录下查看是否有同步过来(删除文件同理)。