转自:https://blog.51cto.com/12244079/2336264?source=dra
一、文档目的
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。
首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。
基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步
二、环境准备
2.1 操作系统
两台虚拟机,系统均为centos7
源服务器:10.5.96.41 作为rsync的客户端,部署rsync+inotify
目标服务器:10.5.96.13 作为rsync的服务端,只安装rsync即可
2.2关闭防火墙和selinux
关闭防火墙
# systemctl stop firewalld
# systemctl disable firewalld
关闭selinux
# sed -i '/^SELINUX=/c SELINUX=disabled' /etc/sysconfig/selinux
重启生效
2.3 实现目标
将源服务器上的/app目录实时同步到目标服务器的/app上
三、目标服务器部署
3.1 安装rsync
centos7.4自带rsync软件
# rpm -qa|grep rsync
rsync-3.0.9-18.el7.x86_64
若检测到未安装,可通过yum安装
# yum install -y rsync
3.2 配置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=10.5.96.41 //允许进行同步的IP地址,多个IP用都好隔开
若有多个同步目录可按需添加
3.3 创建用户认证文件
# vim /etc/rsync.pass
root:qwer@1234
格式: username:password 一行一个用户信息
3.4 权限设置
分别将配置文件和用户认证文件权限修改为600
# chmod 600 /etc/rsyncd.conf
# chmod 600 /etc/rsync.pass
3.5启动服务
# systemctl start rsyncd
# systemctl enable rsyncd
netstat -antp|grep :873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3386/rsync
至此,目标服务器上rsync部署成功
四、源服务器部署
4.1 安装rsync
centos7.4自带rsync软件
# rpm -qa|grep rsync
rsync-3.0.9-18.el7.x86_64
若检测到未安装,可通过yum安装
# yum install -y rsync
4.2 启动服务
# systemctl start rsyncd
# systemctl enable rsyncd
4.3 创建用户认证文件
# vim /etc/rsync.pass //该文件只保存目标服务器上的认证密码
qwer@1234
#chmod 600 /etc/rysnc.pass
4.4 验证数据同步
在源服务器的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@10.5.96.13::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下查看是否出现创建的文件
# ls /app/
a.file b.file c.file
在目标服务器上可以查看到源服务器上创建的文件,表明同步成功
4.5 安装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
4.6 配置inotify
1) 修改环境变量PATH
# vim /etc/profile
export PATH=$PATH:/usr/local/inotify/bin
# source /etc/profile
2) 导出inotify库文件
# echo "/usr/local/inotify/lib" > /etc/ld.so.conf.d/inotify.conf
# ldconfig
3) 导出inotify头文件
# ln -s /usr/local/inotify/include/ /usr/include/inotify
4) 改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 //使参数生效
fs.inotify.max_queued_events = 9999999
fs.inotify.max_user_watches = 99999999
fs.inotify.max_user_instances = 65535
4.7 编写脚本
创建脚本,根据inotify的监测事件,触发rsync同步
# vim rsync.sh
#!/bin/bash
srcdir=/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 $rsyncuser@$dstip::$dstdir --password-file=$rsyncpassdir
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
done
# chmod a+x rsync.sh
-a:递归
-v:打印详细过程
-p:保持文件属性
-g:文件所属组不变
-o:文件所属者不变
-l:软连接属性
-r:同步目录时的参数
-z:在传输期间压缩数据
手动执行脚本,并在源服务器的/app目录下创建任意文件,下图为脚本的执行结果,并且能在目标服务器上看到新建文件,至此脚本执行成功
五、自动实时同步
通过设置脚本开机自动运行,或者通过计划任务自动运行该脚本,即可实现自动实时同步
5.1 计划任务方式
#crontab -l
*/10 * * * * /scripts/rsync.sh &> /dev/null
5.2 设置脚本开机自启
# vim /etc/rc.d/rc.local
/scripts/rsync.sh &> /dev/null
来源:CSDN
作者:秤秤biubiu
链接:https://blog.csdn.net/zoucui/article/details/103556819