Rsync文件同步及备份
Rsync文件同步及备份
Rsync服务概述
rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于
MacOS/Unix/linux/Windows等多种操作系统平台。
全量备份:将所有的数据都进行一次备份
增量备份:基于全量备份来说,只给增加的部分做备份
远程文件传输
## 不支持增量
scp [选项] [源文件] [用户名@主机] [位置]
[root@backup ~]# scp -r /etc/ root@172.16.1.31:/tmp
服务端口
ssh 22
telnet 23
ftp 21
http 80
https 443
rdp 3389
rsync 873
Rsync简介
rsync官网:[TP](rsync (samba.org))
rsync端口:873
rsync模式:C/S client/server (客户端连接服务端)
rsync的三种传输模式
本地方式:类似于 cp 命令
#rsync命令注意:1.传递的目录加/只同步该目录下的所有文件 2.传递的目录不加/同步该目录本身和目录下的所有文件
本地方式:类似于 cp 命令
Local: rsync [OPTION...] SRC... [DEST]
SRC:source 源文件
[DEST]:目标
## 拷贝/etc目录及底下的所有文件到/tmp/
[root@backup ~]# rsync -av /etc /tmp/
## 拷贝/etc/目录下的所有文件到/tmp
[root@backup ~]# rsync -av /etc/ /tmp/
远程方式:类似于 scp 命令
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync 选项... 用户名@主机IP:源文件 目标
## 将172.16.1.31服务器上的/opt目录及下面的所有文件拉到本地的/etc/目录下
rsync -avz root@172.16.1.31:/opt /etc/
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync 选项... 源文件 用户名@主机IP:目标
## 将本地/etc目录及下面的所有文件远程传输给172.16.1.31服务器的/opt目录下
[root@backup ~]# rsync -avz /etc root@172.16.1.31:/opt
缺点:必须使用系统用户,用root用户还得知道root的密码
守护进程:C/S结构(服务端和客户端)
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
#SRC : 代表的是模块 不是源文件了 port:端口 一般用第一个
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
## rsync的选项
-a:#archive 归档拷贝
-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 #使用密码文件
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的配置文件路径
[root@backup ~]# rpm -qc rsync
只有yum安装的或者rpm命令安装的服务才能用rpm -qc查看 用源码安装或者二进制安装的包 这个是看不了的
## 1.修改配置
[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
[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
# 只读为false,可读可写
read only = false
# 不允许其他用户查询模块名
list = false
# 虚拟用户,rsync同步需要使用的用户
auth users = rsync_backup
# 存放虚拟用户密码的文件
secrets file = /etc/rsync.passwd
# rsync服务的日志存放路径
log file = /var/log/rsyncd.log
####################################
# 模块名
[backup]
# 同步的描述信息
comment = xxx
# 同步的路径
path = /backup
## 2.创建服务启动的用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
## 3.创建虚拟用户的密码文件
密码文件的格式
用户名:密码
[root@backup ~]# echo \'rsync_backup:1\' > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
rsync_backup:1
## 4.rsync要求密码文件的权限必须是600
[root@backup ~]# chmod 600 /etc/rsync.passwd
## 5.创建一个同步的路径
[root@backup ~]# mkdir /backup
## 6.修改同步路径的属主和属组
[root@backup ~]# chown rsync:rsync /backup/
## 7.启动rsync服务
[root@backup ~]# systemctl start rsyncd
## 8.加入开机自启
[root@backup ~]# systemctl enable rsyncd
## 9.验证服务启动(进程,端口)
[Wed Jul 07 05:53:17 root@backup ~]
# ps -ef|grep [r]sync
root 17427 1 0 Jul06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[Wed Jul 07 05:56:47 root@backup ~]
# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 17427/rsync
tcp6 0 0 :::873 :::* LISTEN 17427/rsync
客户端操作
## 需要交互
[root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak
## 报错1
[root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak
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 zls_abc@172.16.1.41::bak
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 zls_abc@172.16.1.41::bak --passwordfile=/tmp/rsync.pass
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\' > /tmp/rsync.pass
[root@nfs ~]# chmod 600 /tmp/rsync.pass
[root@nfs ~]# rsync -avz /var zls_abc@172.16.1.41::bak --passwordfile=/tmp/rsync.pass
# 2.使用rsync的环境变量
[root@nfs ~]# export RSYNC_PASSWORD=123
[root@nfs ~]# rsync -avz /var zls_abc@172.16.1.41::bak
无差异同步
## 为了保证数据的一致性
[root@nfs data]# rsync -avz --delete /opt/data sync_backup@172.16.1.41::bak
企业中rsync实战案例
角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名 |
---|---|---|---|
rsync客户端 | eth0:10.0.0.7 | eth1:172.16.1.7 | web01 |
rsync客户端 | eth0:10.0.0.31 | eth1:172.16.1.31 | nfs01 |
rsync服务端 | eth0:10.0.0.41 | eth1:172.16.1.41 | backu |
客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下: /backup/nfs_172.16.1.31_2018-09-02
# 在web01和nfs服务器上创建备份目录
[root@web01 ~]# mkdir /backup
[root@nfs ~]# mkdir /backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /backup/nfs_172.16.1.31_2018-09-02
mkdir /backup/$(hostname)_$(ifconfig eth1|awk \'NR==2{print $2}\')_$(date +%F)
tar zcf /backup/$(hostname)_$(ifconfig eth1|awk \'NR==2{print $2}\')_$(date +%F)/pass.tgz
/etc/passwd
3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /backup/$(hostname)_$(ifconfig eth1|awk \'NR==2{print $2}\')_$(date
+%F)/pass.tgz zls_abc@172.16.1.41::bak --password-file=/etc/rsync.pass
4.客户端每天凌晨1点定时执行该脚本
crontab -e
00 01 * * * /bin/sh /root/backup.sh &>/dev/null
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /backup ! -mtime -7|xargs rm -f
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
部署rsync守护进程模式
2.服务端需要每天校验客户端推送过来的数据是否完整
1.在客户端打包完成之后,先要生成一个md5值保存到文件里
2.在服务端使用md5sum -c来校验数据的完整性
3.服务端需要每天校验的结果通知给管理员
# 1.配置邮件
# 2.将校验的结果通过邮件发送到管理员的邮箱
md5sum -c md5.check |mail md5校验数据 1922142306@qq.com
4.服务端仅保留6个月的备份数据,其余的全部删除
find /backup ! -mtime -180|xargs rm -f
客户端脚本
#!/bin/bash
#if [ -d /backup ];then
# echo \'存在\'
#else
# echo \'不存在\'
#fi
bak_dir=/backup
HOSTNAME=$(hostname)
IP=$(/usr/sbin/ifconfig eth1|awk \'NR==2{print $2}\')
DATE=$(date +%F_%T)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
export RSYNC_PASSWORD=123
mkdir -p $bak_dir
mkdir -p $tar_dir
cd /etc
tar zcf $tar_dir/passwd.tgz passwd
md5sum $tar_dir/passwd.tgz > $tar_dir/md5.check
rsync -az $bak_dir/ zls_abc@172.16.1.41::bak
find /backup ! -mtime -7|xargs rm -f
服务端脚本
#!/bin/bash
bak_dir=/backup
HOSTNAME=$(hostname)
IP=$(/usr/sbin/ifconfig eth1|awk \'NR==2{print $2}\')
DATE=$(date +%F_%T)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
md5sum -c $bak_dir/*/*.check|mail -s "备份数据校验结果${DATE}" 133411023@qq.com
&>/dev/null
find $bak_dir ! -mtime -180|xargs rm -f
如何配置rsync服务多备份目录
[root@backup ~]# vim /etc/rsyncd.conf
#-------------------------------
# 模块名
[bak]
# 同步的描述信息
comment = xxx
# 同步的路径
path = /backup
#------------------------------
[bak2]
comment = aaa
path = /backup2
## 根据配置文件创建出对应的目录
[root@backup ~]# mkdir /backup2
[root@backup ~]# chown rsync.rsync /backup2/
## 只要改完配置文件一定要重启服务
[root@backup ~]# systemctl restart rsyncd
## 客户端同步
[root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak2
rsync扩展结合inotify使用
安装inotify
yum -y install inotify-tools
inotify命令
/usr/bin/inotifywait -mrq --format \'%Xe %w %f\' -e
create,modify,delete,attrib,close_write /backup