文章目录
一、关于rsync
- 一款快速增量备份工具
- Remote Sync,远程同步
- 支持本地复制,或者与其他SSH、rsync主机同步
- 官网:http://rsync.samba.org
二、配置rsync源
(一)基本思路
- 建立rsyncd.conf配置文件、独立的账号文件
- 启用rsync的–daemon模式
(二)应用实例
- 用户backer,允许下行同步
- 操作的目录为:/var/www/html/
- 配置文件rsyncd.conf
- 需手动建立,语法类似于Samba配置
- 认证配置auth users、secrets file,不加则为匿名
- rsync账号文件
- 采用“用户名:密码”的记录格式,每行一个用户记录
- 独立的账号数据,不依赖于系统账号
- 启用rsync服务
- 通过–daemon独自提供服务
- 执行kill $(cat /var/run/rsyncd.pid) 关闭rsync服务
三、rsyncmingde用法
rsync [选项] 原始位置 目标位置
- 常用选项
- -a:归档模式,递归并保留对象属性,等同于 -rlptgoD
- -v:显示同步过程的详细(verbose)信息
- -z:在传输文件时进行压缩(compress)
- -H:保留硬链接文件
- -A:保留ACL属性信息
- –delete:删除目标位置有而原始位置没有的文件
- –checksum:根据对象的校验来决定是否跳过文件
- 配置源的两种表示方法
格式1:用户名@主机地址::共享模块名
格式2:rsync://用户名@主机地址/共享模块名
格式一:rsync -avz backuper@192.168.50.135::wwwroot /opt
格式二:rsync -avz rsync://backuper@192.168.50.135/wwwroot /opt
- rsync同步操作示例
下行rsync源:wwwroot共享->/myweb
rsync -zva --delete backuper@192.168.50.135::wwwroot /opt
四、实验一:使用rsync实现手动远程同步
- 实验环境:VMware Workstation 15.5、Xshell 6、Centos7.6
- 实验步骤:
①在源站(A机)上操作
1、关闭防火墙组件
systemctl stop firewalld && setenforce 0
2、编辑rsync配置文件
vim /etc/rsyncd.conf
添加或修改成如下内容:
uid = nobody
gid = nobody
use chroot = yes
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.50.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 ## 用户密码文件存放路径
3、创建密码文件
vim /etc/rsyncd_users.db
写入密码(格式:用户:密码):backuper:123456
4、为了不让他人访问修改权限(只有属主可以查看)
chmod 600 /etc/rsyncd_users.db
5、启动rsync服务
rsync --daemon
查看状态:
[root@localhost opt]# netstat -natp | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 16706/rsync
tcp6 0 0 :::873 :::* LISTEN 16706/rsync
6、为了验证试验结果,我们在源站上安装一个http服务并写入站点文件
yum -y install httpd ## 安装
vim /var/www/html/index.html ## 创建站点文件
写入内容:test web
②在同步站(B机)上操作
1、使用命令同步源站内容到/opt目录下
rsync -avz backuper@192.168.50.135::wwwroot /opt
或
rsync -avz rsync://backuper@192.168.50.135/wwwroot /opt
[含义]:
1. -a:归档模式,递归并保留对象属性
2. -v:显示同步过程的详细(verbose)信息
3. -z:在传输文件时进行压缩(compress)
2、查看同步过来的文件内容
[root@localhost opt]# cat /opt/index.html ## 可以看到已经同步过来了
test web
另外,如果在shell脚本中使用同步命令必定会涉及到免交互会比较麻烦,所以可以使用免交互功能,只需要在同步站点创建一个密码文件即可
vim /etc/server.pass ## 创建密码文件(路径随意)
123456 ## 写入密码
chmod 600 /etc/server.pass ## 设置权限只能属主操作该文件
执行免交互同步命令:
rsync -zva --password-file=/etc/server.pass backuper@192.168.50.135::wwwroot /opt
五、rsync实时同步
- 定期同步的不足
- 执行备份的时间固定,延迟明显、实时性差
- 当同步源长期不变化时,密集的定期任务是不必要的
- 实时同步的优点
- 一旦同步源出现变化,立即启动备份
- 只要同步源无变化,则不执行备份
- 为了解决这个问题可以使用Linux内核提供额inotifu机制
- 从版本2.6.13开始提供
- 可以监控文件系统的变动情况,并做出通知响应
- 用到的辅助软件:inotifu-tools
- 调整inotifu内核参数
- max_queue_events:监控事件队列大小
- max_user_instances:最多监控实例数
- max_user_watches:每个实例最多监控文件数
- inotify-tools工具参数
- inotifywait:用于持续监控,实时输出结果
- inotifywatch:用于短期监控,任务完成后再出结果
- 命令选项:
-m:持续进行监控
-r递归监控所有子对象
-q:简化输出信息
-e:指定要监控哪些事件类型
六、实验二:使用rsync实现自动同步
- 实验步骤:(接上一个实验)
1、在B机上安装http服务
yum -y install httpd
2、关闭防火墙
systemctl stop firewalld && setenforce 0
/var/www/html/ CREATE b
/var/www/html/ CREATE c
/var/www/html/ MODIFY c
3、安装编译环境
yum -y install gcc gcc-c++
4、调整内核参数
vim /etc/sysctl.conf ## 编辑配置文件
fs.inotify.max_queued_events = 16384 ## 监控事件队列大小
fs.inotify.max_user_instances = 1024 ## 最多监控实例数
fs.inotify.max_user_watches = 1048576 ## 每个实例最多监控文件数
使用命令:sysctl -p 使配置立即生效
5、解压缩软件(先上传到/opt目录下)并进行配置与安装
tar zxvf inotify-tools-3.14.tar.gz -C /opt
cd /opt/inotify-tools-3.14 ## 进入软件目录
./configure ## 进行配置
make && make install ## 编译及安装
6、测试inotify软件是否可以正常监控
inotifywait -mrq -e modify,create,move,delete /var/www/html ## 执行命令后会进入监听模式,无法操作,所以需要另开一个终端页面操作
PS:
-m:持续进行监控
-r递归监控所有子对象
-q:简化输出信息
-e:指定要监控哪些事件类型
随机创建文件并写入内容测试inotify是否可以监控操作动作:
cd /var/www/html
touch b
echo "123" > c
另一个终端输出信息,说明软件工作正常:
[root@localhost inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /var/www/html
/var/www/html/ CREATE b
/var/www/html/ CREATE c
/var/www/html/ MODIFY c
7、编写一个shell脚本,通过inotifuwait触发rsync同步操作
vim /opt/inotify.sh ## 创建脚本
在脚本中写入:
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.50.135::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ];then
$RSYNC_CMD
fi
done
PS:注意!192.168.50.135 IP是A机的
chmod +x /opt/inotify.sh ## 为脚本添加执行权限
8、因为涉及到读写操作,所以需要把A、B机的/var/www/html/目录的权限放开
chmod 777 /var/www/html/ ## 分别在A、B机上进行操作
9、现在进行测试,看能否自动同步
在B机上创建一个web.txt文件:touch /var/www/html/web.txt
再将刚才创建的b、c文件删除:rm -rf /var/www/html/b
rm -rf /var/www/html/c
切换到A机上查看html目录下文件:
[root@localhost opt]# ls /var/www/html/
web.txt ## 可以看到这个web.txt文件已经同步过来了