rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。
inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户得知。
首先,如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。
基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。
安装:
服务端:rsync
客户端:rsync,inotify
服务端:
配置rsync:
vim /etc/rsyncd.conf
log file=/var/log/rsuncd.log //指定日志文件名称,rsync启动后会自动创建该文件
pid file=/var/run/rsyncd.pid //pid的文件位置
lock file=/var/run/rysnc.lock //支持max connections参数的锁文件
secrets file=/etc/rsync.pass //用户认证文件,保存用户名及密码
motd file=/etc/rsyncd.motd //rsync启动时保存欢迎信息的文件
[app] //同步目录名称描述,建议与同步目录同名
path=/app //数据目录位置
comment=/app
uid=root //设置rsync运行权限为root
gid=root //设置rsync运行权限为root
port=873 //默认端口号
use chroot=no //默认为true,表示不同步软连接文件,改为no表示同步软连接
read only=no //设置rsync服务端为读写文件
list=no //不显示rsync服务端的资源列表
max connections=200 //最大连接数
timeout=600 //超时时间
auth users=root //执行数据同步的用户名,多个用逗号隔开
hosts allow=192.168.121.客户端ip //允许进行同步的IP地址,多个IP用都好隔开
创建用户认证文件:
vim /etc/rsync.pass
root:123456
格式: username:password 一行一个用户信息
权限设置
分别将配置文件和用户认证文件权限修改为600
chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass
启动服务
systemctl start rsyncd
netstat -antp|grep :873
服务端rsync部署成功
客户端: 安装rsync
创建用户认证文件
vim /etc/rsync.pass //该文件只保存目标服务器上的认证密码
123456
chmod 600 /etc/rysnc.pass
验证数据同步
客户端/root/app目录下创建文件
touch {a,b,c}.file
ls /app/
a.file b.file c.file
通过运行rsync命令,将客户端/app下的文件同步到服务端的/app下
rsync -avH --port=873 --progress --delete /app/ root@192.168.121.服务端ip::app --password-file=/etc/rsync.pass
命令说明:
-a:递归传输文件,并保留文件所有属性
-v: 显示详细过程
-H: 保留硬链接
–progress:显示备份过程
–delete:同步时,会删除目的服务器中目录中源服务器中没有的文件
/app/: 源数据目录,最后一个/表示同步时只同步子文件及目录; 如果不加/,表示整个/testdir目录都会同步的目标服务器
root@10.1.1.2::app: root同步用户, 目标服务器中的目录只需要写目录名称即可
–password-file=/etc/rsync.pass: 指定密码文件
在服务端/app下看文件是否创建成功,文件同步则成功
安装inotify
客户端上安装inotify,实时监测源目录的变化实现实时同步
通过源码编译来安装inotify
yum install –y gcc*
tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
./configure --prefix=/usr/local/inotify
make && make install
配置inotify,修改环境变量PATH
vim /etc/profile
export PATH=$PATH:/usr/local/inotify/bin
source /etc/profile //刷新环境变量
导出inotify库文件
echo “/usr/local/inotify/lib” > /etc/ld.so.conf.d/inotify.conf
ldconfig //刷新
导出inotify头文件
ln -s /usr/local/inotify/include/ /usr/include/inotify
改inotify内核参数(默认inotify参数太小)
vim /etc/sysctl.conf
fs.inotify.max_queued_events=9999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
sysctl –p //使参数生效
编写脚本
创建脚本,根据inotify的监测事件,触发rsync同步
vim rsync.sh
#!/bin/bash
srcdir=/root/app/
dstdir=app
excludedir=/usr/local/inotify/exclude.list
rsyncuser=root
rsyncpassdir=/etc/rsync.pass
dstip=10.5.96.13
/usr/local/inotify/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M’ --format ‘%T %w%f’ -e modify,delete,create,attrib $src
dir | while read filedo
/usr/bin/rsync -vzrtopg --delete --progress $srcdir
r
s
y
n
c
u
s
e
r
@
rsyncuser@
rsyncuser@dstip::
d
s
t
d
i
r
−
−
p
a
s
s
w
o
r
d
−
f
i
l
e
=
dstdir --password-file=
dstdir−−password−file=rsyncpassdir
echo “${file} was rsynced” >> /var/log/rsync.log 2>&1
chmod a+x rsync.sh //给脚本添加执行权限
自动实时同步
通过设置脚本开机自动运行,或者通过计划任务自动运行该脚本,即可实现自动实时同步
计划任务方式:
crontab -e
-
-
-
-
- /root/rsync.sh &> /dev/null
-
-
-
设置脚本开机自启
vim /etc/rc.d/rc.local
/root/rsync.sh &> /dev/null
============================================
rsync+crontab 计划任务文件同步
服务端:
1 yum -y install rsync
2 mkdir /root/abc
cd /root/abc
touch aaa
3 vim /etc/rsyncd.conf
uid = nobody //设置rsync运行权限
gid = nobody //设置rsync运行权限
use chroot = yes
address = 192.168.172.131
port 873 //默认端口号
log file = /var/log/rsyncd.log //指定日志文件名称,rsync启动后会自动创建该文件
pid file = /var/run/rsyncd.pid //pid的文件位置
hosts allow = 192.168.172.0/24 //允许进行同步的IP地址,多个IP用都好隔开
[wwwroot] //同步目录名称描述,建议与同步目录同名
path = /root/abc //数据目录位置
comment = Document Root of www.51xit.top
read only =no
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar .z
auth users =backuper //执行数据同步的用户名,多个用逗号隔开
secrets file = /etc/rsyncd_users.db //用户认证文件,保存用户名及密码
4 cat /etc/rsyncd_users.db
backuper:pwd123
chmod 600 /etc/rsyncd_users.db
systemctl stop firewalld
5 rsync --daemon
netstat -anpt |grep rsync
tcp 0 0 192.168.172.131:873 0.0.0.0: LISTEN 12173/rsync
客户端
yum -y install rsync
systemctl stop firewalld
mkdir /root/abc
chmod 777 /root/abc
vi /etc/server.pass
pwd123
chmod 600 /etc/server.pass
rsync -az --password-file=/etc/server.pass backuper@192.168.172.131::wwwroot /root/abc
cd abc/
ll
crontab -e