Rsync文件同步备份



Rsync文件同步备份

什么是Rsync

rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows/macos等多种操作系统平台。


  • 全量备份:将所有数据都进行一次备份
  • 增量备份:基于全量备份来说,只给增加的部分做备份

远程文件传输

# 语法
scp [选项] [源文件] [用户名@主机IP]:[位置]

# 选项
-r:递归复制
[root@backup ~]# scp -r /etc/passwd root@172.16.1.31:/tmp

# 注意:scp不支持增量,只能全量备份


服务端口

协议

端口

ssh

22

telnet

23

ftp

21

http

80

https

443

rdp

3389

rsync

873

RPCbind

111

mysql

3306

php

9000

redis

6379

Rsync简介

  • rsync官网:​​TP​
  • rsync端口:873
  • rsync模式:C/S client/server

注意:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。

Rsync的三种传输模式

rsync命令注意:
  • 1.传递的目录加/只同步该目录下的所有文件
  • 2.传递的目录不加/同步该目录本身和目录下的所有文件
三种传输模式
  • 本地方式:类似于cp命令
Local: rsync [OPTION...] SRC... [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]

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

## rsync的选项
-a:archive 归档拷贝,等于-tropgDl
-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
[root@backup ~]# rpm -qc rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd


1.修改配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = dsr_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[nfs_backup]
comment = welcome to oldboyedu backup!
path = /opt/backup1/nfs_data
#####################################
[web_backup]
comment = welcome to oldboyedu backup!
path = /opt/backup2/web_bak



[root@backup ~]# cat /etc/rsyncd.conf
# 服务启动的用户
uid = www
# 服务启动的用户组
gid = www
# 服务监听的端口
port = 873
# 假的超级用户
fake super = yes
# 禁锢指定的目录,不允许用户跳出到其他目录
use chroot = no
# 最大连接数
max connections = 200
# 超时时间
timeout = 600
# 忽略错误
ignore errors
# 只读为false,可读可写
read only = false
# 不允许其他用户查询模块名
list = false
# 虚拟用户,rsync同步需要使用的用户
auth users = dsr_backup
# 存放虚拟用户密码的文件
secrets file = /etc/rsync.passwd
# rsync服务的日志存放路径
log file = /var/log/rsyncd.log
#####################################
# 模块名
[nfs_backup]
# 同步的描述信息
comment = welcome to oldboyedu backup!
# 同步的路径
path = /opt/backup1/nfs_data
#####################################
# 模块名
[web_backup]
# 同步的描述信息
comment = welcome to oldboyedu backup!
# 同步的路径
path = /opt/backup2/web_bak


2.创建服务启动的用户
[root@backup ~]# groupadd www -g 666[root@backup ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M


3.创建虚拟用户的密码文件
密码文件的格式用户名:密码[root@backup ~]# echo 'dsr_backup:123' > /etc/rsync.passwd[root@backup ~]# cat /etc/rsync.passwd dsr_backup:123


4.rsync要求密码文件的权限必须是600
[root@backup ~]# chmod 600 /etc/rsync.passwd [root@backup ~]# ll /etc/rsync.passwd -rw-------. 1 root root 17 Jul  6 20:06 /etc/rsync.passwd


5.创建备份目录
[root@backup ~]# mkdir -p /opt/backup1/nfs_data[root@backup ~]# mkdir -p /opt/backup2/web_bak


6.修改同步路径的属主和属组
[root@backup ~]# chown www.www /opt/backup1/nfs_data[root@backup ~]# chown www.www /opt/backup1[root@backup ~]# chown www.www /opt/backup2/web_bak/[root@backup ~]# chown www.www /opt/backup2


7.启动rsync服务
[root@backup ~]# systemctl start rsyncd


8.加入开机自启
[root@backup ~]# systemctl enable rsyncd


9.验证服务启动(进程,端口)
[root@backup ~]# ps -ef|grep [r]syncroot       7405      1  0 Jul06 ?        00:00:00 /usr/bin/rsync --daemon --no-detach[root@backup ~]# netstat -lntup|grep 873tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      7405/rsync          tcp6       0      0 :::873                  :::*                    LISTEN      7405/rsync


客户端操作

需要交互

[root@nfs ~]# rsync -avz /etc rsync_backup@172.16.1.41::backup


报错1

[root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bakPassword:@ERROR: auth failed on module bakrsync error: error starting client-server protocol (code 5) at main.c(1649)[sender=3.1.2]排查思路:1.密码文件的权限不是6002.密码文件里的密码和手动输入的密码不一致3.密码文件名字和配置文件中的名字不一致


报错2

[root@nfs ~]# rsync -avz /backup/123.txt zls_abc@172.16.1.41::bakPassword:sending incremental file list123.txtrsync: mkstemp ".123.txt.P2Kfee" (in bak) failed: Permission denied (13)sent 89 bytes received 120 bytes 139.33 bytes/sectotal size is 0 speedup is 0.00rsync error: some files/attrs were not transferred (see previous errors) (code 23) atmain.c(1179) [sender=3.1.2]排查思路:1.没有关闭selinux2.备份路径的权限不是配置文件中指定的uid权限


报错3

[root@nfs ~]# rsync -avz /var zls_abc@172.16.1.41::bak --passwordfile=/tmp/rsync.passERROR: password file must not be other-accessiblersync 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 rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.pass# 2.使用rsync的环境变量[root@nfs ~]# export RSYNC_PASSWORD=123[root@nfs ~]# rsync -avz /var rsync_backup@172.16.1.41::backup


无差异同步

## 为了保证数据的一致性[root@nfs data]# rsync -avz --delete /opt/data rsync_backup@172.16.1.41::backup


企业中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

nfs

rsync服务端

eth0:10.0.0.41

eth1:172.16.1.41

backup

客户端需求

1.客户端提前准备存放的备份的目录,目录规则如下:​​/backup/nfs_172.16.1.31_2018-09-02​

[root@nfs ~]# mkdir -p /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)[root@web01 ~]# mkdir -p /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)


2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至​​/backup/nfs_172.16.1.31_2018-09-02​

tar zcf /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)/passwd.tgz /etc/passwd


3.客户端最后将备份的数据进行推送至备份服务器

echo '123' > /tmp/rsync.passwdchmod 600 /tmp/rsync.passwdrsync -az  /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.passwd


4.客户端每天凌晨1点定时执行该脚本

crontab -e00 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校验数据 133411023@qq.com


4.服务端仅保留6个月的备份数据,其余的全部删除

find /backup ! -mtime -180|xargs rm -f


客户端脚本

#!/bin/bashbak_dir=backupHOSTNAME=$(hostname)IP=$(hostname -I|awk '{print $2}')DATE=$(date +%F)tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}mkdir -p /$tar_dircd /etctar zcf /$tar_dir/passwd.tgz passwdecho '123' > /tmp/rsync.passwdchmod 600 /tmp/rsync.passwdmd5sum /$tar_dir/passwd.tgz > /$tar_dir/md5.checkrsync -az /$tar_dir rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.passwdfind /$bak_dir ! -mtime -7|xargs rm -f[root@nfs ~]# crontab -e*/6 * * * * /bin/ntpdate time1.aliyun.com &>/dev/null00 01 * * * /bin/sh /root/backup.sh &> /dev/null


服务端脚

#!/bin/bashbak_dir=backupHOSTNAME=$(hostname)IP=$(hostname -I|awk '{print $2}')DATE=$(date +%F)tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}md5sum -c /$bak_dir/*/*.check|mail -s "备份数据校验结果${DATE}"1031109605@qq.com &> /dev/nullfind /$bak_dir ! -mtime -180|xargs rm -f[root@backup ~]# crontab -e*/5 * * * * /bin/ntpdate time1.aliyun.com &>/dev/null00 01 * * * /bin/sh /root/backup.sh &> /dev/null


如何配置rsync服务多备份目录

[root@backup ~]# vim /etc/rsyncd.conf#-------------------------------# 模块名[bak]# 同步的描述信息comment = xxx# 同步的路径path = /backup#------------------------------[bak2]comment = aaapath = /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' -ecreate,modify,delete,attrib,close_write /backup