Rsync基本概述
rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于MacOS/Unix/linux/Windows等多种操作系统平台
全量备份:将所有数据都进行一次备份
增量备份:基于全量备份来说,只给增加的部分做备份
远程文件传输
scp命令
语法及使用方式
scp [选项] [源文件] [用户名@主机]:[位置]
scp -r /etc root@172.16.1.31:/tmp
scp只能全量备份,所以效率较低
服务端口
ssh 22
telnet 23
ftp 21
http 80
DNS 53
https 443
rdp 3389
rsync 873
mysql 3306
redis 6379
rsync官方地址:TP
rsync运行模式:C/S
C/S架构:需要一个客户端和服务端
Rsync的三种传输模式
源文件路径的后面如果加/,就会拷贝源文件路径下面的所有文件
如果不加/,就会拷贝源文件和源文件路径下面所有的文件
Rync的数据同步模式
1.推: 所有主机推送本地数据至Rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
2.拉: rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大
rsync命令的选项
-a:archive 归档拷贝,包含-tropglD
-v:显示拷贝的详细信息
-z:压缩数据拷贝
-r #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t #保持文件时间信息
-o #保持文件属主信息
-p #保持文件权限
-g #保持文件属组信息
-l #保留软连接
-P #显示同步的过程及传输时的进度等信息
-D #保持设备文件信息
-L #保留软连接指向的目标文件
-e #使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--bwlimit=100 #限速传输
--partial #断点续传
--delete #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件
本地方式(类似cp)
单个主机本地之间的数据传输
Local: rsync [OPTION...] SRC... [DEST]
选项 源文件 目标文件
## 拷贝/etc目录到/tmp下
[root@backup ~]# rsync -av /etc /tmp/
## 拷贝/etc/目录下的所有文件到/tmp
[root@backup ~]# rsync -av /etc/ /tmp/
远程方式(类似scp)
通过ssh通道传输数据
Rsync借助SSH协议同步数据存在的缺陷
1.使用系统用户(不安全)
2.使用普通用户(会导致权限不足情况)
Pull:拉
Push:推
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
选项 用户名@主机ip:源文件 目标
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
选项 源文件 用户名@主机ip:目标
#缺点:必须使用系统用户,用root用户还得知道root用户的密码,普通用户又有可能没有权限
## 将172.16.1.31服务器上的/opt目录及下面的所有文件拉到本地的/etc/目录下
rsync -avz root@172.16.1.31:/opt /etc/
## 将本地/etc目录及下面的所有文件远程传输给172.16.1.31服务器的/opt目录下
rsync -avz /etc root@172.16.1.31:/opt
守护进程(C/S结构)
rsync自身非常重要的功能(不使用系统用户,更加安全)
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
选项 用户名@主机ip::模块名 源文件
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
选项 源文件 用户名@主机ip::模块名(目标路径)
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
#选项
-a:归档同步
-v:显示同步的过程
-z:压缩同步(降低同步时占用的网络带宽)
--delete:无差异同步
--password-file=密码文件:指定用户密码文件,免交互
Rsync服务实践
环境准备
主机角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名称 |
---|---|---|---|
Rsync服务端 | 10.0.0.41 | 172.16.1.41 | backup |
Rsync客户端 | 10.0.0.31 | 172.16.1.31 | nfs |
安装rsync
[root@backup ~]# yum -y install rsync
配置rsync
## 查找rsync的配置文件路径,只能查找rpm安装包的信息
[root@backup ~]# rpm -qc rsync
[root@backup ~]$ vim /etc/rsyncd.conf
uid = rsync
#服务启动的用户
gid = rsync
#服务启动的用户组
port = 873
#服务监听的端口
fake super = yes
#假的超级用户,以普通用户身份执行rooy用户能执行的操作
use chroot = no
#禁锢指定的目录,不允许用户跳出到其他目录
max connections = 200
#最大连接数
timeout = 600
#超时时间
ignore errors
#忽略错误提示
read only = false
#只读为false,就是可读可写
list = false
#不允许其他用户查询模块名
auth users = rsync_backup
#虚拟用户,rcync同步需要使用的用户,可随意指定用户
secrets file = /etc/rsync.passwd
#指定存放虚拟用户密码的文件为/etc/rsync.passwd,可随意定义
log file = /var/log/rsyncd.log
#指定srync服务的日志文件存放路径为var/log/rsyncd.log,可随意定义
#--------------------------------------------------------------分割线
[backup]
#模块名,可随意定义
comment = welcome to oldboyedu backup!
#注释,同步的描述信息,随便写
path = /backup
#同步的路径,也就是用户被禁锢的路径
创建启动服务的用户
[root@backup ~]$ useradd rsync -s /sbin/nologin -M
[root@backup ~]$ id rsync
uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
创建虚拟用户的密码文件
[root@backup ~]$ echo 'rsync_backup:123' > /etc/rsync.passwd
#我们创建的是虚拟用户的密码
#密码文件的格式:用户名:密码
[root@backup ~]$ cat /etc/rsync.passwd
rsync_backup:123
rsync要求密码文件的权限必须是600
chmod 600 /etc/rsync.passwd
创建一个同步的路径
mkdir /backup
修改同步路径的属主属主
chown rsync:rsync /backup/
[root@backup ~]$ ll /backup/ -d
drwxr-xr-x. 2 rsync rsync 6 Jul 6 19:23 /backup/
启动rsync服务
[root@backup ~]# systemctl start rsyncd
加入开机自启
[root@backup ~]# systemctl enable rsyncd
验证服务启动(进程,端口)
[root@backup ~]$ ps -ef|grep [r]sync
root 7444 1 0 Jul06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup ~]$ netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7444/rsync
tcp6 0 0 :::873 :::* LISTEN 7444/rsync
客户端操作
需要交互
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup
Password:
#需要输入密码
报错信息排查
报错1.
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup
Password:
@ERROR: auth failed on module bak
rsync error: error starting client-server protocol (code 5) at main.c(1649)
[sender=3.1.2]
排查思路:
1.密码文件的权限不是600
2.密码文件里的密码和手动输入的密码不一致
3.密码文件名字和配置文件中的名字不一致
报错2.
[root@nfs ~]$ rsync -avz /backup/123.txt rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
123.txt
rsync: mkstemp ".123.txt.P2Kfee" (in bak) failed: Permission denied (13)
sent 89 bytes received 120 bytes 139.33 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at
main.c(1179) [sender=3.1.2]
排查思路:
1.没有关闭selinux
2.备份路径的权限不是配置文件中指定的uid权限
报错3.
[root@nfs ~]# rsync -avz /var rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
排查思路:
客户端的密码文件权限必须也是600
免交互操作
# 1.创建密码文件(客户端的密码文件只写密码不写用户)
[root@nfs ~]$ echo '123' > /etc/rsync.passwd
[root@nfs ~]$ chmod 600 /etc/rsync.passwd
[root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
# 2.使用rsync的环境变量
[root@nfs ~]$ export RSYNC_PASSWORD=123
[root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup
无差异同步
#为了保持数据的一致性
[root@nfs ~]$ mkdir /opt/date
[root@nfs ~]$ rsync -avz --delete /opt/date rsync_backup@172.16.1.41::backup
企业中rsync实战案例
环境准备
角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名 |
---|---|---|---|
rsync客户端 | 10.0.0.7 | 172.16.1.7 | web01 |
rsync客户端 | 10.0.0.31 | 172.16.1.31 | nfs |
rsync服务端 | 10.0.0.41 | 172.16.1.41 | backup |
客户端需求
1.客户端提前准备存放的备份的目录,目录格式如下: /backup/nfs_172.16.1.31_2018-09-02
# 在web01和nfs服务器上创建备份目录
[root@nfs ~]$ mkdir /backup
[root@web01 ~]$ mkdir /backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
#打包备份/etc/passwd
mkdir /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)
tar zcf /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz /etc/passwd
3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
4.客户端每天凌晨1点定时执行该脚本
[root@web01 ~]$ crontab -l
00 01 * * * /usr/bin/sh /root/backup.sh &>/dev/null
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /backup ! -mtime -7|xargs rm -f
客户端脚本
#!/bin/bash
#if [ -d /backup ];then
# echo '存在'
#else
# echo '不存在'
#fi
#将/backup目录设置为变量bak_dir
bak_dir=/backup
#将命令$(hostname)设置为变量HOSTNAME
HOSTNAME=$(hostname)
#将主机IP设置为变量IP
IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}')
#将时间命令$(date +%F)设置为变量DATE
DATE=$(date +%F)
#将/backup/主机名_IP_时间 这个格式的目录设置为变量tar_dir
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
#设置临时变量:指定虚拟用户密码为123
export RSYNC_PASSWORD=123
#创建/backup目录
mkdir -p $bak_dir
#递归创建/backup/主机名_IP_时间,这个目录
mkdir -p $tar_dir
#到/etc目录下:为防止tar命令的/报错
cd /etc
#等于tar zcf /backup/主机名_IP_时间/passwd.tgz passwd
tar zcf $tar_dir/passwd.tgz passwd
#等于md5sum /backup/主机名_IP_时间/passwd.tgz > /backup/主机名_IP_时间/md5.check 表示利用md5sum工具给压缩包对应的随机数后,将随机数存放至/backup/主机名_IP_时间目录下的md5.check文件中
md5sum $tar_dir/passwd.tgz > $tar_dir/md5.check
#将/backup目录中的内容备份至服务端,注意$bak_dir/带根了,只复制目录下面的所有内容,不包括目录本身
rsync -az $bak_dir/ rsync_backup@172.16.1.41::backup
#删除/backup目录中7天以前的信息
find /backup ! -mtime -7|xargs rm -f
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
[root@backup ~]$ vim /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
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#--------------------------------------------------------------
[backup]
comment = welcome to oldboyedu backup!
path = /backup
然后配置好用户及文件,同上配置rsync服务
2.服务端需要每天校验客户端推送过来的数据是否完整
1.在客户端打包完成之后,先要生成一个md5值保存到文件里
md5sum /backup/主机名_IP_时间/passwd.tgz > /backup/主机名_IP_时间/md5.check
2.在服务端使用md5sum -c来校验数据的完整性
md5sum -c /backup/主机名_IP_时间/md5.check
3.服务端需要每天校验的结果通知给管理员
1.配置邮件
2.将校验的结果通过邮件发送到管理员的邮箱
md5sum -c md5.check |mail md5校验数据 1946354906@qq.com
3.编写定时任务
[root@backup ~]$ crontab -e
#每天执行一次校验脚本
00 00 * * * /usr/bin/sh /root/backup.sh &> /dev/null
4.服务端仅保留6个月的备份数据,其余的全部删除
find /backup ! -mtime -180|xargs rm -f
服务端脚本
#!/bin/bash
#将/backup设置为变量bak_dir
bak_dir=/backup
#将执行hostname命令后的结果设置为变量HOSTNAME
HOSTNAME=$(hostname)
#将主机内网IP设置为变量IP
IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}')
#将执行hostname命令后的结果设置为变量HOSTNAME
HOSTNAME=$(hostname)
#将主机内网IP设置为变量IP
IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}')
#将date +%F命令执行后的日期信息设置为变量DATE
DATE=$(date +%F)
#将/backup/主机名_主机IP_时间信息 这个格式的目录设置为变量tar_dir
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
#利用md5sum -c命令校验/backup/主机名_主机IP_时间信息/ 下面的所有存放随机数的文件,并用邮件将校验结果发给指定用户
md5sum -c $bak_dir/*/*.check|mail -s "备份数据校验结果${DATE}" 1946354906@qq.com
#其他信息放进黑洞文件
&>/dev/null
#服务端删除6个月之前的备份文件
find $bak_dir ! -mtime -180|xargs rm -f
配置邮件
vim /etc/mail.rc
set from=#发邮件的qq邮箱
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=#发邮件的qq邮箱
set smtp-auth-password=#客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
如何配置rsync服务多备份目录
[root@backup ~]# vim /etc/rsyncd.conf
#-------------------------------
#模块名
[backup]
#同步的描述信息
comment = xxx
#同步的路径
path = /backup
#------------------------------
[backup2]
comment = aaa
path = /backup2
#根据配置文件创建出对应的目录
[root@backup ~]$ mkdir /backup2
#再更改新目录属主属组信息
[root@backup ~]$ chown rsync.rsync /backup2/
#只要改完配置文件一定要重启服务
[root@backup ~]$ systemctl restart rsyncd
#客户端同步
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup2