Bootstrap

Centos7搭建rsync+inotify远程同步

Centos7搭建rsync+inotify远程同步

rsync的客户端服务器:系统为centos7 ,安装rsync+inotify
rsync服务端服务器:系统为centos7 ,只安装rsync即可

注意:在服务器上实际操作时,配置文件里的注释最好全删掉

rsync服务端服务器安装rsync

关闭防火墙和selinux

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭selinux
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux
getenforce 0
#检查是否已安装 rsync
rpm -qa|grep rsync

# 没有就安装
#yum -y install rsync

配置rsyncd.conf文件

vim /etc/rsyncd.conf

# 拥有模块对应路径的读写权限的系统用户
uid = root
gid = root
use chroot = no ##禁锢在源目录默认端口
ignore errors #表示出现错误忽视错误
#address = 192.168.x.x ##监听地址(本机的IP)
port 873 ##监听端口

log file = /var/log/rsyncd.log ##日志文件位置,启动rsync后自动产生,无需提前创建
pid file = /var/run/rsyncd.pid ##进程ID位置
lock file=/var/run/rysnc.lock #支持max connections参数的锁文件
motd file=/etc/rsyncd.motd #rsync启动时保存欢迎信息的文件


[files] ##共享模块名称
path=/usr/local/app/kjqk/files ##源目录的实际路径
comment= this a test module #注释
read only=no #是否为只读
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  #同步时不再压缩的文件类型
list=no #不显示rsync服务端资源列表
max connections=200 #最大连接数
timeout=600 #超时时间
auth users=tom #授权用户(这个是虚拟的用户,与系统用户无关,与secrets file指定的认证文件配置内容对应),可以设置多个,用英文逗号隔开
secrets file=/etc/rsync.pass #用户认证配置文件,里面存放用户名称和密码,必须手动创建这个文件
hosts allow=10.10.10.80,10.10.10.111 #允许访问的客户机地址。可以设置多个,用英文逗号隔开

创建用户认证文件
rsync服务端认证文件的格式为:<虚拟用户名>:<密码>
如果配置多个用户,各写一行

用户名tom,密码passwd110

echo 'tom:passwd110' > /etc/rsync.pass
# 检查一下
cat /etc/rsync.pass

设置文件权限

chmod 600 /etc/rsync* 
# 检查一下
ll /etc/rsync*

启动rsync服务并设置开机自启动

# 启动
systemctl start rsyncd
# 设置开机自启
systemctl enable rsyncd
# 查看运行状态
systemctl status rsyncd

在rsync客户端服务器安装rsync+inotify

关闭防火墙与SELINUX

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 selinux
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux
setenforce 0 

安装rsync
yum -y install rsync

创建认证密码文件

echo 'passwd110' > /etc/rsync.pass
# 检查一下
cat /etc/rsync.pass

设置文件权限,只设置文件所有者具有读取、写入的权限

chmod 600 /etc/rsync.pass
# 检查一下
ll /etc/rsync.pass

在rsync客户端服务器上进行测试
rsync 命令格式:rsync [OPTION]... SRC DEST

添加测试文件
` touch /usr/local/app/kjqk/files/{a,b,c,d}.test

本机路径/usr/local/app/kjqk/files下的内容(不包含files这一级) 同步到 rsync服务端[email protected]在/etc/rsyncd.conf配置的模块files对应的路径下

rsync -avH --port=873 --progress /usr/local/app/kjqk/files/ [email protected]::files/ --password-file=/etc/rsync.pass

在目标服务器上查看对应路径下,如果出现刚才本机上添加的文件,说明数据同步成功

安装inotify-tools工具,实时触发rsync同步

# 检查服务器内核是否支持inotify
ll /proc/sys/fs/inotify/

如果有这三个max开头的文件则表示服务器内核支持inotify

-rw-r--r-- 1 root root 0 7月   4 15:14 max_queued_events
-rw-r--r-- 1 root root 0 7月   4 15:14 max_user_instances
-rw-r--r-- 1 root root 0 7月   4 15:14 max_user_watches

安装

yum -y install make gcc gcc-c++

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxf inotify-tools-3.14.tar.gz && cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify-3.14
make && make install

配置inotify

  1. 修改环境变量PATH
    vim /etc/profile
    export PATH=$PATH:/usr/local/-3.14/bin
    source /etc/profile

  2. 导出inotify库文件

echo "/usr/local/-3.14/lib" > /etc/ld.so.conf.d/inotify.conf
ldconfig
  1. 导出inotify头文件
    ln -s /usr/local/-3.14/include/ /usr/include/inotify

  2. 修改inotify内核参数(默认inotify参数太小)

# /etc/sysctl.conf
sysctl -w fs.inotify.max_queued_events=9999999
sysctl -w fs.inotify.max_user_watches=99999999
sysctl -w fs.inotify.max_user_instances=65535

测试

# 执行这个命令后,在打开一个此服务器的shell终端 或者 别的方式 在 /var/tests目录下添加文件,回到执行这个命令的终端看有没有输出内容,有输出就ok
inotifywait -mrq -e modify,create,move,delete /var/tests/

写同步脚本
/usr/local/inotify-3.14/inotify_rsync.sh

INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /usr/local/app/kjqk/files"
RSYNC_CMD=" rsync -avH --port=873 --progress /usr/local/app/kjqk/files/ [email protected]::files/ --password-file=/etc/rsync.pass"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE 
do
    $RSYNC_CMD
done

检查脚本
bash -x /usr/local/inotify-3.14/inotify_rsync.sh

启动脚本

nohup bash /usr/local/inotify-3.14/inotify_rsync.sh &

ps -ef|grep inotify

设置脚本开机自动启动

chmod +x /etc/rc.d/rc.local

ll /etc/rc.d/rc.local

echo 'nohup /bin/bash /usr/local/inotify-3.14/inotify_rsync.sh' >> /etc/rc.d/rc.local

tail  /etc/rc.d/rc.local

随便在目录files里边建点文件,到目标服务器上查看是否把新生成的文件自动传上去了

;