Day39-2-Rsync企业级备份工具讲解
- 1. 什么是rsync?
- 2. 什么是全量和增量?
- 3. 为什么要用rsync?
- 4. rsync功能特性
- 5. 增量复制原理
- 6. rsync三种工作模式介绍
- 6.1 本地(local)
- 6.2 远程Shell模式
- 6.2.1 远程Shell模式企业场景和实践:
- 6.2.2 企业工作中正常SSH优化
- 6.3 rsync守护进程模式*****
- 6.3.1 rsync守护进程模式应用实践
- 6.3.2 rysnc 服务配置文件参数说明
- 6.3.3 业务需求:搭建一个备份服务器
- 6.3.4 在客户端服务器操作(任何一台机器),nfs01
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 4月 12 11:24 /etc/hosts
71373 -rw-r--r-- 1 root root 332 4月 12 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 = rsync | rsync 服务用户。默认为 nobody,这里用 rsync 虚拟用户,管理备份目录 |
gid = rsync | rsync 服务用户组。默认为 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.pid | rsync 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 = /oldboy | oldboy 模块对应的备份路径 |
#配置文件查帮助
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 6月 28 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 4月 15 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