做者:JackTian
微信公众号:杰哥的IT之旅(ID:Jake_Internet)html
一、什么是 Rsync?
Rsync 是一个开源的快速备份工具,是Linux和UNIX操做系统默认安装的组件之一,可在不一样主机间镜像同步整个目录,并支持增量备份文件传输,保持连接和权限,采用优化的同步算法,传输前执行压缩,适用于异地备份,镜像服务器等应用。linux
Rsync 官网地址:https://rsync.samba.org/算法
二、配置 rsync 源服务器
在远程同步任务中,负责发起 rsync 同步操做的客户端称为发起端,负责响应来自客户端的 rsync 同步操做的服务器称为同步源。安全
同步过程当中,同步源负责提供文档的原始位置,发起端应对该位置具备读取权限。bash
关闭iptables 防火墙和selinux。服务器
# service iptables stop # setenforce 0
将rsync 源服务器和rsync 客户端的/etc/hosts配置文件解析成同样的,以下配置。微信
# tail -2 /etc/hosts 192.168.31.108 linuxserver.com 192.168.31.226 linuxclient.com
配置/etc/rsyncd.conf文件并发
# vi /etc/rsyncd.conf ### This is rsyncd.conf ### By 微信公众号:杰哥的IT之旅(ID:Jake_Internet) uid = rsync // 使用的用户 gid = rsync // 使用的用户 use chroot = no // 是否使用根目录锁 若是"use chroot"指定为true,那么 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样作的缘由是实现额外的安全防御,可是缺点是须要以 roots 权限,而且不能备份指向外部的符号链接所指向的目录文件。默认状况下 chroot 值为 true。 max connections = 2000 // 指定该模块的最大并发链接数量以保护服务器,超过限制的链接请求将被告知随后再试,默认值是 0,也就是没有限制。 timeout = 600 // 经过该选项能够覆盖客户指定的IP超时时间。经过该选项能够确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来讲,一个理想的数字是600。 pid file = /var/run/rsyncd.pid // 存放进程 ID 的文件位置 lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log // 日志文件位置 ignore errors read only = false // 是否为只读 list = false hosts allow = 192.168.31.0/24 // 容许访问的客户端 IP 地址范围 hosts deny = 0.0.0.0/32 // 拒绝访问的客户端 IP 地址范围 auth users = rsync_backup // 受权帐户 secrets file = /etc/rsync.password // 存放帐户信息的数据文件 ################################# [backup] path = /backup
启动rsync服务ssh
这时,在启动 rsync 服务时,会出现如上报错。socket
# rsync --daemon failed to create pid file /var/run/rsyncd.pid: File exists
解决方案:需删除/var/run/rsyncd.pid文件后,并重启rsync服务
# rm -rf /var/run/rsyncd.pid // 删除 rsyncd.pid 文件 # rsync --daemon // 再从新启动 Rsync 服务
建立/etc/rsync.password文件
# echo “rsync_backup:123456” >/etc/rsync.password
查看/etc/rsync.password文件,是否成功,并调整文件权限。
rsync_backup:123.com
监听服务端口。
# pgrep rsync 5081 5125 # netstat -lntup|grep rsync tcp 0 0 192.168.31.108:873 0.0.0.0:* LISTEN 5081/rsync tcp 0 0 :::873 :::* LISTEN 5125/rsync
建立rsync须要使用对的真实用户
# useradd -s /sbin/nologin -M rsync # id rsync uid=500(rsync) gid=500(rsync) 组=500(rsync)
建立rsync推送须要的目录
# mkdir /backup # chown -R rsync.rsync /backup/
三、使用 Rsync 备份工具
rsync 命令的基本用法
大多数的备份程序要求指定原始位置、目标位置,rsync 命令其实跟 cp 命令类似。
好比:将文件/etc/fstab、目录/boot/grub同步备份到/opt目录下。
-r:选项表示递归整个目录、-l:选项表示备份连接文件。
# rsync /etc/fstab /opt # rsync -rl /etc/fstab /boot/grub /opt
rsync 命令格式
基本格式:rsync [选项] 原始位置 目标位置
rsync 命令经常使用备份选项
-r:递归模式,包含目录及子目录中的全部文件。
-l:对于符号连接文件仍复制为符号连接文件。
-v:显示同步过程的详细信息。
-a:归档模式,保留文件的权限、属性等信息,组合选项等于-rlptgoD。
-z:在传输文件时进行压缩。
-p:保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属组标记。(仅超级用户使用)
-o:保留文件的属主标记。(仅超级用户使用)
-H:保留硬链接文件。
-A:保留 ACL 属性信息。
-D:保留设备文件及其余特殊文件。
-- delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
配置源的表示方法
执行远程同步任务时,rsync 命令需指定同步源服务器中的资源位置。
两种表示方法
用户名@主机地址::共享模块名(两个冒号分隔形式)
使用真实用户测试rsync服务
若是ssh端口修改了,需加上端口。
命令格式:rsync -参数 文件 -e ‘ssh -p 端口号’ 用户名@ip:目录路径
# rsync -avz abc '-e ssh -p 22' root@linuxserver.com:/tmp // 实操命令格式 root@linuxserver.com's password: //输入 linuxserver 设备的 root 密码 sending incremental file list abc sent 64 bytes received 31 bytes 27.14 bytes/sec total size is 0 speedup is 0.00 # ll /tmp // 查看同步结果 总用量 52 -rw-r--r--. 1 root root 0 12月 30 07:25 abc
在实际生产环境中的备份工做,一般都是重复性的,那么咱们能够设置个定时任务来完成备份操做。好比:天天凌晨04:00对服务器的tmp共享模块同步,并下载到本地/mnt/jacktian目录下,经过crond服务来完成。
这种同步过程当中,咱们不想输入密码,那么需建立一个密码文件,保存rsync_backup用户的密码。
# cat /etc/rsync.password rsync_backup:123.com # chmod 600 /etc/rsync.password # ll /etc/rsync.password -rw-------. 1 root root 21 12月 30 08:04 /etc/rsync.password
在执行 rsync 同步时使用选项--password-file=/etc/rsync.password指定。
# crontab -e 00 04 * * * /usr/bin/rsync -az --delete --password-file=/etc/rsync.password@rsync_backup@192.168.31.108::tmp /mnt/jacktian # service crond restart # chkconfig crond on
四、配置 rsync+inotify 实时同步
Linux 从 2.6.13 版内核开始提供了 inotify 通知接口,用来监控文件系统的各类变化状况,如文件的存取,删除,移动,修改等。利用这个机制,可实现文件异动警告,增量备份,针对目录或文件的变化及时作出响应。
rsync+inotify 能够实现触发式备份,只要原始位置的文档发生变化,则当即启动增量备份,不然处于静默等待状态,避免了按固定周期备份时存在的延迟性,周期过密等问题。
inotify 主要作本机监控,在触发式备份应用中更适合上行同步。
inotify 机制提供了三个调控参数
max_queued_events:表示监控事件队列
max_user_instances:最多监控实例数
max_user_watches:每一个实例最多监控文件数
# cat /proc/sys/fs/inotify/max_queued_events 16384 # cat /proc/sys/fs/inotify/max_user_instances 128 # cat /proc/sys/fs/inotify/max_user_watches 8192
调整 inotify 内核参数
当要监控的目录,文件数量较多或者变化频繁时,建议加大这三个参数的值。
# vi /etc/sysctl.conf fs.inotify.max_queued_events = 16384 fs.inotify.max_user_instances = 1024 fs.inotify.max_user_watches = 1048576 # sysctl -p
安装 inotify-tools
安装 inotify-tools 主要提供inotifywait,inotifywatch 等工具,用来监控,汇总改动状况。
# tar zxf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure && make && make install
以监控网站目录/var/www/html为例,执行inotifywait命令后,在另一个终端中改动/var/www/html目录下的内容。
-e:指定要监控的事件
-m:表示持续监控
-r:表示递归整个目录
-q:简化输出信息
# mkdir /var/www/html -p # inotifywait -mrq -e modify,create,move,delete /var/www/html/
另外一个终端:在/var/www/html/目录下添加文件、移动文件、跟踪屏幕输出结果。
# mkdir /var/www/html/a # mkdir /var/www/html/b # mv /var/www/html/b /var/www/html/bb # rm -rf /var/www/html/a
inotifywait 可监控 modify(修改),create(建立),move(移动),delete(删除),attrib(属性更改)等各类事件,一有变更当即输出结果。可用于收集系统变更状况,并在运行结束后输出汇总的变化状况。
# inotifywait -mrq -e modify,create,move,delete /var/www/html/ fy,create,move,delete /var/www/html/ /var/www/html/ CREATE,ISDIR a /var/www/html/ CREATE,ISDIR b /var/www/html/ MOVED_FROM,ISDIR b /var/www/html/ MOVED_TO,ISDIR bb /var/www/html/ DELETE,ISDIR a
编写触发式同步脚本
inotifywait输出的监控结果中,每行记录中包括目录,事件,文件,可识别变更状况,只要检测到有变更时执行rsync上行同步操做。
注意:当更新频繁时,避免并发执行rsync备份,若rsync进程已经存在,则忽略本次同步,或者根据rsync进程数量来决定是否同步
脚本用来测试本机/var/www/html目录的变更,一旦有更新,将触发rsync同步操做,并上传至服务器192.168.31.108的/var/www/html目录下。
触发式上行同步验证过程
一、使用rsync工具执行一次上行同步;
二、在本机运行bak_transfer.sh脚本;
三、在本机的/var/www/html目录下,执行建立,删除,修改等操做;
四、查看服务器中的/var/www/html目录中的变化;
# vi bak_transfer.sh # This is bak_transfer.sh # 微信公众号:杰哥的IT之旅(ID:Jake_Internet) #!/bin/bash INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/" RSYNC_CMD="rsync -azH --delete /var/www/html/ rsync_backup@192.168.31.108:/var/www/html" $INOTIFY_CMD | while read DIRECTORY EVENT FILE do if [ $(pgrep rsync | wc -l) -le 0 ] then $RSYNC_CMD fi done # chmod +x bak_transfer.sh # ./bak_transfer.sh # echo "/bin/bash /root/bak_transfer.sh" >> /etc/rc.local
Rsync 启动异常解决方案概括
报错:failed to create pid file /var/run/rsyncd.pid: File exists
解决:rm /var/run/rsyncd.pid
启动服务:rsync --daemon --config=/etc/rsyncd.conf
报错:rsync: failed to connect to IP 地址: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
解决:启动服务:rsync --daemon --config=/etc/rsyncd.conf
报错:rsync: failed to connect to IP 地址: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
解决:多是 iptables 防火墙开启致使没法通讯,能够设置规则放行873端口或者直接关闭防火墙。
报错:@ERROR: chroot failedrsync: connection unexpectedly closed (75 bytes read so far)rsync error: error in rsync protocol data stream (code 12) at io.c(150)解决:rsync.conf 中设置的 path 路径不存在,需新建目录。