通过本文章的学习,你将掌握一下技能点:

  1. 会配置rsync备份源
  2. 会使用rsync下行、上行异地备份
  3. 掌握使用inotify+rsync事实备份

1.配置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为例:

centos7 备份文件的命令 centos备份软件_备份


在远程同步任务中,负责发起Rsync同步操作的客户机称为发起端,而负责响应来自客户机的Rsync同步操作的服务器称之为同步源。

centos7 备份文件的命令 centos备份软件_vim_02


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 firewalldsystemctl disable firewalldsetenforce 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 userssecrts 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

centos7 备份文件的命令 centos备份软件_服务器_03

2. 使用rsync备份工具

(1).Rsync的基本用法:

他与绝大多数的备份程序相同,指定原始位置,目标位置,其中-r选项类似于cp命令,表示递归整个目录树。

有关与更多Rsync命令参数介绍请访问:

(2).配置源的表示方法

Rsync同步源的资源表示方式有两种:

第一种:rsync -选项 用户名@主机地址::共享模块名
例如:rsync -avz demo@192.168.10.101::Demo /D 意思为:使用demo用户,主机名192.168.10.101 模块名Demo 指定的资源将下载到本地/D目录下进行备份

第二种:rsync -选项 rsync://用户名@主机地址::共享模块名
例如:rsync -avz rsync://demo@192.168.10.101/Demo /D


2.1 备份操作实例

执行以下操作将访问源服务器中的Demo共享模块,并下载到本地(B主机)的/D目录下
一下操作在B主机上面

创建备份到的指定目录D:

mkdir /Drsync -avzH --delete demo@192.168.10.101::Demo /D

centos7 备份文件的命令 centos备份软件_centos7 备份文件的命令_04


可以从上图看到/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 demo@192.168.10.101::Demo /D
*  *  *  *  * seleep 10:  /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass demo@192.168.10.101::Demo /D
*  *  *  *  * seleep 20:  /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass demo@192.168.10.101::Demo /D
*  *  *  *  * seleep 30:  /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass demo@192.168.10.101::Demo /D
*  *  *  *  * seleep 40:  /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass demo@192.168.10.101::Demo /D
*  *  *  *  * seleep 50:  /usr/bin/rsync -avzH --delete --password-file=/etc/server.pass demo@192.168.10.101::Demo /D

4.查看Crontab任务: crontab -l

centos7 备份文件的命令 centos备份软件_vim_05


5.重启Crond:systemctl restart crond

6.测试:

  1. 在A主机的/Demo文件夹里面弄几个文件,比如echo "Hello,World" > /Demo/Hello2
  2. 每隔10秒去看一下B主机的/D目录下的情况,有没有多一个Hello2文件

3.配置inotify+rsync上下行实时同步

Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改等,利用这一机制,可以非常方便的实现文件移动告警,增量备份,并针对目录或文件的变化即使做出相应。

centos7 备份文件的命令 centos备份软件_服务器_06


1.在源服务器上修改参数并重启rsync服务(服务器A)

[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

  1. 将inotify源码包下载到B主机中,然后解压源码包
    tar zxvf inotify-tools-3.14.tar.gz
  2. cd切换到解压的源码包路径进行配置源码包

./configure

若配置过程中出现如下错误需要先安装gcc编译器,然后再重新配置

centos7 备份文件的命令 centos备份软件_源码包_07


安装gcc

yum -y install gcc

3.编译安装

make && make install

3.以监控本地磁盘/D文件夹为例,然后打开另一个终端,在目录里添加、删除、移动文件,跟踪屏幕输出结果(B主机):

inotifywait -mrq -e modify,create,move,delete /D

选项详解:

  • -e 用来指定监控那些事件
  • -m 表示持续监控
  • -q 表示简化输出信息
  • -r 表示递归整个目录
  • /D D目录
  • centos7 备份文件的命令 centos备份软件_centos7 备份文件的命令_08

  • 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 demo@192.168.10.101::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服务

  1. 可以直接把A主机上面的/etc/rsync.conf文件通过scp的方式传输到B主机上
scp /etc/rsyncd.conf root@192.168.10.102:/opt/`
  1. 修改B主机的配置文件
1. 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点