一、rsync 远程同步
1、环境准备
master-rsync 10.101.222.11 原文件所在系统
work1-rsync 10.101.222.12 rsync 远程同步
work2-rsync 10.101.222.13 rsync + inotify 实时同步
2、系统配置(master-rsync)
#关闭防火墙
systemctl stop firewalld #临时关闭防火墙
systemctl disable firewalld #永久关闭防火墙
#关闭SELinux
setenforce 0 #临时关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config #永久关闭selinux
yum install -y rsync #rsync 系统一版已经默认安装了,这步不用执行也行
#创建需要同步数据的目录workdata1和workdata2
mkdir -p /data/workdata1 /data/workdata2
chmod +r /data/workdata1 /data/workdata2
#给目录添加上读的权限
cp /etc/rsyncd.conf /etc/rsyncd.conf.old #备份rsync配置文件
vim /etc/rsyncd.conf
编辑rsync配置文件
uid = root
gid = root
use chroot = yes
address = 10.101.222.11
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 10.101.222.0/24
[workdata1]
path = /data/workdata1
comment = this is rsync of work1-rsync
[workdata2]
path = /data/workdata2
comment = this is rsync of work2-rsync
read only = no
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users =work1 work2
secrets file = /etc/rsyncd_users.db
uid = root #用户id
gid = root #组id
use chroot = yes #开启,禁锢在源目录
address = 10.101.222.11 #监听地址
port 873 #默认端口号为873
log file = /var/log/rsyncd.log #日志文件存放位置
pid file = /var/run/rsyncd.pid #存放进程id的文件位置
hosts allow = 10.101.222.0/24 #允许访问的主机网段
[workdata1] #共享模块的名称
path = /data/workdata1 #源目录路径
comment = this is rsync of work1-rsync #共享模块备注[workdata1] #共享模块的名称
path = /data/workdata2 #源目录路径
comment = this is rsync of work2-rsync #共享模块备注
read only = no #是否为只读dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步时不再压缩的文件类型
auth users = work1 work2 #授权用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db #存放账号信息的数据文件,一行一个
3、创建用户账号和密码(master-rsync)
vim /etc/rsyncd_users.db
work1:Ab123123
work2:Ab123123
#编辑用户账号文件,固定格式为[名称:密码],一行一个
chmod 600 /etc/rsyncd_users.db #赋权600!
4、开启rsync 服务(master-rsync)
rsync --daemon
#开启服务
netstat -natp | grep rsync
#检测端口号,确认服务是否成功开启
cd /data/workdata1
#切换至共享目录下
echo "this is workdata1" >>./test
#给共享文件夹下创建一个test文件夹输入内容
5、到work1-rsync查看内容
rsync -avz work1@10.101.222.11::workdata1 /data/work1 #用rsync登录
echo "Ab123123"> /etc/server.pass #输入密码实现免交互
chmod 600 /etc/server.pass #给密钥文件赋权600
rsync -avz --delete --password-file=/etc/server.pass work1@10.101.222.11::workdata1 /data/work1/
#rsync,使用密钥文件/etc/server.pass对应work用户,
IP地址为10.101.222.11的共享模块文件进行压缩,并归档同步至当前服务器的/data/work目录下,
同时删除差异内容,保持一致性
6、 创建周期计划任务(work1-rsync)
crontab -e
*/1 * * * * rsync -avz --delete --password-file=/etc/server.pass work1@10.101.222.11::workdata1 /data/work1/ #每分钟执行删除差异内容,保持一致性
systemctl restart crond #启动crontab服务
systemctl enable crond #实现开机自启
7、在次验证同步效果
1、验证同步master-rsync 的文件到work1-rsync
在master-rsync 上创建一个文件
echo "this is test2" >>test2
在work1-rsync 上执行以下命令,再查看文件是否存在
rsync -avz --delete --password-file=/etc/server.pass work1@10.101.222.11::workdata1 /data/work1/
在master-rsync 上删除一个文件
rm-rf test2
在work1-rsync 上执行以下命令,再查看文件是否存在
rsync -avz --delete --password-file=/etc/server.pass work1@10.101.222.11::workdata1 /data/work1/
2、验证删除work1-rsync 上的文件不影响master-rsync 上的文件
在work1-rsync 上删除一个文件
rm-rf test
在master-rsync 上查看文件是否还存在
在work1-rsync 上执行以下命令,再查看文件是否存在
rsync -avz --delete --password-file=/etc/server.pass work1@10.101.222.11::workdata1 /data/work1/
二、rsync + inotify 实时同步
1、共享目录赋权(master-rsync)
chmod 777 /data/workdata2
2、优化work2-rsync 内核(work2-rsync)
cat /proc/sys/fs/inotify/max_queued_events
cat /proc/sys/fs/inotify/max_user_instances
cat /proc/sys/fs/inotify/max_user_watches
#查看当前默认inotify的内核参数
#依次为监控事件队列、最多监控实例与每个实例最多监控的文件
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
#优化内核参数
sysctl -p
#加载内核参数配置文件使其生效
#输入密码实现免交互
echo "Ab123123"> /etc/server.pass
chmod 600 /etc/server.pass
#给密钥文件赋权600
3、在work2-rsync 上解压编译安装包
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
./configure && make && make install
4、编写执行脚本
vim /data/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /data/work2/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /data/work2/ work2@10.101.222.11::workdata2"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
----详解----
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /data/work2/"
#INOTIFY_CMD变量:持续监控 /data/work2 目录中的创建,删除,移动,修改,改变时间的操作
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /data/work2/ work2@10.101.222.11::workdata2"
#RSYNC_CMD变量:使 work2 用户,/etc/server.pass 密钥文件,将 /data/work2 目录下的文件进行压缩,归档,保留硬链接文件同步至 10.101.222.11 的共享模块定义的目录 /data/workdata2 下,并删除差异性内容,保持一致性$INOTIFY_CMD | while read DIRECTORY EVENT FILE #持续监控...
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then #如果服务并未启动,则执行同步
$RSYNC_CMD
fi
done
5、执行自动监控同步脚本
cd /data/
chmod +x inotify.sh
./inotify.sh &
#给脚本赋权并在后台执行
chmod +x /etc/rc.d/rc.local
echo '/data/inotify.sh' >> /etc/rc.d/rc.local
#添加开机自动执行脚本