centos7搭建rsync+inotify实时数据同步

之前做nfs双机热备时做过这个项目,但是目前发现自己的认知有点错误,现在单独列出来做一下并解释理论。网上很多解释的不清楚。

两台机器模拟实验
(server机器是用来做备份的,模拟client机器接收生产数据,然后上传到server上备份)
请明确机器的用途,否则做的时候脑子会混乱
server 192.168.21.133
client 192.168.21.139
数据流向 client --------> server
安装rsync服务,谁是箭头右边的,就安装在谁上,所以我们安装在server机器上

server:

  • 1.关闭防火墙,selinux,或者开启873端口

  • 2.安装rsync服务 yum install rsync -y

  • 3.修改配置文件

vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no   如果你上面uid不是root用户启动,你这里就要注意是否需要切换到root用户
port = 873
max connections = 4 
#pid file = /var/run/rsyncd.pid  这个注释有人说去掉后启动会报错,但我去掉也没事,看你自己情况
exclude = lost+found/
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log    输出日志
log format = %t %a %m %f %b    日志格式
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2   传输这几种格式时不压缩
hosts allow = 192.168.21.139   允许传输数据的ip    x.x.x.x/16   ip段也可以,生产建议精确到ip

[master_web]        [ ]里面自定义一个名字
path = /opt/ldx   这个路径代表你本地需要同步的路径,表示本地/opt/ldx路径下的数据可以进行传输
comment = master_web 和[ ]中保持一致
ignore errors
read only = no   是否允许client上传文件到server   设置成yes则client的数据无法推送到master上
write only = no   是否允许client从server上拉取数据   设置成yes则client无法从server上拉去数据
list = no 
auth users = rsync   这个用户时连接时的用户,不是系统用户,不用创建
secrets file = /etc/rsyncd.passwd  保存密码和用户名文件,需要自己生成,这个路径可以自定义
  • 4.创建密码文件
vim  /etc/rsyncd.passwd
rsync:123456   用户和路径是上面设置的,密码自定义,

chmod 600 /etc/rsyncd.passwd  设置权限,不设置会报错
  • 5.启动服务
systemctl restart rsyncd

systemctl enable rsyncd

查看873端口是否开启

server配置好了,现在我们设置client端

  • client
  • 1.创建一个文件存放server端的密码
vim   /root/rsyncd.passwd
写入 123456     只写上面设置好的密码,不写用户名
chmod 600 /root/rsyncd.passwd
  • 2.现在我们把server机器定义的/opt/ldx下面的数据同步到client的/data目录夹,/data自己创建

注意该操作是在client上操作

rsync -avzp --delete  rsync@192.168.21.133::master_web  /data  --password-file=/root/rsyncd.passwd
-p  参数可要可不要,区别不大

--delete   表示在同步时,server端/opt/ldx目录中不论是删除,添加,修改,都会同步到client,如果不加该参数,则只会同步server端新添加和修改的数据,server端删除掉的数据,client端不会删除,依然存在,该选项按个人需求选择
 
rsync@192.168.21.133::master_web   server端定义的用户名,ip,模块名
/data  本地同步的路径

--password-file=/root/rsyncd.passwd    本地存放密码的文件
  • 3.上面我们是从server同步到client,现在我们把client的某个路径下的数据同步到server
rsync -avzp  /tmp/ rsync@192.168.21.133::master_web  --password-file=/root/rsyncd.passwd

上面命令表示我们把client的/tmp/下面的数据同步到server的/opt/ldx下面
不加 --delete表示后续即使/tmp下面我们删除了东西,再次同步时/opt/ldx下面不会删除之前的/tmp数据

rsync -avzp  /tmp rsync@192.168.21.133::master_web  --password-file=/root/rsyncd.passwd

注意看上面标红的两个/tmp,都可以传输/tmp的数据,但是 /tmp/ 表示/tmp下面的数据传输,/tmp 表示连着/tmp把整个文件夹传输过去,所以server端/opt/ldx/下面收到的是/tmp文件夹,数据在/tmp下面,多了一层目录,要注意。
在这里插入图片描述

上面做完了我们就可以手工同步了,但是我们想要的是当client端数据变动,server上就能自动同步,这时我们需要用到inotify。
下面操作在client上操作,目的是client自动把变动的数据上传到server上

  • 1.安装inotify
yum install  inotify-tools -y
  • 2.调整inotify内核参数

当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。可以直接修改/etc/sysctl.conf的配置文件,将管理队列、实例数、监控数进行设置。

 vim /etc/sysctl.conf
#For more information, see sysctl.conf(5) and sysctl.d(5).   //添加//
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
 sysctl -p    //启动//
  • 3.编写inotify脚本
#!/bin/bash
host=192.168.21.133(server)
src=/nfs/k8s/     (client上的需要同步的路径)
des=master_web   (master上配置文件里的模块名)
password=/root/rsyncd.passwd  (密码文件)
user=rsync
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
 rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
  • 运行脚本
chmod +x  /root/inotify.sh
nohup bash /root/inotify.sh &  (后台形式运行)
  • 设置开机自启
chmod +x /etc/rc.d/rc.local  (这步一定要做,因为该文件默认没有执行权限)
echo "nohup bash /root/inotify.sh" >> /etc/rc.d/rc.local

我遇到的问题:rsync.passwd中密码写错了导致出错,为什么会错,密码最后多了个空格,看不出来,所以要细心啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值