1.Rsync基本概述

Rsync是开源多功能同步工具,支持多种操作系统,
Rsync支持本地复制(优于scp,cp)与远程同步
Rsync支持全量备份, 增量备份,
Rsync基于C/S架构, 默认监听tcp873端口

Rsync官网

Rsync优点:

支持增量备份, 第一次全量备份, 第二次增量备份:边复制, 边比较, 边统计, 传输效率很高。
数据集中备份, 客户端可以推送数据至服务端, 也可以从服务端获取数据, 以客户端为参照物.
保持文件属性, 符号链接, 硬链接, 权限, 时间等。
安全方式传输, rsync本生不对数据加密, 使用ssh作为传输端口。
指定排除文件, 排除无需同步的文件或目录。
进程方式同步, rsync运行在C/S架构, 通过进程方式传输文件或数据。

Rsync缺点:

大量小文件同步会比较慢, 需要比对较长时间, 有可能会造成Rsync进程停止,
解决思路: 将小文件进行打包, 然后在同步, 减少比对时间, 传输效率更高。
同步大文件会出现中断情况, 而且长时间同步会造成网络资源被耗尽
解决思路: 配置限速同步, 未同步完之前修改为隐藏文件,同步完成后修改为正常文件.

2.Rsync命令详解

Rysnc命令格式
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
Rsync常用选项
参数选项        选项说明
-a           //归档模式传输, 等于-tropgDl
-v           //详细模式输出, 打印速率, 文件数量等
-z           //传输时进行压缩以提高效率
-r           //递归传输目录及子目录,即目录下得所有目录都同样传输。
-t           //保持文件时间信息
-o           //保持文件属主信息
-p           //保持文件权限
-g           //保持文件属组信息
-l           //保留软连接
-P           //显示同步的过程及传输时的进度等信息
-D           //保持设备文件信息
-L          //保留软连接指向的目标文件
-e           //使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN   //指定排除不需要传输的文件模式
--exclude-from=file //文件名所在的目录文件
--bwlimit=100       //限速传输
--partial           //断点续传
--delete            //让目标目录和源目录数据保持一致

Rsync传输模式:

Rsync大致使用三种主要的传输数据的方式:
本地传输local
远程通道传输remote shell
守护进程传输daemon

1.本地传输方式: 单个主机本地之间的数据传输(此时类似于cp命令)

//同步hosts文件置tmp目录相当于cp命令
[root@nfs01 ~]# rsync -avz /etc/hosts /tmp/
//利用Rsync实现删除文件和目录的功能,相当于rm命令
[root@nfs01 ~]# mkdir /null
[root@nfs01 ~]# rsync -avz --delete /null/ /tmp/

2.远程通道传输方式: 通过ssh通道传输数据,类似scp命令

//push:推送本地数据至远端(上传)
[root@rsync-clientA ~]# rsync -avz -e 'ssh -p22' /etc/hosts  root@192.168.56.11:/etc/hosts
//pull:拉取远端数据至本地(下载)
[root@rsync-clientB ~]# rsync -avz -e 'ssh -p22' root@192.168.56.11:/etc/hosts /etc/hosts

3.守护进程传输方式: rsync自身非常重要的功能

//将本地数据推送至backup服务器
rsync -avz /mnt/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password
//将backup服务器数据拉至本地服务器
rsync -avz rsync_backup@172.16.56.11::backup/ /mnt/ --password-file=/etc/rsync.password

3.Rsync同步实践

Rsync服务端
1.Rysnc服务端配置, 安装rsync软件

//yum安装rsync
[root@backup ~]# yum -y install rsync
//检查是否安装成功
[root@backup ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

2.Rysnc服务端配置, /etc/rsyncd.conf

[root@backup ~]# vim /etc/rsyncd.conf
##rsyncd.conf start##
uid = rsync
gid = rsync
port = 873
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
address = 172.16.56.11
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[backup]
path = /backup
//配置文件详解:
##rsyncd.conf start##
uid = rsync                     //以rsync用户身份来传输数据
gid = rsync                     //以rsync用户组身份来传输数据
port = 873                      //监听端口默认为873
use chroot = no                 //程序出现问题就会开启 开启给个空目录就行
max connections = 2000          //指定最大可连接的客户端数
timeout = 600                   //超时
pid file = /var/run/rsyncd.pid  //进程pid存放
lock file = /var/run/rsync.lock //锁文件
log file = /var/log/rsyncd.log  //日志文件
ignore errors                   //忽略错误
read only = false               //可读写
list = false                    //不允许列出模块名
address = 172.16.56.11          //监听内网服务端地址,同步安全优化操作
hosts allow = 172.16.56.0/24   //允许那个地址段访问
hosts deny = 0.0.0.0/32         //拒绝 一般不使用
auth users = rsync_backup       //验证时的虚拟用户, 与系统用户无关
secrets file = /etc/rsync.password  //指定密码文件
[backup]                        //模块名称, 自定义
path = /backup                  //指定该模块对应哪个目录
[data]                           //模块名称, 自定义
path = /data                    //指定该模块对应哪个目录

3.Rysnc服务端配置, 建立虚拟用户,并授权

//创建rsync账户不允许登录不创建家目录
[root@backup ~]# useradd -M -s /sbin/nologin rsync
//创建备份目录(尽可能磁盘空间足够大),授权rsync用户为属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/

4.Rysnc服务端配置, 创建密码文件

//创建虚拟用户和密码,并赋予600权限
[root@backup ~]# echo "rsync_backup:xuliangwei" >/etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password

5.Rysnc服务端配置启动

//启动命令
[root@backup ~]# rsync --daemon
//编写启动脚本
#!/bin/bash
source /etc/init.d/functions
function start() {
  rsync_pid_dir=/var/run/rsyncd.pid
     if [ ! -f /var/run/rsyncd.pid ];then
    /usr/bin/rsync --daemon
    action "rsync is daemon" /bin/true
    else
    action "rsync is start" /bin/false
        exit 1
    fi
}
function stop (){
 kill_pid=$(ps aux|grep rsync|grep -v grep|awk '{print $2}')
 proce_pid=$(ps aux|grep rsync|grep -v grep|wc -l)
    if [ "$proce_pid" -eq 0 ];then
    action "rsync is no start" /bin/false
    else
    /bin/kill -9 $kill_pid &>/dev/null
    rm -f /var/run/rsyncd.pid &>/dev/null
    action "rsync is off" /bin/true
    fi
}
case $1 in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    stop
    start
    ;;
    *)
    echo "USAGE: start|stop|restart"
esac
//加入Rsync开机启动
[root@backup ~]#echo "rsync --daemon" >>/etc/rc.local
注意:启动后需要检查对应进程和端口

Rsync客户端
1.Rsync客户端配置, 配置密码并设置权限

//1.安装rsync
[root@nfs01 ~]# yum install rsync -y

//2.创建虚拟用户对应密码, 并赋予600安全权限
[root@nfs01 ~]#  echo "xuliangwei" >/etc/rsync.password
[root@nfs01 ~]# chmod 600 /etc/rsync.password

//3.推送数据给rsync服务端
 [root@nfs01 ~]# rsync -avz /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

//4.拉取rsync服务端数据至本地
[root@nfs01 ~]#rsync -avz rsync_backup@172.16.56.11::backup /backup/ --password-file=/etc/rsync.password

无差异备份数据

//拉取远端数据:远端与本地保持一致,远端没有本地有会被删除, 造成客户端数据丢失
[root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.56.12::backup/ /data/ --password-file=/etc/rsync.password
//推送数据至远端:本地与远端保持一致, 本地没有远端会被删除, 造成服务器端数据丢失
[root@nfs01 ~]# rsync -avz --delete /data/ rsync_backup@172.16.56.12::backup/ --password-file=/etc/rsync.password

定时备份数据

//Rsync配合crond定时推送数据
[root@nfs-server scripts]# vim rsync_crond_backup.sh
#!/bin/bash
### Client
Client_BackupDIR=/backup-A
Client_Host=$(hostname)
Client_IP=$(/sbin/ifconfig eth1|awk 'NR==2'|awk '{print $2}'|awk -F ':' '{print $2}')
Client_Date=$(date +%F)
Client_Date_file=$(date +%H_%M)
Client_Desc_DIR="$Client_BackupDIR"/"$Client_Host"_"$Client_IP"_"$Client_Date"
###Server
Server_User=rsync_backup
Server_IP=172.16.56.11
Server_mode=backup/
Server_pass=/etc/rsync.password
###command
mkdir -p $Client_Desc_DIR
/bin/cp /var/spool/cron/root $Client_Desc_DIR/cron_root_$Client_Date_file
/bin/cp /etc/fstab $Client_Desc_DIR/etc_fstab_$Client_Date_file
/bin/cp /etc/rc.d/rc.local $Client_Desc_DIR/etc_rc.local_$Client_Date_file
##rsync
rsync -avz $Client_BackupDIR/ $Server_User@$Server_IP::$Server_mode/ --password-file=$Server_pass 

排除文件备份数据

排除单个文件:
rsync -avz --exclude=a /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password
//排除多个文件:
rsync -avz --exclude={a,b} /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password
rsync -avz --exclude=a  --exclude=b /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password 
rsync -avz --exclude={a..g} /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password
rsync -avz --exclude-from=paichu.log /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

4.Rsync故障处理

Rsync服务端排错思路

0.关闭防火墙以及selinux
1.确认配置文件/etc/rsyncd.conf
2.配置允许网段以及对应的模块
3.创建对应的备份目录,并设定rsync用户权限
4.启动rsync服务以后台运行,检查进程和端口tcp/873
5.建立虚拟账户和密码,权限600

Rsync客户端排错思路

1.网络是否能通,telnet端口是否正常
2.配置文件密码是否正确,权限设定600, 注意:只需要密码,并且和服务端的密码一致。
3.推送和拉取数据时, 模块前加双冒号

5.Rsync+Inotify实践

Rsync实现对远程服务器数据的增量备份, 但Rsync自身也有瓶颈, rsync同步数据时采用核心算法对远程服务器的目标文件进行比对, 只同步差异文件。如果服务器的文件数量达到百万或千万级别, 文件对比将会非常消耗时间, 而且往往只是其中很少一部分数据发生变化, 这样同步就显得非常低效, Inotify的出现,当好可以缓解Rsync的不足。

Inotify是异步的文件系统事件监控机制,Linux从2.6.13内核起,加入了Inotify的支持。

Inotify可以监控文件系统中添加、删除、修改、移动等事件,利用这个内核接口,第三方软件就可以监控文件系统中发生变化的文件, 而inotify-tools正是实施这样监控的软件。
(国人周洋在金山公司开发sersync)

Inotify实际是一种事件驱动机制,它为应用程序监控文件系统时间提供了实时响应事件的机制,而无须通过诸如cron等得轮询机制来获取事件。

crond机制无法做到实时性, 同时也消耗大量系统资源。
相比之下,inotify基于事件驱动,可以做到对事件实时处理及响应,也没有轮询造成的系统资源消耗。
特别说明,下面的inotify配置是建立在rsync服务基础上的配置过程。
环境准备

Rsync配置参考Rysnc实战, 通过客户端验证rsync推送数据, 然后配置inotify服务

//验证客户端与服务端正常同步
rsync -avz /backup rsync_backup@172.16.56.12::backup/ --password-file=/etc/rsync.password

1.客户端配置, 安装inotify

//查看当前系统是否支持inotify
[root@lamp1 ~]# uname -r 
2.6.32-504.el6.x86_64
[root@lamp1 ~]# ls -l /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_queued_events
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_user_instances
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_user_watches
//配置epel源,安装inotify
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo   
[root@web01 ~]# yum -y install inotify-tools

2.客户端配置, 配置并优化inotify

//修改inotify内核参数(inotify默认内核参数值太小)
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_watches = 8192
fs.inotify.max_user_instances = 128
修改参数为:
cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
EOF

//参数说明:
max_queued_events:inotify队列最大长度,如果值太小,会出现”** Event Queue Overflow **”错误,导致监控文件不准确
max_user_watches:要同步的文件包含多少目录,可以用:find /home/xuliangwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/xuliangwei.com为同步文件目录)
max_user_instances:每个用户创建inotify实例最大值
注意:inotify在实际生产环境中,对于50-200KB的文件,inotify的最发并发量为200-300,如果客户端写入速度大于这个量,将会造成短暂的延迟

3.客户端配置, Inotify工具集介绍, 验证inotify同步测试

[root@xuliangwei ~]# rpm -ql inotify-tools
/usr/bin/inotifywait    //监控文件或目录的变化。
/usr/bin/inotifywatch   //统计文件系统访问次数。
inotifywait命令常用参数
-m      持续监视变化
-r      递归形式监视目录
-q      打印需要的信息
-e      指定监视事件
--timefmt 自定义时间格式,常用参数'%y/%m/%d %H:%M'
--format 自定义输出格式信息, 常用的格式符如下:
%e: 使用了什么事件
%T: 时间
%w:显示被监控文件的文件名;
%f:如果发生某事件的对象是目录,则显示被监控
//监听事件列表
open    打开, 文件或目录被打开
access  访问, 读取文件。
modify  修改, 文件内容被修改。 
attrib  属性, 文件元数据被修改。 
create  创建, 创建文件或目录。
open    打开, 对文件进行打开操作。 
close   关闭, 对文件进行关闭操作。
delete  删除, 文件或目录被删除。
move     移动, 对文件进行移动操作。
moved_to 移动, 文件或目录移动到当前目录
moved_from 移动, 文件或目录从当前目录移动至其他目录

4.客户端配置, 使用inotify实时监控文件或目录变化

inotifywait -mrq  --format '%e %T %w%f' --timefmt '%y/%m/%d %H:%M'  -e close_write,modify,delete,create,attrib,move /backup/

5.客户端配置, 建立inotify实时同步脚本

//实时触发inotify进行同步(sh inotify.sh &  //后台执行)
[root@lamp1 ~]# vim /soft/scripts/inotify.sh
#!/bin/bash
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e create,close_wait,delete /backup\
|while read line
do
        [ ! -e "$line" ]&& continue
        rsync -az --delete $line rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password
done

6.客户端配置, 配置inotify开机自动运行

[root@lamp1 ~]# echo "/bin/sh /soft/scripts/inotify.sh &" >> /etc/rc.d/rc.local
 [root@lamp1 ~]# tail -1 /etc/rc.d/rc.local
/bin/sh /server/scripts/inotify.sh
附目录: 源码安装inotify
[root@lamp1 tools]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@lamp1 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.1.4        
[root@lamp1 inotify-tools-3.14]# make && make install 
[root@lamp1 ~]# ln -s /usr/local/inotify-tools-3.1.4/ /usr/local/inotify-tools

6.Rsync数据备份案例

已知 3 台服务器主机名分别为 web01、backup 、nfs,主机信息见下表:

要求:
每天晚上01点整在 Web 服务器上打包备份系统配置文件、日志文件、其他目录 并通过rsync命令推送备份服务器backup上备份保留
备份思路:
所有服务器在本地按日期打包, 然后再推到备份服务器backup上
具体要求如下:
1)所有服务器的备份目录必须都为/backup。
2)备份的系统配置文件包括但不限于:
//配置文件
/etc/rc.local //开机自启动配置文件
/etc/fstab //设备挂载配置文件
/etc/hosts //本地内网配置文件
//重要目录
/var/spool/cron/ //cron定时任务
/etc/firewalld //firewalld防火墙
/soft/scripts //脚本目录
系统日志文件
/var/log/ //系统安全日志、sudo日志、内核日志、rsyslog日志
应用程序日志
/soft/log/nginx
/soft/log/mysql
/soft/log/php
/soft/log/tomcat
…..
//自己思考下还有什么需要备份的?
3)Web服务器本地保留最近7天的数据, 避免浪费磁盘空间
4)Rsync备份服务器上,其它要保留6个月的数据副本。
5)客户端服务器推送数据, 以主机名IP地址当前时间作为目录, 所有的备份数据存放至该目录下 nfs-server_192.168.69.112_2018-03-28/
6)确保备份的数据完整,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中。
7)真实工作中除了服务器之间备份, 可能还会需要异地备份,这个地方请大家思考如何异地备份。
8)评分标准见表:

1.搭建rsync
##backup  create-rsync-server.sh
mkdir -p /soft/scripts
vim /soft/scripts/create-rsync-server.sh
#!/bin/sh
useradd rsync  
mkdir –p /backup
chown rsync.rsync /backup
cat >> /etc/rsyncd.conf <<EOF
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
path = /backup
EOF
cat >> /etc/rsync.password <<EOF
rsync_backup:xuliangwei
EOF
chmod 600 /etc/rsync.password
####rsync server start###
rsync --daemon
echo "rsync --daemon" /etc/rc.local
//客户端
cat >> /etc/rsync.password <<EOF
xuliangwei
EOF
chmod 600 /etc/rsync.password
//在backup上部署rsync, 并且在客户端上可以推送成功。
2.客户端上建立备份脚本
IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
if [ $(date +%w) -eq 0 ]
then
   Date="week$(date +%F-%w -d "-1day")
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir $Path/$IP -p
cd / &&\
/bin/tar czf $Path/$IP/backup_$Date.tar.gz var/spool/cron/root   etc/rc.local  etc/sysconfig/iptables var/www/html app/logs &&\
md5sum $Path/$IP/backup_$Date.tar.gz > $Path/$IP/flag_$Date &&\
rsync -az /backup/ rsync_backup@10.0.0.100::backup/ --password-file=/etc/rsync.password &&\
#del
find $Path/ -type f -mtime +7 \(-name "*.log" -o -name "*.tar.gz"\)| xargs rm –f
//3.配置定时任务
Server端backup脚本
IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
if [ $(date +%w) -eq 0 ]
then
   Date="week$(date +%F-%w -d "-1day")
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir $Path/$IP -p
LANG=en
find /backup/ -type f -name "*${Date}*.log"|xargs md5sum -c >>$Path/${Date}_result.log 2>&1 &&\
mail -s "$Date bak result" xxx@163.com <$Path/${Date}_result.log
find $Path/ -type f -mtime +180 ! -name "*_week*_6*" | xargs rm -f
//check.sh
find /backup -type f -name "flag_$(date +%F)" |xargs md5sum -c |grep FAILED &> /tmp/mail_body_$(date +%F).txt
mail -s "$(date +%U%T) back" 552408925@qq.com </tmp/mail_body_$(date +%F).txt

配置邮箱

// (在末行加入如下命令)
[root@backup /]# vim /etc/mail.rc
set from=552408925@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=552408925@qq.com
set smtp-auth-password=
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

备份思考
1.要备份什么?

WEB APP部署程序配置文件
MYSQL数据库部署程序及其配置文件
MySQL数据文件
MySQK的binlog日志、慢查询日志、错误日志
系统的安全日志、内核的日志、sudo日志、rsyslog日志
应用程序日志  access.log  error.log
静态数据文件
//备份目录如何规划,如果之前备份规划是这个样子的?
/usr/local/nginx
/opt/mysql
/etc/php
/etc/my.cnf
//如果服务器规划是这个样子
/soft/webapp/nginx
/soft/webapp/apache
/soft/webapp/tomcat
/soft/scripts/crond_nginx.sh
/soft/scripts/crond_rsync.sh
/data/mysql/mysql3306/{data,logs,conf,tmp}
/data/mysql/mysql3307/{data,logs,conf,tmp}
/data/mysql/mysql3308/{data,logs,conf,tmp}

思考2:如何备份?

1.根据时间维护划分
    实时备份(同步备份)
    非实时备份(异步备份)

2.根据地域划分
    同IDC备份部署
    跨IDC备份部署
        本地->云主机->异地主机

备份3:备份可恢复性?

时间成本
维护成本

备份4:备份策略

备份保留时间? 1个月, 1年或永久?
备份恢复校验

1个月模拟一次,半年演练一次?
这里牵扯到备份有效性和备份时效性的一个校验。

万一备份服务器挂了怎么办?

备份之后是否还有备份

文档更新时间: 2019-07-09 12:42   作者:李延召