正确有效的备份方案是保障系统及数据安全的重要手段。在服务器中,通常会结合计划任务,Shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常有必要的。
配置rsync源服务器(服务器端)
rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。作为一种最常用的文件备份工具,rsync往往是linux和Unix系统默认安装的基本组件之一。
下面介绍如何配置rsync同步源
rsync作为同步源时以守护进程运行,为其他客户机提供备份源。配置rsync同步源需要建立配置文件rsyncd.conf,创建备份账号,然后将rsync程序以守护进程("--daemon"选项)方式运行。指备份操作的远程服务器,也称为备份源。
建立配置文件
配置文件rsyncd.conf位于/etc/目录下,下面将以源目录/var/www/html、备份账号backuper为例
1. [root@localhost ~]# vim /etc/rsyncd.conf 2. uid = nobody 3. gid = nobody 4. use chroot = yes //禁锢在源目标 5. address = 192.168.1.10 //监听地址 6. port 873 //监听端口 7. log file = /var/log/rsyncd.log //日志文件位置 8. pid file = /var/run/rsyncd.pid //存放进程ID的文件位置 9. hosts allow = 192.168.1.0/24 //允许访问的客户端地址 10. [wwwroot] //共享模块名称 11. path = /var/www/html //源目录的实际路径 12. comment = aaa //描述 13. read only = yes //是否为只读 14. dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 15. //同步时不再压缩的文件类型 16. auth users = backuper //授权用户 17. secrets file = /etc/rsyncd_users.db //存放账号信息的数据文件
为了安全性考虑,对于rsync的同步源最好仅允许以只读方式同步。另外,通不可以采用匿名的方式,只要将其中的"auth users"和"secrets file" 配置记录去掉就可以了。
为备份账户创建数据文件
根据上一步的设置,创建账号数据文件,添加一行用户记录,以冒号分隔,用户名称为“backuper”,密码为“pwd123”。由于账号信息采用明文存放,因此应调整文件权限,避免账号信息泄露。
1. [root@localhost ~]# vim /etc/rsyncd_users.db 2. backuper:pwd123 3. [root@localhost ~]# chmod 600 /etc/rsyncd_users.db
备份用户backuper需要对源目标/var/www/html有相应的读取权限,实际上只要other组有读取权限,则备份用户backuper和运行用户nobody也就有读取权限了。初始环境的虚拟机可能没有该目录,创建一个就可以。
1. [root@localhost ~]# mkdir -p /var/www/html 2. [root@localhost ~]# ls -ld /var/www/html 3. drwxr-xr-x 2 root root 6 Jun 17 16:16 /var/www/html
启动rsync服务程序
1. [root@localhost ~]# rsync --daemon //开启服务 2. [root@localhost ~]# netstat -anpt | grep rsync 3. tcp 0 0 192.168.1.10:873 0.0.0.0:* LISTEN 5080/rsync
关闭rsync服务可以采用kill进行的方式
[root@localhost ~]# kill $(cat /var/run/rsyncd.pid)
使用rsync备份工具(客户端)
有了同步源服务器之后,就可以使用rsync工具来执行远程同步了。实际上同步源与发起端可以是同一台主机(不常见),其效果相当于本地备份而不是异地备份。
rsync命令的基本用法
最简单的rsync用法类似于cp命令。例如,可以将文件/etc/fstab、目录/boot/grub同步备份到/opt目录下。
1. [root@localhost ~]# rsync /etc/fstab /opt 2. [root@localhost ~]# rsync -rl /etc/fstab /boot/grub /opt
命令格式及常用备份选项
1. rsync [选项] 原始位置 目标位置 2. -r :递归模式,包含目录及子目录中的所有文件。 3. -l : 对于符号链接文件仍然复制为符号链接。 4. -v : 显示同步过程的详细。 5. -a :归档模式,保留文件的权限、属性等信息,等同于组合选项"-rlptdoD" 6. -z : 在传输文件时进行压缩。 7. -p :保留文件的权限标记。 8. -t : 保留文件的时间标记。 9. -g :保留文件的属组标记(仅超级用户使用)。 10. -o :保留文件的属主标记(仅超级用户使用)。 11. -H :保留硬链接文件。 12. -A :保留ACL属性信息。 13. -D :保留设备文件及其他特殊文件。 14. --delete :删除目标位置有,而原始位置没有的文件。 15. --checksum :根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
配置源的表示方法
rsync同步源的资源表示方式为”用户名@服务器IP地址::共享模块名“或者“rsync://用户名@服务器IP地址/共享模块名”
执行以下操作将访问rsync同步源,将指定的资源下载到本地/root目录下进行备份。
1. [root@localhost ~]# rsync -avz backuper@192.168.1.10::wwwroot /root 2. 或 3. [root@localhost ~]# rsync -avz rsync://backuper@192.168.1.10/wwwroot /root
rsync备份操作示例
执行以下操作将访问源服务器中的wwwroot共享模块,并下载到本地/myweb目录下。
1. [root@localhost ~]# mkdir /myweb 2. [root@localhost ~]# rsync -avzH --delete backuper@192.168.1.10::wwwroot /myweb 3. Password: //验证backuper用户的密码 4. receiving incremental file list 5. ./ 6. 1.txt //源服务器中/html下的文件 7. 8. sent 83 bytes received 147 bytes 51.11 bytes/sec 9. total size is 0 speedup is 0.00 10. [root@localhost ~]# ls /myweb/ 11. 1.txt
实际生产环境中的备份工作通常是按计划重复执行的。例如,每天晚上十点对服务器的网站目录做一次同步,定期任务可以交给crond服务来完成。
为了在同步过程中不用输入密码,需要创建一个密码文件,保存backuper用户的密码,如/etc/server.pass。在执行rsync同步时使用选项"--password-file=/etc/server.pass"指定即可。
1. [root@localhost ~]# vim /etc/server.pass 2. pwd123 3. [root@localhost ~]# chmod 600 /etc/server.pass 4. [root@localhost ~]# crontab -e 5. 00 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.1.10::wwwroot /myweb 6. [root@localhost ~]# systemctl restart crond 7. [root@localhost ~]# systemctl enable crond
配置inotify+rsync实时同步
linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
将notify机制与rsync工具相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静默等待状态,这样就避免了按固定周期备份时的延迟性、周期过密等问题。
调整inotify内核参数(客户端)
在linux内核中,默认的inotify机制提供了三个调控参数:max_queue_events、max_user_instances、max_user_watches,分别表示监控事件队列(16384),最多监控实例数(128),每个实例最多监控文件数(8192)。
1. [root@localhost ~]# cat /proc/sys/fs/inotify/max_queued_events 2. 16384 3. [root@localhost ~]# cat /proc/sys/fs/inotify/max_user_instances 4. 128 5. [root@localhost ~]# cat /proc/sys/fs/inotify/max_user_watches 6. 8192
当要监控的目录、文件数量较多或变化比较频繁时,建议加大这三个参数的值。
1. [root@localhost ~]# vim /etc/sysctl.conf 2. ...... //省略部分 3. fs.inotify.max_queued_events = 16384 4. fs.inotify.max_user_instances = 1024 5. fs.inotify.max_user_watches = 1048576 6. [root@localhost ~]# sysctl -p
安装inotify-tools
使用inotify机制还需要安装inotify-tools,以便提供inotifywait、inotifywatch辅助工具程序,用来监控、汇总改动情况。inotify-tools可以从网站inotify-tools下载。
1. [root@localhost ~]# mount /dev/cdrom /media 2. mount: /dev/sr0 写保护,将以只读方式挂载 3. [root@localhost ~]# tar zxf /media/inotify-tools-3.14.tar.gz -C /usr/src 4. [root@localhost ~]# cd /usr/src/ 5. debug/ inotify-tools-3.14/ kernels/ 6. [root@localhost ~]# cd /usr/src/inotify-tools-3.14/ 7. [root@localhost inotify-tools-3.14]# ./configure && make && make install
以监控网站目录/var/www/html为例,可以先执行"inotifywait"命令,然后在另打开一个终端向/var/www/html目录下添加文件、移动文件,跟踪屏幕将会输出结果。其中,选项"-e"用来指定要监控哪些事件,选项"-m"表示持续监控,选项"-r"表示递归整个目录,选项"-q"简化输出信息。
1. [root@localhost ~]# mkdir -p /var/www/html 2. [root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html 3. /var/www/html/ CREATE a.txt //创建a.tzt文件
inotifywait可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果;inotifywatch可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。
编写触发式同步脚本
1. [root@localhost ~]# vim /opt/inotify_rsync.sh 2. #!/bin/bash 3. A="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/" 4. B="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.1.10::wwwroot" 5. $A | while read a b c //一旦读取到$A命令的输出结果就执行do后面的语句 6. do 7. $B 8. done 9. [root@localhost ~]# chmod +x /opt/inotify_rsync.sh 10. [root@localhost ~]# echo '/opt/inotify_rsync.sh' >> /etc/rc.local //将脚本文件追加到系统服务中
源服务器端的配置
1. [root@localhost ~]# vim /etc/rsyncd.conf 2. read only = no //将只读权限yes改为no 3. [root@localhost ~]# chmod 777 /var/www/html/ 4. [root@localhost ~]# kill $(cat /var/run/rsyncd.pid) //关闭rsyncd服务 5. [root@localhost ~]# rsync --daemon //开启rsyncd服务
客户端执行脚本
[root@localhost ~]# /opt/inotify_rsync.sh
打开一个客户机终端切换到/var/www/html目录下,执行添加、删除文件等操作。
1. [root@localhost html]# ls 2. a.txt 3. [root@localhost html]# touch b.txt
分别在执行前后查看服务器端的/var/www/html目录
1. [root@localhost html]# ls 2. 1.txt 3. [root@localhost html]# ls 4. a.txt b.txt