Day39-2-Rsync企业级备份工具讲解


rsync复制软件的应用与实践

1. 什么是rsync?

Rsync英文全称为Remote sync hronization,缩写rsync
是开源、高速的、可实现本地以及远程,全量以及增量的数据复制(拷贝)工具。
官方链接: http://www.samba.org/ftp/rsync/rsync.html(教学翻译功能)

2. 什么是全量和增量?

全量复制:傻傻的每次完整拷贝

[root@backup ~]# cp -a /etc/ /tmp/
[root@backup ~]# touch /etc/oldboy.txt
[root@backup ~]# \cp -a /etc/ /tmp/

增量复制:只拷贝变化的部分

[root@backup ~]# rsync -avz /etc /tmp/
sending incremental file list
etc/
etc/olgirl.txt  #只复制olgirl.txt

rsync首次全量,第二次就增量了。

3. 为什么要用rsync?

1)工作中需要定时/实时数据备份。
2)本地服务器目录、不同机器、
不同机房之间的数据备份。都可以用rsync完成。

生产案例:企业yum源和官方源之间数据传输就使用rsync

# 使用rsync同步Centos yum源
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/os/x86_64/ /var/ftp/centos7/x86_64/repodata/os
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/extras/x86_64/ /var/ftp/centos7/x86_64/repodata/extras/
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/updates/x86_64/ /var/ftp/centos7/x86_64/repodata/updates/

#同步epel源
rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /var/ftp/centos7/x86_64/repodata/epel/

#远程复制测试:
rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /var/ftp/centos7/x86_64/repodata/epel/
[root@oldboy yum.repos.d]# ls /var/ftp/centos7/x86_64/repodata/epel/ -a
.    4.1   5.3   6.6       8                           RPM-GPG-KEY-CentOS-Official
..   4.2   5.4   6.7       8-stream                    RPM-GPG-KEY-CentOS-Security-6
2    4.3   5.5   6.8       8.0.1905                    RPM-GPG-KEY-CentOS-Testing-6

4. rsync功能特性

  • 支持拷贝普通文件与特殊文件,如链接文件,设备文件等。
  • 支持排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
  • 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
  • 可实现增量复制,既只复制发生变化的数据,因此数据传输效率很高。
  • 可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)。
  • 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*。
  • 支持匿名或认证(无需系统用户)进程模式传输,安全的进行数据备份及镜像

5. 增量复制原理

使用quick check算法,只对增量的部分复制,根据大小属性的变化进行复制。
Rsync使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件。当快速检查表明不需要更新文件的数据时,其他保留属性的任何更改(根据选项的要求)都会直接在目标文件上进行。

#该算法查找大小或上次修改时间已更改的文件 *

2.x比对差异后复制,3.x一边比对一边复制。

其他:
链接: https://coolshell.cn/articles/7425.html

6. 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)

6.1 本地(local)

rsync就是一个命令

rsync	   [OPTION...]	      SRC...	    [DEST]
rsync命令	参数选项	      [源目录或文件]	   目的目录或文件

命令操作:
rsync命令
a.把数据从一个地方复制到另一个地方(仅在一台机器增量),相当于cp。
b.通过加参数实现删除文件和清空文件内容的功能,相当于rm命令。
c.查看属性信息功能,相当于ls。

a.拷贝实践

#该算法查找大小或上次修改时间已更改的文件 *****
rsync -avz /etc /opt/
touch /etc/test.txt
rsync -avz /etc /opt/
echo 111 >/etc/test.txt 
rsync -avz /etc /opt/
chmod 777 /etc/test.txt 
rsync -avz /etc /opt/
chown -R oldboy.oldboy /etc/test.txt
rsync -avz /etc /opt/
vim /etc/test.txt 
rsync -avz /etc /opt/
vim /etc/test.txt 
rsync -avz /etc /opt/

[root@backup ~]# ls /opt
[root@backup ~]# rsync /etc/hosts /opt
[root@backup ~]# ls /opt
hosts
[root@backup ~]# \cp /etc/hosts /opt

保持属性:

[root@backup ~]# rsync -vzrtopg /etc/hosts /opt/ #rtopg==a
[root@backup ~]# ls -lhi /etc/hosts /opt/hosts
16829878 -rw-r--r--. 1 root root 332 412 11:24 /etc/hosts
   71373 -rw-r--r--  1 root root 332 412 11:24 /opt/hosts

b.删除实践

删除文件内容:

[root@backup ~]# cp /etc/hosts /tmp/
[root@backup ~]# rsync -avz /null.txt /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny   
[root@backup ~]# rsync -avz /null.txt /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny   
[root@backup ~]# rsync -avz /null.txt /etc/hosts
sending incremental file list
null.txt
[root@backup ~]# cat /etc/hosts

恢复:

[root@backup ~]# \cp /tmp/hosts /etc/
[root@backup ~]# cat /etc/hosts

删除目录下所有文件:

[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /opt/       #让后面opt和前面null目录内容保持一致
[root@backup ~]# ls /opt/

c.查看属性

[root@backup ~]# rsync /etc/hosts
-rw-r--r--            332 2019/04/12 11:24:41 hosts

注意事项:
拷贝的时候,永远要注意目标目录和文件,防止被清空。

6.2 远程Shell模式

借助类似ssh隧道传输数据,适合不同的机器之间复制。
异地拷贝,相当于scp,区别scp是远程全量拷贝)

企业场景:
1.重要的数据,需要加密;
2.没有搭建服务端

拉门、推门 思考:
pull,拉:从远端拉取到本地。

语法:

rsync	    [OPTION...]	[USER@]HOST:SRC...	             [DEST]
rsync命令	参数选项	[认证用户]@[主机地址]:[源路径]	 本地路径

语法:

push,推:从本地推到远端。
rsync	    [OPTION...]   SRC... 	 [USER@]HOST:[DEST]        
rsync命令	参数选项	本地路径 [认证用户]@[主机地址]:[目标路径]

push实践:
没用隧道:

rsync -avz /etc/hosts root@172.16.1.31:/opt/ #加密传输,限制root。
rsync -avz /etc/hosts oldboy@172.16.1.31:/tmp/ #加密传输,限制root。

使用隧道;

rsync -avz /etc/hosts -e "ssh -p 22" root@172.16.1.31:/opt/
rsync -avz /etc -e "ssh -p 22" oldboy@172.16.1.31:/tmp/
#上述命令是等价的。-e 指定通道  ssh ssh服务连接客户端  -p 22指定22端口。

拉的命令:

rsync -avz root@172.16.1.41:/opt/hosts /opt
rsync -avz -e "ssh -p 22" root@172.16.1.41:/opt/hosts /opt

拉的实践:
没用隧道:

rsync -avz  root@172.16.1.31:/opt/ /tmp #加密传输,限制root。
rsync -avz  oldboy@172.16.1.31:/tmp/  /tmp #加密传输,限制root。

使用隧道:

rsync -avz -e "ssh -p 22" root@172.16.1.31:/opt/ /tmp
rsync -avz -e "ssh -p 22" oldboy@172.16.1.31:/tmp/ /tmp
#上述命令是等价的。-e 指定通道  ssh ssh服务连接客户端  -p 22指定22端口。

推拉:
a.参照物,你执行命令的机器
b.root@172.16.1.31 连接的用户和主机,使用连接的主机和用户的密码。

6.2.1 远程Shell模式企业场景和实践:

1)配合SSH+免秘钥连接登录(单向从私钥到公钥),进行备份文件传输工作。
两台机器连接不需要密码了,rsync拷贝的时候自然随意拷贝了。

实践:nfs01作为主机操作
1.生成秘钥对

ssh-keygen  #一路回车

2.把公钥拷贝到41服务器

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.41
1)放到41的~/.ssh/下。
2)公钥被改名为authorized_keys 
3)authorized_keys 权限为600,~/.ssh/权限700

为什么改名为authorized_keys?

[root@backup ~]# grep authorized_keys /etc/ssh/sshd_config
AuthorizedKeysFile	.ssh/authorized_keys

4.从31连接41,无需密码即可登录

[root@nfs01 ~]# ssh 10.0.0.41 #ssh类似xshell。
Last login: Mon Jun 28 11:47:41 2021
[root@backup ~]# 

5.测试

# 不加密拉取
rsync -avz root@172.16.1.41:/opt/ /tmp #加密传输,限制root。
# 加密推送
rsync -avz /etc -e "ssh -p 22" root@172.16.1.41:/opt/

实现了免密码数据传输。企业中利用定时任务等实现定时推送,或者
使用实时复制工具sersync实现,数据的实时复制。

强调一个重点:适合rsync
null和null/区别,null是目录和目录下的内容,
null/只是目录下的内容,不含本身。

下面方法不可用,所以,此命令只能手工输入密码了(expect工具帮你交互输入密码)

[root@backup ~]# echo 123456 >/etc/rsync_shell.password
[root@backup ~]# chmod 600 /etc/rsync_shell.password
rsync -avz /etc -e "ssh -p 22" oldboy@172.16.1.31:/tmp/ --password-file=/etc/rsync_shell.password

特殊提醒:

6.2.2 企业工作中正常SSH优化

####by oldboy#2011-11-24##
Port 52113
ListenAddress 172.16.1.7:52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
####by oldboy#2011-11-24##
0.0.0.0:22 表示sshd服务监听任意网卡,监听所有IP请求。

#期中架构中修改:
vim /etc/ssh/sshd_config
####by oldboy#2011-11-24##
PermitRootLogin yes
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
####by oldboy#2011-11-24##
[root@backup ~]# sed -i.bak 's#PermitRootLogin no#\# PermitRootLogin yes#g' /etc/ssh/sshd_config
[root@backup ~]# grep RootLo /etc/ssh/sshd_config
# PermitRootLogin yes

企业常用参数组合:-avz或者-vzrtopg

6.3 rsync守护进程模式*****

首先要搭建rsync服务端(要有守护进程),然后才能在客户端实现推拉数据。
企业运维的重要模式,重点讲。
客户端语法暂时不讲。
rsync服务模式:*****开启后台进程,接受别人访问。

6.3.1 rsync守护进程模式应用实践

1)安装(不需要安装)

[root@backup ~]# rsync --version
rsync  version 3.1.2  protocol version 31
[root@backup ~]# yum install rsync(不需要)

2)配置配置文件【/etc/rsyncd.conf】
备份

cp /etc/rsyncd.conf{,.ori}
cat>/etc/rsyncd.conf<<EOF
#rsync_config_______________start      注释
#created by oldboy                     注释
#site: http://www.oldboyedu.com        注释
uid = rsync                 #用户,rsync访问本地数据目录的一个用户
gid = rsync                 #用户组
use chroot = no             #安全选项,防止出现漏洞
max connections = 200       #并发最大连接数
timeout = 600               #进程超时时间
pid file = /var/run/rsyncd.pid     #进程ID号
lock file = /var/run/rsync.lock    #锁文件
log file = /var/log/rsyncd.log     #
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
[backup]
comment = welcome to oldboyedu backup!
path = /backup/
EOF

6.3.2 rysnc 服务配置文件参数说明

rsyncd.conf 参数参数说明
uid = rsyncrsync 服务用户。默认为 nobody,这里用 rsync 虚拟用户,管理备份目录
gid = rsyncrsync 服务用户组。默认为 nobody,这里用管理备份目录
fake super= yes允许进程不以 root 身份运行,就可以改变文件属性(C7 环境加此参数)。
use chroot = no如果为 true, daemon 会在给客户端传输文件前"chroot to the path"。这是 rsync 安全的一个配置,因为我们大多数都是在内网使用 rsync,所以不配也可以
max connections =200设置最大连接数.默认为 0,意为无限制.负值为关闭这个模块
timeout = 400默认为 0,意 no timeout,建议为 300-600(5-10 分钟)
pid file = /var/run/rsyncd.pidrsync daemon 启动后将其进程 PID 写入此文件。如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止
lock file =/var/run/rsyncd.lock指定 lock 文件用来支持"max connections"参数,使得总连接数不会超过限制,默认为/var/run/rsyncd.lock
log file = /var/log/rsyncd.log不设或者设置错误,rsync 会使用 syslog 输出相关日志信息
ignore errors忽略 I/0 错误
read only = false指定客户端是否可以上传文件,默认对所有模块都为 true 即表示可写
list = false是否允许客户端可以查看可用模块列表.默认为可以如果配置为 yes 或 true执行 rsync 172.16.1.41::命令都会显示配置的模块信息
hosts allow = 172.16.1.0/24指定可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数即都可以连接。表示配置白名单参数。
hosts deny =0.0.0.0/32指定不可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数,即都可以连接。表示配置黑名单参数
auth users = rsync backup指定以空格或逗号分隔的用户可以使用哪些模块.用户不需要在本地系统中存在.默认所有用户无密码的访问(anonymous rsync)
secrets file = /etc/rsync.password指定用户名和密码存放的文件,格式为,用户名:密码
[backup]这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护
path = /backup在这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题
#exclude = a c b/2排除的文件或目录,相对路径
[oldboy]除了 backup 模块外,还可以添加模块,例如 oldboy
path = /oldboyoldboy 模块对应的备份路径

#配置文件查帮助
man rsyncd.conf 查配置参数
https://www.samba.org/ftp/rsync/rsync.html

6.3.3 业务需求:搭建一个备份服务器

3)备份的地点 /backup

mkdir /backup -p

4)创建一个用户

[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# id rsync
uid=1003(rsync) gid=1003(rsync)=1003(rsync)

5)授权rsync管理backup目录

chown -R rsync.rsync /backup
[root@backup ~]# 
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 628 16:58 /backup/

6)创建密码文件并设置权限

# 格式:用户:密码
rsync_backup:oldboy123
echo "rsync_backup:oldboy123" >/etc/rsync.password 
#文件名随意起,但是要和rsyncd.conf secrets file = /etc/rsync.password一致。

[root@backup ~]# echo "rsync_backup:oldboy123" >/etc/rsync.password #文件名随意起
[root@backup ~]# cat /etc/rsync.password
rsync_backup:oldboy123

# 设定权限:
chmod 600 /etc/rsync.password 
ls -l /etc/rsync.password

7)启动rsync服务和检查

rsync --daemon(c6及以前)#本次不执行,用下面的C7的命令
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd

[root@backup ~]# ps -ef|grep sync|grep -v grep  #检查进程
root       7521      1  0 11:39 ?        00:00:00 /usr/bin/rsync --daemon --no-detach

[root@backup ~]# netstat -lntup|grep rsync #检查端口
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      7521/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      7521/rsync 
         
[root@backup ~]# lsof -i :873 #检查端口
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   7521 root    3u  IPv4  41439      0t0  TCP *:rsync (LISTEN)
rsync   7521 root    5u  IPv6  41440      0t0  TCP *:rsync (LISTEN)
# 面试题:如何查看某端口对应什么服务?答案就是上面两个。

rsync服务端配置完成。

6.3.4 在客户端服务器操作(任何一台机器),nfs01

1.配置认证密码文件并授权
以下方法2选1
方法1:认证密码文件

[root@nfs01 ~]# echo "oldboy123" >/etc/rsync.password #只有密码,没有用户,密码和服务的配置相同。
[root@nfs01 ~]# chmod 600 /etc/rsync.password
[root@nfs01 ~]# cat /etc/rsync.password
oldboy123
[root@nfs01 ~]# ls -l /etc/rsync.password
-rw------- 1 root root 7 415 11:55 /etc/rsync.password

方法2:

[root@nfs01 ~]# echo ' export RSYNC_PASSWORD=oldboy123' >>/etc/bashrc 
[root@nfs01 ~]# tail -1 /etc/bashrc 
 export RSYNC_PASSWORD=oldboy
[root@nfs01 ~]# . /etc/bashrc 
[root@nfs01 ~]# echo $RSYNC_PASSWORD
oldboy123

2.测试完成结果
1)守护进程模式,客户端rsync的命令语法:
配置服务器端守护进程,实现数据传输:

1、服务器端守护进程。2、客户端执行命令。
拉门、推门 思考:

pull,拉:从远端拉取到本地。
语法1(常用):
rsync	    [OPTION...]	[USER@]HOST::SRC...	                 [DEST]
rsync命令	参数选项	[虚拟用户]@[主机地址]::[模块名]	     本地路径

语法2:
rsync	    [OPTION...]	rsync://[USER@]HOST::SRC...	              [DEST]
rsync命令	参数选项	rsync://[虚拟用户]@[主机地址]/[模块名]	 本地路径


push,推:从本地推到远端。
语法1(常用):                 
rsync	    [OPTION...]	  [DEST]        [USER@]HOST::SRC...	                 
rsync命令	参数选项	  本地路径      [虚拟用户]@[主机地址]::[模块名]	     

语法2:                    
rsync	    [OPTION...]	   [DEST]		rsync://[USER@]HOST::SRC...	             
rsync命令	参数选项	  本地路径		rsync://[虚拟用户]@[主机地址]/[模块名]	 

2)拉取实践
方法1:

mkdir /data
rsync -avz rsync_backup@172.16.1.41::backup /data --password-file=/etc/rsync.password

[root@nfs01 ~]# rsync -avz rsync_backup@172.16.1.41::backup /data --password-file=/etc/rsync.password
receiving incremental file list
./
oldboy1/
oldboy2/
oldboy3/

sent 39 bytes  received 140 bytes  358.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 ~]# ls /data
oldboy1  oldboy2  oldboy3

成功拉回。

方法2:不常用

[root@nfs01 ~]# rsync -avz rsync://rsync_backup@172.16.1.41/backup /data --password-file=/etc/rsync.password

3)推送实践
方法1:

rsync -avz  /data  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

方法2:

rsync -avz  /data  rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password

在这里插入图片描述

  • 33
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值