在服务器中,一般结合计划任务、shell脚原本执行本地备份。为了进一步提升备份的可靠性,使用异地备份也是很是重要的,利用rsync工具,能够实现快速、高效的异地备份。本篇博客将配置rsync+crond实现定时备份、配置ssh+rsync+inotify实现触发式备份php
rsync概述html
rsync(Remote Sync,远程同步)是一个开源的快速备份工具,适用于异地备份、镜像服务器等。做为一种最经常使用的文件备份工具,每每是Linux和UNIX系统默认安装的基本组件之一linux
具备如下特性:
web
(1)能够在不一样主机间镜像同步整个目录树和文件系统
算法
(2)能够很容易作到保持原来文件的权限、时间、软硬连接等shell
(3)支持增量备份vim
(3)无须特殊权限便可安装bash
(4)优化的同步算法,传输前执行压缩,文件传输效率高服务器
(5)可使用 rsh、ssh 方式来传输文件并发
(6)支持匿名传输,以方便进行网站镜象
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 指定使用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下进行备份
[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机制相结合,能够实现触发式备份(实时同步)——只要原始位置的文档发生变化,便可当即启动增量备份操做,不然处于静默状态,避免了固定周期备份时存在的延迟性、周期过密等问题
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目录,执行增、删、改等操做
(2)登陆到rsync同步源服务器,查看/var/www/html目录下是否同步