●一款快速增量备份工具
Remote Sync,远程同步
支持本地复制,或者与其他SSH、rsync主机同步
●应用场景
“推”
即由客户端推送数据至服务器,比如个人电脑上传数据至云盘。
“拉”
即由客户端拉取服务器上的数据,比如利用个人电脑下载云盘文件。
●rsync 包括如下的一些特性
1. 能更新整个目录树和文件系统;
2. 有选择性的保持符号链链、硬链接、文件属性、权限、设备以及时间等;
3. 传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
4. 能用rsh、ssh 或直接端口做为传输端口;
5. 支持匿名rsync 同步文件,是理想的镜像工具;
Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去连接。
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客机的rsync同步操作的服务器称为备份源。
2.1rsync同步源简介
指备份操作的远程服务器,也称为备份源
2.2如何配置rsync源
●基本思路
修改rsyncd.conf配置文件、独立的密码文件
启用rsync的--daemon模式
●应用示例
用户backuper,允许下行同步
操作的目录为/var/www/html
●配置文件rsyncd.conf
语法类似于Samba配置
认证配置auth users、secrets file,不加则为匿名(nobody)
●rsync账号文件
采用“用户名:密码”的记录格式,每行一个用户记录
独立的账号数据,不依赖于系统账号(安全)
●如何启动和关闭rsync
启动rsync:rsync --daemon
关闭rsync:kill $(cat /var/run/rsyncd.pid)
2.3如何使用rsync备份工具
rsync命令的用法
rsync [选项] 原始位置 目标位置
常用选项
-a:归档模式,递归并保留对象属性,等同于-rlptgoD
-v:显示同步过程的详细信息
-z:在传输文件时进行压缩
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件
源端服务器配置:
1.确认rsync是否已经安装(Centos 7.6自带安装)
[root@localhost ~]# rpm -q rsync
rsync-3.1.2-4.el7.x86_64
2.修改配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes #禁锢家目录
address = 14.0.0.10 #提供同步服务的地址
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 14.0.0.0/24 #允许同步的网段
[wwwroot]
path = /var/www/html #同步的目录
comment = www.test.com
read only = yes #只读模式开启
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #这些结尾的文件同步时不再压缩
auth users = backuper
secrets file = /etc/rsyncd_users.db #用户密码存放在secrets file中
3.创建backuper用户的密码文件
[root@localhost ~]# touch /etc/rsyncd_users.db
[root@localhost ~]# vim /etc/rsyncd_users.db
backuper:abc123
4.服务端的密码文件要600权限
[root@localhost html]# chmod 600 /etc/rsyncd_users.db
5.启动服务
[root@localhost html]# rsync --daemon
6.查看状态
[root@localhost html]# netstat -ntap | grep rsync
客户端验证同步功能:
需要输密码的两种方式:
方式一:
[root@localhost opt]# rsync -avz backuper@14.0.0.10::wwwroot /opt/
Password:
receiving incremental file list
./
index.html
index1.html
index2.html
方式二:
[root@localhost opt]# rsync -avz rsync://backuper@14.0.0.10/wwwroot /opt/
Password:
receiving incremental file list
./
index.html
index1.html
index2.html
免密方式同步文件:
要先在客户端本地创建密码文件/etc/server.pass
[root@localhost etc]# vim server.pass
[root@localhost etc]# ll | grep server.pass
-rw-r--r--. 1 root root 7 9月 10 16:43 server.pass
[root@localhost etc]# chmod 600 server.pass
[root@localhost etc]# rsync -az --delete --password-file=/etc/server.pass backuper@14.0.0.10::wwwroot /opt/
[root@localhost opt]# ls
index1.html index2.html index.html
●定期同步的不足
执行备份的时间固定,延迟明显,实时性差
当同步源长期不变化时,密集的定期任务是不必要的
●实时同步的优点
一旦同步源出现变化,立即启动备份
只要同步源无变化,则不执行备份
●Linux内核的inotify机制
从版本2.6.13开始提供
可以监控文件系统的变动情况,并做出通知响应
辅助软件:inotify-tools
●调整inotify内核参数
max_queue_events:监控事件队列大小
max_user_instances:最多监控实例数
max_user_watches:每个实例最多监控文件数
监控数要大于监控目标的总文件数
●安装inotify-tools辅助工具
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果
示例:inotifywait -mrq -e modify,create,move,delete /opt/
-m:持续进行监控
-r:递归监控所有子对象
-q:简化输出信息
-e:指定要监控哪些事件类型
modify:修改;create:创建;move:移动;delete:删除
●通过inotifywait触发rsync同步操作
使用while、read持续获取监控结果
根据结果可以作进一步判断,决定执行何种操作
基于前面rsync同步实验继续
源端地址:14.0.0.10;安装软件:rsync
客户端地址:14.0.0.20;安装软件:rsync、inotify-tools
1.源端配置文件中将只读选项更改为no;更改配置文件后需要重启服务,详见下面的实验注意事项
[root@localhost ~]# vim /etc/rsyncd.conf
read only = no
2.客户端更改内核参数,指定队列大小,最多监控实例数,每个实例最多监控文件数
[root@localhost opt]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@localhost opt]# sysctl -p
3.安装inotify-tools工具
[root@slave ~]# tar zxf inotify-tools-3.14.tar.gz
[root@slave ~]# cd inotify-tools-3.14/
[root@slave inotify-tools-3.14]# yum install gcc gcc-c++ -y
[root@slave inotify-tools-3.14]# ./configure
[root@slave inotify-tools-3.14]# make && make install
4.测试inotifywait监控命令是否正常使用
[root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /opt/(输完这条命令后再开一个终端在/opt目录下进行写入或者读写等操作)
/opt/ CREATE c.txt
/opt/ CREATE d.txt
5.客户端上编写脚本,将inotify监控和rsync远程同步结合起来
[root@localhost ~]# vim inotify.sh
#!/bin/bash
INOTIFY="inotifywait -mrq -e modify,create,attrib,move,delete /opt"
RSYNC="rsync -azH --delete --password-file=/etc/server.pass /opt/ [email protected]::wwwroot/"
$INOTIFY | while read DIRECTORY EVENT FILE #逐条读取监控记录
do
if [ $(pgrep rsync | wc -l) -le 0 ];then
$RSYNC
fi
done
注意:将源端/var/www/html/目录设置权限为777,否则远程同步无法写入
6.运行脚本,在客户端/opt目录下创建文件,查看源端/var/www/html目录是否同步到
#在客户端/opt目录下创建文件b.txt,原来有a.txt
[root@localhost opt]# touch b.txt
#查看源端/var/www/html目录,新建的和原来就存在的文件都成功同步,且属主属组均为nobody用户
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ll
总用量 4
-rw-------. 1 nobody nobody 6 9月 10 21:07 a.txt
-rw-------. 1 nobody nobody 0 9月 10 21:07 b.txt
1.注意:kill pid号和kill -9 pid号的区别:后者不会删除pid文件,导致服务起不来
[root@localhost html]# cd /var/run/
[root@localhost run]# cat rsyncd.pid
14293
[root@localhost run]# kill 14293
[root@localhost run]# ll | grep rsyncd.pid
[root@localhost run]# rsync --daemon
[root@localhost run]# ll | grep rsyncd.pid
-rw-r--r--. 1 root root 6 9月 10 16:39 rsyncd.pid
[root@localhost run]# cat rsyncd.pid
14957
[root@localhost run]# kill -9 14957 #kill -9 不会删除pid文件
[root@localhost run]# ll | grep rsyncd.pid
-rw-r--r--. 1 root root 6 9月 10 16:39 rsyncd.pid
[root@localhost run]# rsync --daemon
failed to create pid file /var/run/rsyncd.pid: File exists
2.使用如下命令进行上行同步(上传)时,本地目录最后要加上/,否则会将目录同步到对方目标文件夹下,而不仅仅是同步本地目录下的文件
例如:
#在客户端输入以下命令
rsync -azH --delete --password-file=/etc/server.pass /var/www/html backuper@14.0.0.10::wwwroot/
#源端查看/var/www/html同步结果,会发现是整个html目录一起同步过来了
[root@localhost html]# ls
html
[root@localhost html]# cd html/
[root@localhost html]# ls
index1.html index.html