使用 Rsync 实现远程同步,以及实时同步
使用 Rsync 实现远程同步,以及实时同步
一、基本介绍
Rsync 全称为:Remote Sync(远程同步),是一款开源的快速备份工具,可以在不同主机间镜像同步整个目录树,支持增量备份,保持链接和权限,采用优化的同步算法,传输前执行压缩,适用于异地备份,镜像服务器等应用(Linux 系统默认安装)
服务器身份区分:
- 发起端: 可以理解为客户端,向服务端发送要备份的数据(需要有同步端提供目录的读权限)
- 同步端: 可以理解为服务端,专用于存放备份文件;类似于远程备份中心(通过提供目录,来使客户端进行同步)
Rsync 两种同步方式:
- 上行同步: 将 Rsync 配置文件中的
path
目录同步到当前主机指定目录。(类似于 Pull,进行下载) - 下行同步: 将当前主机指定目录同步到 Rsync 配置文件中的
path
目录。(类似于 Push,进行上传)
因为这两种同步方式的 区别就在于目标不同,所以我们下面主要为大家介绍下行同步。
二、使用 Rsync 实现远程同步
准备工作:
主机名 | 操作系统 | IP地址 | 担任角色 |
---|---|---|---|
A-Server | CentOS7.4 | 192.168.1.1 | 发起端 |
B-Server | CentOS7.4 | 192.168.1.2 | 同步端(备份中心) |
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
目录下)
选项 | 作用 |
---|---|
-a | 归档模式,保留文件权限、属性等信息 等同于组合选项 -rlptgoD |
-v | 显示同步的详细过程 |
-H | 保留硬链接文件 |
-A | 保留 ACL 属性信息 |
-z | 传输时进行压缩 |
--delete | 删除目标位置有而原始位置没有的文件 |
--checksum | 根据校验和来决定是否跳过文件 |
在 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 # 远程同步
- 要是想从服务器端进行拉取数据到本地,那就只需要在服务器端的模块后指定本地目录即可。
rsync -avz zhangsan@192.168.1.2::PengYuYan /localPath
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
监控选项 | 作用 |
---|---|
-m | 表示持续监控 |
-r | 表示递归整个目录 |
-q | 简化输出消息 |
-e | 指定监控哪写事件 |
modify | 修改 |
create | 创建 |
move | 移动 |
delete | 删除 |
attrib | 属性变化 |
重新打开一个终端:
[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
在同步端上查看是否同步
使用上行同步:
更多推荐
所有评论(0)