rsync是一款开源的可以实现全量及增量的本地或远程数据同步备份的有效工具,它能本地复制,远程复制或者远程守护进程方式复制,它提供了大量的参数控制其行为各个方面,并且允许非常灵活的方式来实现文件的传输复制,并且可以通过delta-transfer算法来实现文件对比,从而保证其增量备份。
①首先将源文件和目标位置的文件做比较,找出差异的部分
②根据目的地的位置的文件和源文件差异的部分进行一致性同步
rsync同步源是指备份操作的远程服务器,也称备份源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rqTLMUB-1663755963377)(C:/Users/mogu/Downloads/%E6%9C%AA%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%20(4)].png)
其实发起端和数据源是一个很容易混淆的概念,举个栗子,我将数据写给数据库,我就是数据源,虽然是我的主观目的发起的同步,但是我提供数据属于数据源,数据库需要发起请求我的数据,才能将我同步,当然,反过来说我想要数据库提供数据,数据库提供数据,而我需要数据库的数据我就是发起端。
格式一
rsync -avz backuper@192.168.226.121::wwwroot /root
rsync -avz 用户名 @指向的数据源的地址 ::调用什么模块 将数据同步到那个目录
格式二
rsync -avz rsync://backuper@192.168.226.121/wwwroot /root
rsync -avz rsync://用户名@指向的数据源的地址 /使用那个模块 让那个目录同步 将数据同步到那个目录
数据源配置文件
/var/log/rsync.pid
uid = root #用户名
gid = root #用户组名
use chroot = yes #是否禁锢在源目录
address = 192.168.226.121 #数据源地址
port 873 #端口号
log file = /var/log/rsync.log #rsync日志地址
pid file = /var/log/rsync.pid #rsyncpid号地址
hosts allow = 192.168.226.0 /24 #允许请求的地址
[wwwroot] #共享模块
path = /aaa #数据源地址
read only = yes #是否
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #对以下格式不压缩
auth users = root #授权账户
secrets file = /etc/user.db #存放账户信息的数据文件
配置密码
vim /etc/user.db
root:2288
chmod 600 /etc/user.db #设置权限
杀死rsync进程
kill $(cat /var/run/rsync.pid)
客户端免交互
echo "2288" >/etc/server.pass
chmod 600 /etc/server.pass
rsync -avz --password-file=/etc/server.pass root@192.168.226.121::wwwroot /aaa
rsync 【选项】原始位置 目标位置
选项 | 作用 |
---|---|
-r | 递归,包括目录以及子目录中的所有文件 |
-l | 对符号链接文件依然复制为符号链接文件 |
-v | 显示同步过程的详细信息 |
-z | 在传输时进行压缩 |
-a | 归档模式,递归并保留对象属性,等同-rlptgoD |
-p | 保留文件的权限标识 |
-t | 保留文件的时间标记 |
-g | 保留文件的属组标记(仅超级用户使用) |
-o | 保留文件的属主标记(仅限超级用户使用) |
-H | 保留硬链接 |
-A | 保留ACL属性信息 |
-D | 保留设备文件及其他特殊文件 |
–delete | 删除目标位置有而原始位置没有的文件 |
–checksum | 根据对象校验和来决定是否跳过文件 |
本地同步
rsync -avz /aaa/ /bbb/ #将aaa目录下的文件同步到bbb目录下面,只同步目录下的文件
ls bbb目录
a.txt b.txt c.txt d.txt
rsync -azv /aaa /bbb/ #将aaa目录同步到bbb目录,连同aaa目录本身,及在bbb目录里生成aaa的一个子目录
ls bbb目录
aaa
ls /bbb/aaa
a.txt b.txt c.txt d.txt
格式:inotifywait 【参数】
常见参数 | 说明 |
---|---|
-m | 持续监控 |
-r | 递归监控所有子对象 |
-q | 简化输出信息 |
-e | 指定要监控那些时间类型 |
主机 | ip | 角色 |
---|---|---|
master | 192.168.226.121 | 数据源 |
slave1 | 192.168.226.122 | 客户端 |
流程:我们通过inotify持续监控数据库的data目录,如果有修改就会触发rsync同步
①对数据源inotify内核参数进行调整
#客户端: inotify内核参数
cat /proc/ sys/fs/inotify/max_queued_eventscat
/proc/sys/ fs/inotify/max user instancescat
/proc/sys/fs/inotify/max user watches
vim /etc/ sysctl.conf
fs.inotify.max_queued_events = 32768
#监控时间队列,默认为16384
fs.inotify.max_user _instances = 1024
#最多监控实例数,默认为128
fs.inotify.max user watches = 1048576
#每个实例最多监控文件数,默认为8192
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
②在需要同步端监控data目录下的变动
解压inotify-tools安装
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
./configure
make && make install
inotifywait -mrq -e create,delete,modify /usr/local/mysql/
③在被同步端配置数据源配置文件
④通过脚本实时监控并触发同步
vim /opt/inotify.sh
#!/bin/bash
#定义监控命令变量
INOTIFY_CMD="inotifywait -mrq -e create,delete,modify /usr/local/mysql/"
#定义同步命令变量
RSYNC_CMD="rsync -avzH --delete --password-file=/etc/server.pass /usr/local/mysql/data/ root@192.168.226.122::wwwroot"
#while read DIRECTORY EVENT FILE 循环捕捉时间文件的变化,如果变化进入循环
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ;
then
$RSYNC_CMD
fi
done
chmod +x /opt/inotify.sh #给予脚本执行权限
chmod +x /etc/rc.d/rc.local
echo "/opt/inotify.sh" >/etc/rc.d/rc.local
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCX5Pxoh-1663755963379)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220824121208423.png)]
$RSYNC_CMD
fi
done
chmod +x /opt/inotify.sh #给予脚本执行权限
chmod +x /etc/rc.d/rc.local
echo “/opt/inotify.sh” >/etc/rc.d/rc.local
[外链图片转存中...(img-TCX5Pxoh-1663755963379)]