目录
rsync + inotify 实现文件实时同步
rsync简介
inotify简介
实例
目标服务器
1、关闭selinux
2、安装rsync
3、配置rsyncd.conf
4、创建用户
5、设置同步目录权限
6、启动rsync
源服务器
1、关闭selinux
2、安装rsync
3、创建认证密码文件
4、启动rsync
5、验证rsync
安装inotify-tools
1、查看是否安装
2、安装文档
3、修改inotify默认参数(inotify默认内核参数值太小)
配置inotify脚本,实现自动同步
1、配置inotify.sh脚本,vim /home/scripts/inotify.sh
2、设置inotify.sh文件执行的权限
3、启动脚本
rsync + inotify 实现文件实时同步
rsync简介
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步
inotify简介
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件
实例
需求:部署rsync+inotify 实时同步源服务器(172.16.18.3)目录/opt/upload/下的文件到目标服务器(172.16.18.2)的目录/opt/upload中
目标服务器
1、关闭selinux
# 关闭seLinux
setenforce 0
# 查看seLinux状态
# getenforce
# /usr/sbin/sestatus -v #如果SELinux status参数为enabled即为开启状态 |
2、安装rsync
我这里已经安装过了,所以这里不在列出,需要的自行百度
验证rsync安装情况:rpm -qa | grep rsync
3、配置rsyncd.conf
vim /etc/rsyncd.conf,加入以下配置
uid = root #工作中指定用户(可以不指定为0)
gid = root
port = 873
use chroot = no #相当于黑洞.出错定位
max connections = 200 #有多少个客户端同时传文件
timeout = 300 #超时时间
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors #表示出现错误忽略错误
read only = no #表示网络权限可写(本地控制真正可写)
list = no #这里设置IP或让不让同步
hosts allow = 172.16.18.3 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下 逗号隔开
auth users = rsync #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开(认证用户)
secrets file = /etc/rsync.password #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
#fake supper = yes
[upload] #同步模块名称,(这个模块就是待会儿对端写脚本的里面一个参数的名称)
path = /opt/upload/ ##需要同步的目录(准确的说是同步过来后放到哪里的目录路径) |
4、创建用户
useradd rsync
passwd rsync # 设置密码
# 创建用户认证文件
vim /etc/rsync.password
#rsync:rsync #用户名:密码,可以设置多个,每行一个用户名:密码
#设置文件权限
chmod 600 /etc/rsync.password |
5、设置同步目录权限
6、启动rsync
源服务器
1、关闭selinux
# 关闭seLinux
setenforce 0
# 查看seLinux状态
# getenforce
# /usr/sbin/sestatus -v #如果SELinux status参数为enabled即为开启状态 |
2、安装rsync
我这里已经安装过了,所以这里不在列出,需要的自行百度
验证rsync安装情况:rpm -qa | grep rsync
3、创建认证密码文件
vim /etc/rsync.password
# rsync # 这里是服务器端rsync用户的密码
#设置rsync.password文件权限
chmod 600 /etc/rsync.password |
4、启动rsync
5、验证rsync
cd /opt/upload
touch a.txt
rsync -avH --port=873 --delete --progress /opt/upload/ rsync@172.16.18.2::upload --password-file=/etc/rsync.password
# 注:目标服务器ip后面写的是在目标服务器上面rsync配置文件里面定义的模块名称 |
1、查看是否安装
rpm -qa inotify-tools
2、安装文档
https://github.com/inotify-tools/inotify-tools/wiki
安装完成之后执行rpm -ql inotify-tools命令,查看安装详细,最主要的是inotifywait和inotifywatch
inotifywait : 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用
inotifywatch :收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
3、修改inotify默认参数(inotify默认内核参数值太小)
# 1、查看系统默认参数值,结果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_queued_events
#fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_watches
#fs.inotify.max_user_instances = 128
sysctl -a | grep max_user_instances
# 2、修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
# 3、#vim /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
#参数说明:
#max_queued_events:inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
#max_user_watches:要同步的文件包含多少目录,可以用:find /home_test -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home_test为同步文件目录)
#max_user_instances:每个用户创建inotify实例最大值 |
配置inotify脚本,实现自动同步
1、配置inotify.sh脚本,vim /home/scripts/inotify.sh
#!/bin/bash
Path="/opt/upload/"
backup_Server="172.16.18.2"
#不需要同步的目录,如果有多个,每一行写一个目录,使用相对于同步模块的路径
excludedir="/home/scripts/exclude.list"
user="rsync"
pass_file="/etc/rsync.password"
module="upload"
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path | while read line
do
if [ -f $line ];then
rsync -azH $line --delete --progress --exclude-from=$excludedir $user@$backup_Server::$module --password-file=$pass_file
else
cd $Path &&\
rsync -azH ./ --delete --progress --exclude-from=$excludedir $user@$backup_Server::$module --password-file=$pass_file
fi
done |
2、设置inotify.sh文件执行的权限
chmod +x inotify.sh
3、启动脚本
(1)不重启服务器的情况:sh /home/scripts/inotify.sh &
(2)设置开机自动执行,需要重启服务器:
#设置脚本开机自动执行
#vim /etc/rc.d/rc.local #编辑,在最后添加一行
bash /home/scripts/inotify.sh & #设置开机自动在后台运行脚本
# chmod +x /etc/rc.d/rc.local
# systemctl enable rc-local |