在服务器中,通常结合计划任务、shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常重要的,利用rsync工具,可以实现快速、高效的异地备份。本篇博客将配置rsync+crond实现定时备份、配置ssh+rsync+inotify实现触发式备份


rsync概述

   rsync(Remote Sync,远程同步)是一个开源的快速备份工具,适用于异地备份、镜像服务器等。作为一种最常用的文件备份工具,往往是Linux和UNIX系统默认安装的基本组件之一

具有以下特性:

(1)可以在不同主机间镜像同步整个目录树和文件系统

(2)可以很容易做到保持原来文件的权限、时间、软硬链接等

(3)支持增量备份

(3)无须特殊权限即可安装

(4)优化的同步算法,传输前执行压缩,文件传输效率高

(5)可以使用 rsh、ssh 方式来传输文件

(6)支持匿名传输,以方便进行网站镜象

杨书凡30.png


1. 配置rsync同步源

    rsync作为同步源时以守护进程运行,为其他客户机提供备份源。需要建立rsync.conf,创建备份账户   

[root@localhost ~]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes                       //禁锢在源目录
address = 192.168.1.1                  //监听地址
port 873                               //监听端口
log file = /var/log/rsyncd.log         //日志文件位置
pid file = /var/run/rsyncd.pid         //进程ID存放位置
hosts allow = 192.168.1.0/24           //允许访问的客户机地址
[wwwroot]                                       //共享模块名称
    path = /var/www/html                        //源目录的路径
    comment = Document Root of www1.benet.com   //描述信息
    read only = yes                             //是否为只读
    dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z   //同步时不在压缩的文件类型
    auth users = backuper                       //授权账户,如果采用匿名账户,可以去掉
    secrets file = /etc/rsyncd_users.db         //存放授权账户信息的数据文件
    
[root@localhost ~]# vim /etc/rsyncd_users.db    //为备份账户建立数据文件
backuper:123.abc                                //用:分隔账户和密码,无需建立同名系统用户
[root@localhost ~]# chmod 600 /etc/rsyncd_users.db  //修改权限,避免信息泄露
  
[root@localhost ~]# ls -ld /var/www/html/       //backuper备份用户需要对源目录拥有读取权限
drwxr-xr-x. 3 root root 4096 1月   8 05:28 /var/www/html/
[root@localhost ~]# vim /etc/sysconfig/selinux   //关闭selinux
SELINUX=disabled
[root@localhost ~]# setenforce 0                 //立即生效
[root@localhost ~]# iptables -I INPUT -p tcp --dport 873 -j ACCEPT   //允许tcp873端口通过防火墙
[root@localhost ~]# rsync --daemon               //启动rsync服务
[root@localhost ~]# netstat -anpt | grep rsync
tcp        0      0 192.168.1.1:873             0.0.0.0:*                   LISTEN      4734/rsync

[root@localhost ~]# kill $(cat /var/run/rsyncd.pid)   //若需要关闭rsync服务,可结束kill进程


2. 在发起端使用rsync备份

(1)rsync命令格式及常用备份选项

rsync  [选项]  原始位置   目标位置

    下面是rsync选项的详细介绍,具体应根据实际需求进行选择

-v, --verbose               详细模式输出

-q, --quiet                 精简输出模式

-c, --checksum              打开校验开关,强制对文件传输进行校验

-a, --archive               归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

-r, --recursive             对子目录以递归模式处理

-R, --relative              使用相对路径信息

-b, --backup                创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。

--backup-dir                将备份文件(~filename)存放在在目录下。

-suffix=SUFFIX              定义备份文件前缀

-u, --update                仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

-l, --links                 保留软链接

-L, --copy-links            想对待常规文件一样处理软链结

--copy-unsafe-links         仅仅拷贝指向SRC路径目录树以外的链结

--safe-links                忽略指向SRC路径目录树以外的链结

-H, --hard-links            保留硬链结

-p, --perms                 保持文件权限

-o, --owner                 保持文件属主信息

-g, --group                 保持文件属组信息

-D, --devices               保持设备文件信息

-t, --times                 保持文件时间信息

-S, --sparse                对稀疏文件进行特殊处理以节省DST的空间

-n, --dry-run               现实哪些文件将被传输

-W, --whole-file            拷贝文件,不进行增量检测

-x, --one-file-system       不要跨越文件系统边界

-B, --block-size=SIZE       检验算法使用的块尺寸,默认是700字节

-e, --rsh=COMMAND           指定使用rshssh方式进行数据同步

--rsync-path=PATH           指定远程服务器上的rsync命令所在路径信息

-C, --cvs-exclude           使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

--existing                  仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

--delete                    删除那些DSTSRC没有的文件

--delete-excluded           同样删除接收端那些被该选项指定排除的文件

--delete-after              传输结束以后再删除

--ignore-errors             及时出现IO错误也进行删除

--max-delete=NUM            最多删除NUM个文件

--partial                   保留那些因故没有完全传输的文件,以是加快随后的再次传输

--force                     强制删除目录,即使不为空

--numeric-ids               不将数字的用户和组ID匹配为用户名和组名

--timeout=TIME IP           超时时间,单位为秒

-I, --ignore-times          不跳过那些有同样的时间和长度的文件

--size-only                 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间

--modify-window=NUM         决定文件是否时间相同时使用的时间戳窗口,默认为0

-T --temp-dir=DIR           DIR中创建临时文件

--compare-dest=DIR          同样比较DIR中的文件来决定是否需要备份

-P 等同于 --partial--progress               显示备份过程

-z, --compress             对备份的文件在传输时进行压缩处理

--exclude=PATTERN          指定排除不需要传输的文件模式

--include=PATTERN          指定不排除而需要传输的文件模式-

-exclude-from=FILE         排除FILE中指定模式的文件

--include-from=FILE        不排除FILE指定模式匹配的文件

--version                  打印版本信息

--address                  绑定到特定的地址

--config=FILE              指定其他的配置文件,不使用默认的rsyncd.conf文件

--port=PORT                指定其他的rsync服务端口

--blocking-io              对远程shell使用阻塞IO

-stats                     给出某些文件的传输状态

--progress                 在传输时现实传输过程

--log-format=formAT        指定日志文件格式

--password-file=FILE       FILE中得到密码

--bwlimit=KBPS             限制I/O带宽,KBytes per second-h, 

--help                     显示帮助信息


(2)配置源的表示方法

    rsync同步源的资源表示方法有两种:

方法一:用户名@主机地址::共享模块名

方法二:rsync://用户名@主机地址/共享模块名


例如:执行以下操作将访问同步源,并下载到本地目录/root下进行备份

[root@localhost ~]# rsync -avz backuper@192.168.1.1::wwwroot /root   //两种操作达成效果一样
Password: 
[root@localhost ~]# rsync -avz rsync://backuper@192.168.1.1/wwwroot /root
Password:



配置rsync+crond定时备份

   在实际生产环境中,备份工作通常是按计划重复执行的,可以结合crond服务来定期执行备份计划

案例:每天晚上23:30对源服务器的网站目录做一次同步,同步到/myweb目录下

    为了在同步中不使用密码,需要创建一个密码文件

[root@localhost ~]# mkdir /myweb                  //创建备份文件夹
[root@localhost ~]# vim /etc/service.pass         //创建密码文件
[root@localhost ~]# chmod 600 /etc/server.pass   //设置权限,防止泄露
[root@localhost ~]# crontab -e                    //设置定时任务计划,每晚23:30进行同步
30 23 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.1.1::wwwroot /myweb
[root@localhost ~]# chkconfig crond on   //重启crond服务
[root@localhost ~]# service crond restart
[root@localhost ~]# ls /myweb/           //验证同步结果
index.html  index.php


配置ssh+rsync+inotify实时同步

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

    通过rsync工具与inotify机制相结合,可以实现触发式备份(实时同步)——只要原始位置的文档发生变化,即可立即启动增量备份操作,否则处于静默状态,避免了固定周期备份时存在的延迟性、周期过密等问题

杨书凡31.png


1. 调整inotify内核参数

    Linux内核中,默认的inotify机制提供了三个调控参数,分别表示监控事件队列、最多监控实例数、每个实例最多监控文件数。当需要监控的目录、文件数量过多时,建议加大这三个参数

[root@localhost ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384                                               //监控事件队列默认16384
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_instances 
128                                                 //最多监控实例数默认128
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192                                                //每个实例最多监控文件数默认8192
[root@localhost ~]# vim /etc/sysctl.conf         //如果监控文件过多,建议加大数量 
fs.inotify.max_queued_events=16384               //添加三行
fs.inotify.max_user_instances=1024
fs.inotify.max_user_watches=1048576
[root@localhost ~]# sysctl -p                    //立即生效


2. 安装inotify-tool

    使用inotify机制需要安装inotify-tool,以便提供inotifywait、inotifywatch辅助工具程序,用来监控、汇总改动情况。可从网站http://inotify-tool.sourceforge.net下载

[root@localhost ~]# tar zxf inotify-tools-3.14.tar.gz 
[root@localhost ~]# cd inotify-tools-3.14
[root@localhost inotify-tools-3.14]# ./configure && make && make install
[root@localhost inotify-tools-3.14]# cd ~
[root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/ 
输入命令后,切换终端向/var/www/html/目录添加、移动文件,跟踪屏幕输出结果,信息如下:   
/var/www/html/ CREATE index.php         //创建index.php文件
/var/www/html/ MODIFY index.php         //修改index.php文件
/var/www/html/ MOVED_FROM index.php     //重命名index.php文件
/var/www/html/ MOVED_TO ysf.php         //改名为ysf.php文件

上述命令中

inotifywait:可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果

inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况

-m  表示持续监控

-r  表示递归整个目录

-q  表示简化输出信息

-e  用来指定监控哪些事件


3. 在rsync同步源启用密钥对验证

[root@localhost html]# vim /etc/ssh/sshd_config   //修改sshd服务配置文件
PubkeyAuthentication yes                          //找到这两项,去掉注释
AuthorizedKeysFile      .ssh/authorized_keys
[root@localhost html]# service sshd reload        //重载服务


4. 在rsync发起端创建ssh密钥对,并将公钥导入到服务器公钥文本     

[root@localhost ~]# ssh-keygen -t rsa         //使用RSA算法生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:                 //按三下Enter键,实现无口令登录
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1    //将公钥文件上传到rsync同步源
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is e5:c6:c7:96:30:eb:04:00:da:e9:43:72:67:d7:ff:e3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts.
root@192.168.1.1's password:                                             //输入同步源用户密码
Now try logging into the machine, with "ssh 'root@192.168.1.1'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting
[root@localhost ~]# ssh root@192.168.1.1             //成功登录sync同步源
[root@localhost ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:B4:FB  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0


5. 编写触发式同步脚本

[root@localhost ~]# vim rsync.sh               //编写脚本,若进程已经存在,则忽略本次备份,避免并发执行rsync备份
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete /var/www/html/ root@192.168.1.1:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then
        $RSYNC_CMD
    fi
done
[root@localhost ~]# chmod +x rsync.sh           //添加执行权限,并且服务器开机自动运行此脚本    
[root@localhost ~]# echo '/root/rsync.sh' >> /etc/rc.local


6. 验证脚本是否正确

(1)执行脚本,并切换到本机/var/www/html目录,执行增、删、改等操作

杨书凡32.png


(2)登录到rsync同步源服务器,查看/var/www/html目录下是否同步

杨书凡33.png