在服务器中,通常结合计划任务、shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常重要的,利用rsync工具,可以实现快速、高效的异地备份。本篇博客将配置rsync+crond实现定时备份、配置ssh+rsync+inotify实现触发式备份
rsync概述
rsync(Remote Sync,远程同步)是一个开源的快速备份工具,适用于异地备份、镜像服务器等。作为一种最常用的文件备份工具,往往是Linux和UNIX系统默认安装的基本组件之一
具有以下特性:
(1)可以在不同主机间镜像同步整个目录树和文件系统
(2)可以很容易做到保持原来文件的权限、时间、软硬链接等
(3)支持增量备份
(3)无须特殊权限即可安装
(4)优化的同步算法,传输前执行压缩,文件传输效率高
(5)可以使用 rsh、ssh 方式来传输文件
(6)支持匿名传输,以方便进行网站镜象
1. 配置rsync同步源
rsync作为同步源时以守护进程运行,为其他客户机提供备份源。需要建立rsync.conf,创建备份账户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
[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 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--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下进行备份
1
2
3
4
|
[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目录下
为了在同步中不使用密码,需要创建一个密码文件
1
2
3
4
5
6
7
8
9
|
[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机制相结合,可以实现触发式备份(实时同步)——只要原始位置的文档发生变化,即可立即启动增量备份操作,否则处于静默状态,避免了固定周期备份时存在的延迟性、周期过密等问题
1. 调整inotify内核参数
Linux内核中,默认的inotify机制提供了三个调控参数,分别表示监控事件队列、最多监控实例数、每个实例最多监控文件数。当需要监控的目录、文件数量过多时,建议加大这三个参数
1
2
3
4
5
6
7
8
9
10
11
|
[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下载
1
2
3
4
5
6
7
8
9
10
|
[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同步源启用密钥对验证
1
2
3
4
|
[root@localhost html]
# vim /etc/ssh/sshd_config //修改sshd服务配置文件
PubkeyAuthentication
yes
//
找到这两项,去掉注释
AuthorizedKeysFile .
ssh
/authorized_keys
[root@localhost html]
# service sshd reload //重载服务
|
4. 在rsync发起端创建ssh密钥对,并将公钥导入到服务器公钥文本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[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. 编写触发式同步脚本
1
2
3
4
5
6
7
8
9
10
11
12
|
[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目录,执行增、删、改等操作
(2)登录到rsync同步源服务器,查看/var/www/html目录下是否同步