之前做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中密码写错了导致出错,为什么会错,密码最后多了个空格,看不出来,所以要细心啊