使用 Rsync 实现远程同步,以及实时同步
一、基本介绍
二、使用 Rsync 实现远程同步
1.配置同步端
2.进行同步备份
3.结合 CronJob 进行自动备份
三、通过 Inotify + Rsync 实现实时同步
1.配置发起端
2.编写自动同步脚本
3.验证
一、基本介绍
Rsync 全称为:Remote Sync(远程同步),是一款开源的快速备份工具,可以在不同主机间镜像同步整个目录树,支持增量备份,保持链接和权限,采用优化的同步算法,传输前执行压缩,适用于异地备份,镜像服务器等应用(Linux 系统默认安装)
服务器身份区分:
- 发起端: 可以理解为客户端,向服务端发送要备份的数据(需要有同步端提供目录的读权限)
- 同步端: 可以理解为服务端,专用于存放备份文件;类似于远程备份中心(通过提供目录,来使客户端进行同步)
Rsync 两种同步方式:
- 上行同步: 将 Rsync 配置文件中的 path 目录同步到当前主机指定目录。
- 下行同步: 将当前主机指定目录同步到 Rsync 配置文件中的 path 目录。
因为这两种同步方式的 区别就在于目标不同,所以我们下面主要为大家介绍下行同步。
二、使用 Rsync 实现远程同步
准备工作:
1.配置同步端
1)修改 Rsync 主配置文件
[root@B-Server ~]# vim /etc/rsyncd.conf use chroot = yes # 禁锢在源目录 address = 192.168.1.2 # 监听地址 port = 873 # 监听端口 log file = /var/log/rsyncd.log # 日志文件 pid file = /var/run/rsyncd.pid # 进程文件 hosts allow = 192.168.1.0/24 # 允许访问的客户端地址 [PengYuYan] # 共享模块名 path = /app/backup # 需要同步的实际路径 comment = This is Test # 描述信息. 随便写 read only = no # 读写权限 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 同步时不再压缩的文件类型 auth users = zhangsan # 授权同步的账户 secrets file = /etc/rsync_users.db # 账户所在的数据文件
- 你们要是复制我上面的话,是没问题的,但是要把 # 去掉,这是个坑,需要注意。
[root@B-Server ~]# sed -i 's/#.*//g' /etc/rsyncd.conf
2)创建备份目录
[root@B-Server ~]# mkdir -p /app/backup && chmod 777 /app/backup
3)创建备份账户密码文件
[root@B-Server ~]# echo "zhangsan:123123" > /etc/rsync_users.db # zhangsan 是用户名. 123123 是密码 [root@B-Server ~]# chmod 600 /etc/rsync_users.db # 对用户的数据文件进行权限保护
4)启动 Rsync 服务程序
[root@B-Server ~]# rsync --daemon # 启用 (当要关闭时使用 pkill rsync 即可) [root@B-Server ~]# netstat -anpt | grep 873
2.进行同步备份
- 本地备份: 类似于 cp 命令,如:rsync /etc/fstab /opt(将本地文件 /etc/fstab 同步到
/opt
目录下)
在 192.168.1.1 上验证:
[root@A-Server ~]# echo "Hello World" > Hello.txt [root@A-Server ~]# rsync -avz Hello.txt zhangsan@192.168.1.2::PengYuYan # 远程同步
3.结合 CronJob 进行自动备份
1)准备工作:
[root@A-Server ~]# echo "123123" > /etc/server.pass # 所写的就是 zhangsan 的密码 [root@A-Server ~]# chmod 600 /etc/server.pass [root@A-Server ~]# mkdir -p /app/mariadb/data # 创建要备份的目录 [root@A-Server ~]# echo "Hello World" > /app/mariadb/data/Hello.sql
2)创建 CronJob,在每天的 22:30 进行自动备份:
[root@A-Server ~]# crontab -e # 创建计划任务 30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass /app/mariadb/data zhangsan@192.168.1.2::PengYuYan
3)验证:
[root@A-Server ~]# crontab -l # 查看计划任务 [root@A-Server ~]# date -s "2022-04-23 22:29:58" # 配置时间. 方便验证 [root@A-Server ~]# date # 查看当前时间
三、通过 Inotify + Rsync 实现实时同步
当我们通过计划任务来进行自动备份时,是没有问题的,但是 定时备份这种方式,不好的就是备份时间固定、实时性差,并且当同步的数据长时间没有发生改变时,定时备份就比较浪费存储空间。所以,我们可以通过实时同步来避免上面的问题。
配置实时同步的话,需要使用 Inotify 命令来配合:Inotify 命令可以用来监控文件系统的文件/目录是否改变,如:文件的创建、删除、移动、修改等。使用 Inotify 命令可以很方便的实现文件异动告警、增量备份等操作。
所以,我们可以通过 Inotify 来实时同步(即,只要原始位置的文件发生改变,便立即启动增量同步,否则处于等待状态)
1.配置发起端
1)调整 Inotify 内核参数 (监控事件队列);最多监控实例数;每个实例最多监控文件数:
[root@A-Server ~]# cat /proc/sys/fs/inotify/max_queued_events 16384 [root@A-Server ~]# cat /proc/sys/fs/inotify/max_user_instances 128 [root@A-Server ~]# cat /proc/sys/fs/inotify/max_user_watches 8192
把三个参数数值加大: 监控的目录、文件数量较多或变化频繁
[root@A-Server ~]# cat <<END >> /etc/sysctl.conf fs.inotify.max_queued_events = 16384 fs.inotify.max_user_instances = 1024 fs.inotify.max_user_watches = 1048576 END [root@A-Server ~]# sysctl -p
2)安装 inotify-tools 软件;以便提供 inotifywait inotifywatch 辅助工具程序
[root@A-Server ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo [root@A-Server ~]# yum -y install epel-release [root@A-Server ~]# yum -y install inotify-tools
验证: 监控 /opt 目录的变化
[root@A-Server ~]# inotifywait -mrq -e modify,create,move,delete /app/mariadb/data
重新打开一个终端:
[root@A-Server ~]# cd /app/mariadb/data [root@A-Server data]# [root@A-Server data]# ls Hello.sql [root@A-Server data]# echo "你好,CSDN-愿许浪尽天涯" > CSDN.txt
回到原来的终端进行查看:
2.编写自动同步脚本
[root@A-Server ~]# cat <<"END" > /root/sync.sh #!/bin/bash Monitor="inotifywait -mrq -e modify,create,attrib,move,delete /app/mariadb/data" Sync="rsync -azH --delete --password-file=/etc/server.pass /app/mariadb/data zhangsan@192.168.1.2::PengYuYan" $Monitor | while read DIRECTORY EVERT FILE do $Sync done END [root@B-Server ~]# chmod +x /root/sync.sh
运行脚本
[root@A-Server ~]# echo "/root/sync.sh" >> /etc/rc.local # 将脚本配置开机自启 [root@A-Server ~]# nohup /root/sync.sh & # 后台运行脚本
3.验证
[root@A-Server ~]# cd /app/mariadb/data/ [root@A-Server data]# echo "CSDN -> 愿许浪尽天涯" > tianya.txt [root@A-Server data]# ls CSDN.txt Hello.sql tianya.txt
在同步端上查看是否同步
使用上行同步: