centos7下部署rsync+innotify实现数据同步

≯℡__Kan透↙ 提交于 2019-12-16 09:51:19

转自: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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!