Rsync基本概述

Rsync基本概述
rsync是一款开源的备份工具,可以在不同主机之间进行同步,可实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合用于架构集中式备份或异地备份等应用。
rsync官方地址:传送门
rsync监听端口:873
rsync运行模式:C/S

常见的备份有如下几种方式

完全备份
增量备份
差异备份

假设客户端上有file1 file2 file3文件,服务端上有file1文件,现要将客户端上的数据备份至服务端

完全备份,将客户端所有的数据内容file1 file2 file3全部备份至服务端 (效率低下, 占用空间)

增量备份,将客户端的file2 file3增量备份至服务端 (提高备份效率,节省空间, 适合异地备份 )
2.Rsync应用场景
关于数据同步的两种方式
推:一台主机负责把数据推送至其他主机,服务器开销大。(适合推送少量主机)
拉:所有主机定时去找一主机拉数据。可能会导致数据同步缓慢。

3.Rsync传输模式
Rsync大致使用三种主要的数据传输方式

本地方式
远程方式
守护进程

//Local: 本地传输
rsync [OPTION...] SRC... [DEST]

Access via remote shell: 远程通道传输
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon: 守护进程方式传输
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: 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 //让目标目录和源目录数据保持一致
1.本地传输方式: 单个主机本地之间的数据传输(此时类似于cp命令)

Local: rsync [OPTION...] SRC... [DEST]
rsync ---数据备份命令
[OPTION...] ---命令相关参数
SRC... ---要进行本地备份的数据信息
[DEST] ---把数据备份到本地什么位置

//同步hosts文件置tmp目录相当于cp命令
[root@nfs01 ~]# rsync -avz /etc/hosts /tmp/

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

Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

拉(下载)
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync ---命令
[OPTION...] ---选项
[USER@] ---远程主机用户(系统用户)
HOST: ---远程主机地址
SRC... ---远程主机数据
[DEST] ---将远程主机数据备份至本地什么位置

推(上传)
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync ---命令
[OPTION...] ---选项
SRC... ---本地文件或目录
[USER@] ---远程主机用户(系统用户)
HOST: ---远程主机地址
[DEST] ---本地数据备份至远端什么目录

//push: 推送本地数据至backup服务器(上传)
[root@nfs01 ~]# rsync -avz /etc/hosts [email protected]:/etc/hosts

//pull 拉取backup服务器数据至本地(下载)
[root@nfs01 ~]# rsync -avz [email protected]:/etc/hosts /etc/hosts
3.守护进程传输方式: rsync自身非常重要的功能(不使用系统用户,更加安全)

Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync ---命令
[OPTION...] ---选项
[USER@] ---远程主机用户(虚拟用户)
HOST:: ---远程主机地址
SRC... ---远程主机模块(不是目录)
[DEST] ---将远程主机数据备份至本地什么位置

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync ---命令
[OPTION...] ---选项
SRC... ---远程主机模块(不是目录)
[USER@] ---远程主机用户(虚拟用户)
HOST:: ---远程主机地址
[DEST] ---将远程主机模块备份至本地什么位置

//将本地数据推送至backup服务器
rsync -avz /mnt/ [email protected]::backup/ --password-file=/etc/rsync.password

//将backup服务器数据拉至本地服务器
rsync -avz [email protected]::backup/ /mnt/ --password-file=/etc/rsync.password
4.Rsync服务实践
角色 外网IP(NAT) 内网IP(LAN) 主机名
Rsync服务端 eth0:10.0.0.41 eth1:172.16.1.41 backup
Rsync客户端 eth0:10.0.0.31 eth1:172.16.1.31 nfs
1.第一个里程碑,安装rsync软件

[root@backup ~]# yum -y install rsync
//检查是否安装成功
[root@backup ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64
2.第二个里程碑,配置/etc/rsyncd.conf

[root@backup ~]# cat /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
#hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

[root@backup ~]# vim /etc/rsyncd.conf

全局模块

uid = rsync # 运行进程的用户
gid = rsync # 运行进程的用户组
port = 873 # 监听端口
use chroot = no # 关闭假根功能
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
hosts allow = 172.16.56.0/24 # 允许某个IP或网段访问
hosts deny = 0.0.0.0/32 # 拒绝某个网段或IP访问
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.password # 定义rsync服务用户连接认证密码文件路径

##局部模块
[backup] # 定义模块信息
comment = commit # 模块注释信息
path = /backup # 定义接收备份数据目录
3.第三个里程碑,建立虚拟用户并授权对应目录

//创建rsync账户,不允许登录不创建家目录
[root@backup ~]# useradd -M -s /sbin/nologin rsync

//创建备份目录(尽可能磁盘空间足够大),授权rsync用户为属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
4.第四个里程碑,创建虚拟用户密码文件

//创建虚拟用户和密码,并赋予600权限
[root@backup ~]# echo "rsync_backup:xuliangwei" >/etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
5.第五个里程碑,启动rsync服务,并加入开机自启

[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

启动后检查对应端口
[root@bogon ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4758/rsync
6.Rsync客户端配置, 配置密码并设置权限

方式一:适合终端执行指定用户密码文件
[root@nfs01 ~]# yum install rsync -y
[root@nfs01 ~]# echo "xuliangwei" > /etc/rsync.password
[root@nfs01 ~]# chmod 600 /etc/rsync.password

方式二:适合写脚本,强烈推荐方式
[root@nfs01 ~]# export RSYNC_PASSWORD=123456
实战一: 客户端推送数据至Rsync服务端

[root@nfs01 ~]# rsync -avz /backup/ [email protected]::backup/ --password-file=/etc/rsync.password
实战二: 客户端拉取Rsync服务端数据至本地

[root@nfs01 ~]#rsync -avz [email protected]::backup /backup/ --password-file=/etc/rsync.password
实战三: Rsync实现数据无差异同步

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

//推送数据至远端:本地与远端保持一致, 本地没有远端会被删除, 造成服务器端数据丢失
[root@nfs01 ~]# rsync -avz --delete /data/ [email protected]::backup/ --password-file=/etc/rsync.password
5.Rsync定时备份
//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_Datefile=$(date +%H%M)
Client_Desc_DIR="$Client_BackupDIR"/"$ClientHost""$ClientIP""$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/cronroot$Client_Date_file
/bin/cp /etc/fstab $Client_Desc_DIR/etcfstab$Client_Date_file
/bin/cp /etc/rc.d/rc.local $Client_Desc_DIR/etcrc.local$Client_Date_file

##rsync
rsync -avz $Client_BackupDIR/ $Server_User@$Server_IP::$Server_mode/ --password-file=$Server_pass
6.Rsync备份项目案例
已知 3 台服务器主机名分别为 web01、backup 、nfs,主机信息见下表:

角色 外网IP(NAT) 内网IP(LAN) 主机名
WEB服务器 eth0:192.168.56.11 eth1:172.16.56.11 web01
NFS存储服务器 eth0:192.168.56.12 eth1:172.16.56.12 nfs01
Rsync备份服务器 eth0:192.168.56.13 eth1:172.16.56.13 backup
要求:
每天晚上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)评分标准见表:

ID 分数 项目
1 20分 完成服务端 rsync 服务搭建
2 10分 完成客户端 rsync 命令推送到服务端
3 20分 完成客户端本地打包及校验脚本。
4 10分 完成客户端定时任务配置。
5 15分 完成服务端数据完整性检查及清理脚本
6 10分 完成服务端定时执行脚本。
7 15分 实现每日邮件发送结果给管理员
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/ [email protected]::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" [email protected] <$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/mailbody$(date +%F).txt

mail -s "$(date +%U%T) back" [email protected] </tmp/mailbody$(date +%F).txt
配置邮箱

// (在末行加入如下命令)
[root@backup /]# vim /etc/mail.rc
set [email protected]
set smtp=smtps://smtp.qq.com:465
set [email protected]
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个月模拟一次,半年演练一次?
这里牵扯到备份有效性和备份时效性的一个校验。

万一备份服务器挂了怎么办?
备份之后是否还有备份

猜你喜欢

转载自blog.51cto.com/13855748/2170914
今日推荐