rsync+inotify实时同步

1
2
3
4
5
6
7
8
9
10
11
1、随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。

2、首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。

3、其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

4、基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。

5、inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。

6、在使用rsync首次全量同步后,结合inotify对源目录进行实时监控,只有有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效实用!

环境部署

1
2
(1)192.168.204.132服务器是源服务器,作为rsync的客户端,部署rsync+inotify。
(2)192.168.204.133是目标服务器,作为rsync的服务端。只需要安装配置rsync即可,不需要安装inotify。

Pqqma4.png

一、 在目标服务器192.168.204.133上部署rsync服务端

1、防火墙需要开启22和873端口,由于虚拟机环境我已经关闭防火墙,这里暂时不需要修改,真实环境需要开启
2、安装部署rsync服务端
1
2
3
4
5
6
mkdir -p /a01/apps/apps_src
cd /a01/apps/apps_src/
tar -zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/a01/apps/rsync --disable-ipv6
make && make install
3、创建rsync服务端配置文件
1
2
mkdir -p /etc/rsync
vim /etc/rsync/rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
log file = /var/log/rsync/rsyncd.log          #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pid file = /a01/apps/rsync/run/rsyncd.pid #pid文件的存放位置
lock file = /var/log/rsync/rsyncd.lock #支持max connections参数的锁文件
secrets file = /etc/rsync/rsyncd.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
motd file = /etc/rsync/rsyncd.motd #rsync启动时欢迎信息页面文件位置(自己创建这个文件,内容随便自定义)


[mysqldata] #自定义名称
path = /mysqldata #rsync服务端数据目录路径,即同步到目标目录后的存放路径,手动创建
comment = mysqldata #模块名称与[fangfull_upload]自定义名称相同
uid = nobody #设置rsync运行的uid权限。这个要保证同步到目标目录后的权限和源目录一致,即都是nobody!
gid = nobody #设置rsync运行的gid权限。
port=873 #默认的rsync端口
use chroot = yes
read only = yes #设置rsync服务端文件为只读权限
list = no #不显示rsync服务端资源列表
max connections = 200 #最大连接数
timeout = 600 #设置超时时间
auth users = backupuser #执行数据同步的用户名,需要后面手动设置。可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.204.132 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
#hosts deny = 192.168.1.194 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开(如果没有禁止,就不用设置这一行)
4、创建配置文件中自定义的路径目录
1
2
3
mkdir /mysqldata
mkdir -p /var/log/rsync
mkdir -p /a01/apps/rsync/run
5、创建用户认证文件
1
2
3
vim /etc/rsync/rsyncd.pass

backupuser:lianni@com
6、设置文件权限,即rsyncd.conf和rsync.pass认证文件都是600权限!
1
2
chmod 600 /etc/rsync/rsyncd.conf 
chmod 600 /etc/rsync/rsyncd.pass
7、创建欢迎信息页面
1
2
3
4
vim /etc/rsync/rsyncd.motd

-----------<!!!!!>0.0<!!!!>--------------
welcome to rsync
8、启动rsync
1
2
3
ln -s /a01/apps/rsync/bin/* /usr/local/bin/
rsync --daemon --config=/etc/rsync/rsyncd.conf
ps -ef | grep rsync

PqqMGR.png

1
netstat -anpt | grep rsync

PqqGqO.png

二、在源服务器192.168.204.132部署rsync客户端和inotify监控

1、安装rsync
1
2
3
4
5
6
mkdir -p /a01/apps/apps_src
cd /a01/apps/apps_src/
tar -zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/a01/apps/rsync -disable-ipv6
make && make install
2、创建密码文件
1
2
3
4
5
6
7
mkdir -p /etc/rsync
vim /etc/rsync/rsyncd.pass

lianni@com

chmod 600 /etc/rsync/rsyncd.pass
ln -s /a01/apps/rsync/bin/* /usr/local/bin/
3、安装inotify-tools
  • 查看服务器内核是否支持inotify,Linux内核从2.6.13版本开始提供了inotify通知接口
1
2
3
4
5
6
7
8
9
10
11
uname –r

2.6.32-431.el6.x86_64


ll /proc/sys/fs/inotify/

total 0
-rw-r--r-- 1 root root 0 Jun 5 10:11 max_queued_events
-rw-r--r-- 1 root root 0 Jun 5 10:11 max_user_instances
-rw-r--r-- 1 root root 0 Jun 5 10:11 max_user_watches
  • 出现以上内容说明内核支持inotify,下面开始安装inotify-tools
1
2
3
4
5
cd /a01/apps/apps_src/
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/a01/apps/inotify
make && make install
4、设置系统环境变量
1
2
echo "export PATH=$PATH:/a01/apps/inotify/bin" >>/etc/profile
source /etc/profile
5、添加库文件
1
2
3
4
5
vim /etc/ld.so.conf

/a01/apps/inotify/lib/

ldconfig
6、修改inotify默认参数(inotify默认内核参数值太小)
  • 查看系统默认参数值
1
2
3
4
5
6
7
8
cat /proc/sys/fs/inotify/max_queued_events
16384

cat /proc/sys/fs/inotify/max_user_instances
128

cat /proc/sys/fs/inotify/max_user_watches
8192
  • 修改参数
1
2
3
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
7、在源服务器上执行首次全量同步
  • 创建源目录
1
2
3
mkdir -p /a01/apps/mysql/data
cd /a01/apps/mysql/data/
touch {1..10}.txt
  • 开始执行rsync首次全量同步(加–delete参数,保持目标目录和源目录下文件绝对一致)
1
rsync -avH --port=873 --progress --delete /a01/apps/mysql/data/ backupuser@192.168.204.133::mysqldata --password-file=/etc/rsync/rsyncd.pass

PqqwRI.png

  • 上边报错了,我们去rsync服务端查看一下日志信息
1
cat /var/log/rsync/rsyncd.log

Pqq0zt.png

1
2
vim /etc/rsync/rsyncd.conf
read only = no
1
2
cat /a01/apps/rsync/run/rsyncd.pid
5497
1
2
kill -9 5497
rsync --daemon --config=/etc/rsync/rsyncd.conf

PqqDQP.png

  • 重启又报错了,我们去把pid文件删除再重启即可
1
2
rm -rf /a01/apps/rsync/run/rsyncd.pid 
rsync --daemon --config=/etc/rsync/rsyncd.conf
  • 现在配置改了,rsync服务端也重启了,我们去rsync客户端继续第一次全量同步
1
rsync -avH --port=873 --progress --delete /a01/apps/mysql/data/ backupuser@192.168.204.133::mysqldata --password-file=/etc/rsync/rsyncd.pass

Pqqrsf.png

  • 又报错了,我们再去rsync服务端查看一下日志也是报rsync: failed to set times on “/.” (in mysqldata): Operation not permitted (1)这个错误,应该是配置文件中的属主属组设置问题,我们查看一下/mysqldata/的属主跟属组
1
ls -al /mysqldata/

Pqq6eS.png

  • 可以看出,属组和属主都是root,我们去修改一下配置文件
1
vim /etc/rsync/rsyncd.conf

Pqqcdg.png

  • 重新启动rsync
1
2
3
4
5
6
cat /a01/apps/rsync/run/rsyncd.pid 
5780

kill -9 5780
rm -rf /a01/apps/rsync/run/rsyncd.pid
rsync --daemon --config=/etc/rsync/rsyncd.conf
  • 再去rsync客户端全量同步
1
rsync -avH --port=873 --progress --delete /a01/apps/mysql/data/ backupuser@192.168.204.133::mysqldata --password-file=/etc/rsync/rsyncd.pass

PqqgoQ.png

  • 这次没有报错,成功了,我们去rsync服务端查看是否已经同步
1
ls /mysqldata/

PqqoLT.png

注意:在以上的属组属主问题中,不修改配置文件,修改该目标目录的属组属主也可以解决该问题

三、当第一次全量同步完成之后,开始rsync+inotify实时同步

  • 实时同步脚本里添加的是–delete-before参数,而不是–delete参数(第一次全量同步时rsync用的参数),二者区别:
1
2
3
--delete参数:表示rsync同步前,暴力删除目标目录中的所有文件,然后再执行同步操作。

--delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录的多余文件,然后再执行同步操作。显然比--delete参数安全些。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim inotify.sh

#!/bin/bash
SRCDIR=/a01/apps/mysql/data/
USER=backupuser
IP=192.168.204.133
DESTDIR=mysqldata
/a01/apps/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/a01/apps/rsync/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync/rsyncd.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done

chmod +x inotify.sh
sh inotify.sh
  • 执行脚本之后我们再打开一个终端创建一些文件或者目录,看看测试结果
1
2
3
4
5
6
7
8
9
10
11
12
cd /a01/apps/mysql/data/
mkdir test
```

![PqLSOK.png](https://s1.ax1x.com/2018/08/27/PqLSOK.png)

>* 成功了,我们去目标服务器查看是否有同步过来即可。

>* 最后,我们把脚本放在后台运行即可,否则会占用一个终端

```bash
nohup sh inotify.sh &

四、设置rsync客户端和服务端开机自启

1)客户端开机自启
1
2
3
vim /etc/rc.local

nohup /root/inotify.sh &
2)服务端开机自启
1
vim /etc/init.d/rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
#chkconfig: 35 99 20
#description: rsyncdserver
RSYNC="/a01/apps/rsync/bin/rsync --daemon --config=/etc/rsync/rsyncd.conf"
PID="/a01/apps/rsync/run/rsyncd.pid"
case "$1" in
start)
$RSYNC
echo "服务已经开启"
;;
stop)
killall -s QUIT rsync
rm -rf $PID
echo "服务已经关闭"
;;
restart)
$0 stop
$0 start
;;
esac

1
2
3
chmod +x /etc/init.d/rsync
chkconfig --add rsync
chkconfig rsync on
博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%