一、什么是rsync
rsync (remote sync)是一款非常好的数据同步工具,能够通过对比同步双方的数据变动,实现增量同步,还可以通过LAN/WAN实现远程多台主机间文件的同步,还能结合crond任务计划来执行自动备份,又可以结合ssh实现远程数据备份的安全,种种特性使他看起来相当优秀。但如果需备份数据十分庞大时,它的不足之处就显现出来了,比如每次执行同步操作时,rsync都会扫描全部数据进而计算出增量部分,而后再同步增量数据,这将会十分耗时,使其变得低效;并且受限于crond计划任务最小时间间隔为一分钟,会导致同步源端和目的段数据不一致,这在高可用环境中是不被允许的。这个时候我们就可以构建rsync+Inotify架构来解决此应用瓶颈。
二、inotify简介
inotify是内核的一个功能,众所周知内核的功能我们必须要配合工具才能使用,通常情况下用户要使用内核的功能,都需要用户空间的软件去调用才可以达到使用内核的功能的目的,用户是无法直接操内核的。实现inotify软件有inotify-tools、sersync、lrsyncd。我们这里以inotify-tools这个软件包为例进行实验;inotify-tools包主要有两个文件,一个是inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控;一个是inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。通常情况下我们使用iontifywait就可以了。接下来我们来安装inotify-tools
三、环境两台服务器
源服务器:192.168.15.2
目标服务器:192.168.15.4
四、需求
把源服务器上附件实时同步备份至目标服务器
五、目标服务器环境配置
1.安装rsync软件
第一种安装方式:
yum -y install rsync
?第二种安装方式:
cd /home/software
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
tar -zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/usr/local/rsync
make
make install
2.rsync配置rsyncd.conf文件
vim /etc/rsyncd.conf //增加以下内容
log file = /var/log/rsyncd.log //日志文件位置,启动rsync后自动产生,无需提前创建
pidfile = /var/run/rsyncd.pid //pid文件存放位置
lock file = /var/run/rsync.lock //支持max connections参数的锁文件
secrets file = /etc/rsync.password//用户认证配置文件,里面存放用户名称和密码,必须手动创建这个文件
[backup] //自定义同步名称
path = /data/backup/ //rsync服务端存放路径,客户端的数据将同步到此目录
comment = sync etc from client
uid = root //设置rsync运行权限为root
gid = root //设置rsync运行权限为root
port = 873 //默认端口为873
ignore errors //表示出现错误忽视错误
use chroot = no //默认为true ,修改为no,增加对目录软链接的备份
read only = no //设置rsync服务端为读写权限
list = no //不显示rsync服务端资源列表
max connections = 200 //最大连接数
timeout = 600 //设置超时时间
auth users = admin //执行数据同步的用户名,可以设置多个,用英文逗号隔开
hosts allow = 192.168.15.2 //允许进行数据同步的IP地址,可以设置多个,用英文逗号隔开
hosts deny = 192.168.24.188 禁止进行数据同步的IP地址,可以设置多个,用英文逗号隔开
3.创建备份目录
mkdir /data/backup
4.创建同步使用账号密码
echo 'root:518' > etc/rsync.password
cat etc/rsync.password
root:518
5.设置文件权限
chmod 600 /etc/rsync*
ll /etc/rsync*
-rw-------. 1 root root 880 Aug 13 14:54 /etc/rsyncd.conf
-rw-------. 1 root root 10 Aug 13 14:55 /etc/rsync.password
6.启动rsync服务并设置开机自启动
systemctl start rsyncd
systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
以上操作完毕之后,目标服务器已经配置完毕
六、源服务器环境配置
1.关闭防火墙与SELINUX
systemctl stop firewalld
systemctl disable firewalld
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux
setenforce 0
2.安装rsync服务端软件,只需要安装,不要启动,不需要配置(同目标服务器安装方式)
3.创建账户
echo '518' > /etc/rsync.pass
cat /etc/rsync.pass
518
4.设置文件权限
chmod 600 /etc/rsync.pass
ll /etc/rsync.pass
-rw-------. 1 root root 0 Aug 13 15:46 /etc/rsync.pass
5.测试
mkdir data/attachment
rsync -avH --port 873 --progress --delete /root/etc/ root@192.168.15.4::backup --password-file=/etc/rsync.pass
sending incremental file list
./
test/
sent 69 bytes received 22 bytes 182.00 bytes/sec
total size is 0 speedup is 0.00
出现以上情况表示两台服务器人rsync环境已经搭建成功
七、源服务器安装inotify-tools工具,实时触发rsync同步
? 1.检查服务器内核是否支持inotify
//检查服务器内核是否支持inotify
ll /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 Aug 13 16:13 max_queued_events
-rw-r--r--. 1 root root 0 Aug 13 16:13 max_user_instances
-rw-r--r--. 1 root root 0 Aug 13 16:13 max_user_watches
//如果有这三个max开头的文件则表示服务器内核支持inotify
//安装inotify-tools
yum -y install make gcc gcc-c++ inotify-tools
2.写实时同步脚本
#!/bin/bash
host=192.168.15.4 //目标服务器的ip(备份服务器)
src=/data/attachment //在源服务器上所要监控的备份目标
des=backup //自定义的模块名,需要与目标服务器上的定义名称同步
password=/etc/rsync.password //执行数据同步的密码文件
user=root //执行数据同步的名
inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/data/log/rsync/rsync.log 2>&1
done
3.检查脚本是否存在问题
bash -x /sh/rsync.sh
4.启动脚本
nohup bash /jysoft/sh/rsync.sh &
ps -ef|grep inotify
5.测试,再源服务器上新建目录之后,查看目标服务器是否存在,如果存在表示成功
6.设置开机自启
chmod +x /etc/rc.d/rc.local
ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 Apr 11 15:36 /etc/rc.d/rc.local
echo 'nohup /bin/bash /jysoft/sh/rsync.sh' >> /etc/rc.d/rc.local
tail /etc/rc.d/rc.local
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
nohup /bin/bash /jysoft/sh/rsync.sh
|