通过本文章的学习,你将掌握一下技能点:
- 会配置rsync备份源
- 会使用rsync下行、上行异地备份
- 掌握使用inotify+rsync事实备份
1.1.什么是rsync?
rsync(Remote Sync,远程同步),它是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
rsync的官方站点是http://rsync.samba.org/ ,目前最新版是3.1.2,由Wayne Davison进行维护。作为一种最常用的文件备份工具,rsync往往是现在Linux和Unix系统默认安装的基本组件之一,本文以Centos7.3中的rsync-3.0.9-17为例:
在远程同步任务中,负责发起Rsync同步操作的客户机称为发起端,而负责响应来自客户机的Rsync同步操作的服务器称之为同步源。
rsync作为同步源以守护进程运行,为其他客户机提供备份源。配置rsync同步源需要建立配置文件rsyncd.conf
,创建备份账号,然后将rsync程序以守护进程--daemon
选项方式运行。
实验开始:
环境:
同步源主机名:101(A主机) | IP:192.168.10.101 | 系统:Centos7.3 |
---|---|---|
发起端主机名:102(B主机) | IP:192.168.10.102 | 系统:Centos7.3 |
主机A备份账号:demo | 密码:demo123. | 备份位置:/Demo |
主机B备份账号:demo | 密码:demo123. | 备份位置:/D |
共享模块名: |
---|
Demo |
先关闭防火墙、安全机制等:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.建立/etc/rsyncd.conf
配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes //禁锢在源目录
address = 192.168.10.101 //监听地址
port 888 //监听端口
log file = /var/log/rsyncd.log //日志文件
pid file = /var/run/rsyncd.pid //进程ID的文件位置
hosts allow = 192.168.10.102 //允许访问的客户机地址
[Demo] //共享模块名称
path = /Demo //源目录的实际路径为根下面/Demo文件夹下
read only = yes //只读权限
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z //同步时不在压缩时的文件类型
auth users = demo //授权用户
secrets file = /etc/rsyncd_users.db //存放账户信息的数据文件
基于安全考虑,对于rsync的同步源最好仅允许以只读的方式同步,另外,同步可以采用匿名的方式,只要将其中的auth users
和secrts file
配置项去掉就可以了
2.创建备份账户数据文件
一行一个用户,用户名和密码以冒号分隔,用户名为:demo
密码为:demo123.
(无需建立系统同名用户),由于文件以明文存放,请设置好相应的文件权限。
[root@101 ~]# vim /etc/rsyncd_users.db
demo:demo123.
给/etc/rsyncd_user.db设置读取权限
[root@101 ~]# chmod 600 /etc/rsyncd_users.db
3.启动rsync服务程序
rsync --daemon
若要关闭,可以使用kill $(cat /var/run/rsyncd.pid)
命令
查看端口是否监听
netstat -anpt |grep 873
(1).Rsync的基本用法:
他与绝大多数的备份程序相同,指定原始位置,目标位置,其中-r
选项类似于cp
命令,表示递归整个目录树。
有关与更多Rsync命令参数介绍请访问:https://www.cnblogs.com/subsir/articles/2565373.html
(2).配置源的表示方法
Rsync同步源的资源表示方式有两种:
第一种:rsync -选项 用户名@主机地址::共享模块名
例如:rsync -avz [email protected]::Demo /D
意思为:使用demo用户,主机名192.168.10.101 模块名Demo 指定的资源将下载到本地/D
目录下进行备份
第二种:rsync -选项 rsync://用户名@主机地址::共享模块名
例如:rsync -avz rsync://[email protected]/Demo /D
执行以下操作将访问源服务器中的Demo共享模块,并下载到本地(B主机)的/D
目录下
一下操作在B主机上面
创建备份到的指定目录D:
mkdir /D
rsync -avzH --delete [email protected]::Demo /D
可以从上图看到/D/目录下已经有A主机上的Hello1文件,则同步完成
我们还可以进一步的定制自己想要的功能,例如,每隔十秒执行一次同步,定时任务可以交给Crond
服务来完成,为了在同步过程中不用再手动输入密码,所以我们需要创建一个密码文件,保存Demo(用户)
的密码,比如: /etc/server.pass
,在执行rsync同步时使用选项--password-file=/etc/server.pass
指定即可:
1.创建密码文件:vim /etc/server.pass
里面写密码(demo123.)
2.给他授予权限chmod 600 /etc/server.pass
3.指定任务计划(每十秒运行一次):crontab -e
* * * * * /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
* * * * * seleep 10: /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
* * * * * seleep 20: /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
* * * * * seleep 30: /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
* * * * * seleep 40: /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
* * * * * seleep 50: /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass [email protected]::Demo /D
4.查看Crontab任务: crontab -l
5.重启Crond:systemctl restart crond
6.测试:
Linux内核从2.6.13版本开始提供了
inotify通知接口
,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改
等,利用这一机制,可以非常方便的实现文件移动告警,增量备份,并针对目录或文件的变化即使做出相应。
[root@localhost ~]# vi /etc/rsyncd.conf
修改
read only = no
[root@localhost ~]# netstat -anpt | grep rsync
tcp 0 0 192.168.4.200:873 0.0.0.0:* LISTEN 13663/rsync
[root@localhost ~]# kill 13663
[root@localhost ~]# rsync --daemon
2.安装inotify-tools(服务器B)
用来监控、汇总改动情况,可以从我的百度网盘下载:https://pan.baidu.com/s/1RLMDOHSdjzKCkPrQIPeZ5A 提取码:6uyj
将inotify源码包下载到B主机中,然后解压源码包
tar zxvf inotify-tools-3.14.tar.gz
cd切换到解压的源码包路径进行配置源码包
./configure
若配置过程中出现如下错误需要先安装gcc编译器,然后再重新配置
安装gcc
yum -y install gcc
3.编译安装
make && make install
3.以监控本地磁盘/D文件夹为例,然后打开另一个终端,在目录里添加、删除、移动文件,跟踪屏幕输出结果(B主机):
inotifywait -mrq -e modify,create,move,delete /D
选项详解:
-e 用来指定监控那些事件
-m 表示持续监控
-q 表示简化输出信息
-r 表示递归整个目录
PS: inotifywait可以监控modify(修改)、create(创建)、delete(删除)、move(移动)、attrib(属性更改)等各种事件;更多请查看man手册。
4.编写脚本触发同步脚本
vim /opt/inotify_rsync.sh
添加:
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /D"
RSYNC_CMD="rsync -avzH --delete --password-file=/etc/server.pass /D [email protected]::Demo"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
$RSYNC_CMD
done
设置相应的权限:
[root@localhost html]# chmod +x /opt/inotify_rsync.sh
[root@localhost html]# echo '/opt/inotify_rsync.sh' >> /etc/rc.local
[root@localhost html]# cd /opt
[root@localhost opt]# ./inotify_rsync.sh
可以将此脚本加入到计划任务定时运行
要想实现主机A与主机B文件实时同步,也就是说如果A服务器创建了文件Hello,那么B主机上面也会有,同时,主机B上面删除了文件Hello,那么主机A上面的Hello也会被删除,那么就也需要在B主机上搭建Rsync服务
可以直接把A主机上面的/etc/rsync.conf文件通过scp的方式传输到B主机上
scp /etc/rsyncd.conf [email protected]:/opt/`
修改B主机的配置文件
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.10.102
port 837
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.10.101
[Demo]
path = /D
read only = no
dont compress = *.gz *.bz2 *.taz *.zip *.rar *.z
auth users = demo
secrets file = /etc/rsyncd_users.db
3.建立用户文件(此处不再累赘,记得设置600权限)
4.设置备份目录/D/权限777
5.在A主机上建立B主机的密码(此处不再累赘,记得设置600权限)
6.设置A服务器上的定时任务,定时同步B服务器上面的数据(此处不再累赘)
此时,就达到了A服务器创建了文件Hello,那么B主机上面也会有,同时,主机B上面删除了文件Hello,那么主机A上面的Hello也会被删除,若B服务器上面的数据A上面没有,将自动同步到A服务器上
的效果,写到配置inotify+rsync上下行实时同步后半部分这里已经快晚上11点,我的思路不知为何已经变的很不清晰,大家有什么不清楚的地方评论在下方,我会一一解答,待我思路清晰再重新编辑文档