rsync复制软件应用与实践
2020/3/6 学习日记 当前操作系统版本:Red Hat Enterprise Linux release 8.0 (Ootpa)
一、 Rsync理论知识学习
1.1 什么是rsync?
- rsync(Remote synchronization)
- 是一个开源、高速的,数据复制(拷贝)工具。
1.2 rsync的作用
- 工作中需要定时/实时数据备份。本地服务器目录、不同机器、不同机房之间的数据备份。都是用rsync完成。
1.3 rsync功能特性
- 支持拷贝普通文件与特殊文件,如链接文件,设备文件等。
- 支持排除指定文件或目录的权限、时间、软硬件链接、属主、组等所有属性均不改变。
- 可实现增量复制,即只复制发生变化的数据,因此数据传输效率很高。
- 可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)。
- 可通过socket(进程方式)传输文件和数据(服务端和客户端)。
- 支持匿名或认证(无需系统用户)进程模式传输,安全的进行数据备份及镜像。
1.4 全量复制和增量复制的区别
- 全量复制:复制一个文件到一个目录里,就算这个目录里已经存在了这个文件也会复制进来。
- 就相当于多次使用cp -a /etc /opt
- rsync的增量复制:在备份复制数据时rsync通过其独特的“quick check”算法,它仅复制大小或者最后修改时间发生变化的文件或者目录,当然也可根据权限,属主等属性的变化复制,但需要指定相应的参数,甚至可以实现只复制一个文件里有变化的内容部分,所以可以实现快速的备份复制数据,即采用增量复制方法对数据信息进行复制,与传统cp,scp拷贝工具的全量拷贝复制截然不同,增量复制数据,在效率上远远高于全量复制。
在rhel/CentOS5系统上,rsync
软件版本默认2.x,同步增量复制数据原理是把所有的文件比对一遍,然后再进行数据同步。在rhel/CentOS6、7、8系统上,rsync软件版本默认为3.x,增量复制数据原理是一边比对差异,一遍对差异的数据进行复制。从增量复制数据的效率上而言。rsync 3.x版本比rsync 2.x更有优势一些。
rsync底层代码原理,可以参考https://coolshell.cn/articles/7425.html
二、 rsync应用
2.1 查询版本
[root@nicy ~]# rsync --version
rsync version 3.1.3 protocol version 31
2.2 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
2.2.1 本地模式(local)
rsync就是一个命令:
1)把数据从一个地方拷贝到另一个地方(仅在一台机器增量),相当于cp。
[root@nicy ~]# rsync /etc/hosts /opt/
[root@nicy ~]# rsync -zrtopg /etc/hosts /opt/ #保持属性
2)通过参数实现清空的功能。
[root@nicy ~]# > /null.txt #创建一个空文件
[root@nicy ~]# rsync -r --delete /null.txt /opt/hosts #使/opt/hosts与/null.txt内容保持一致(清空目录同理)
3)查看属性信息功能,相当于ls -l。
[root@nicy ~]# rsync /opt
drwxr-xr-x 32 2020/03/07 06:31:22 opt
[root@nicy ~]# rsync /opt/
drwxr-xr-x 32 2020/03/07 06:31:22 .
-rw-r--r-- 0 2020/03/07 06:31:22 hosts
2.2.2 远程shell模式(Access via remote shell)
借助类似ssh隧道传输数据,适合不同的机器之间复制。
pull,拉:从远端拉取到本地。
rsync | [OPTION…] | [USER@]HOST:SRC… | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | [认证用户]@主机地址:目标路径… | 本机路径 |
push,推:从本地推到远端。
rsync | [OPTION…] | [DEST] | [USER@]HOST:SRC… |
---|---|---|---|
rsync命令 | 参数选项 | 本机路径 | [认证用户]@主机地址:目标路径… |
2.2.3 守护进程模式 (Access via rsync daemon)
首先要搭建rsync服务端(要有守护进程),然后才能在客户端实现推拉数据。
企业运维的重要模式。
(1)rsync服务端配置:
编辑rsync的配置文件
[root@nicy ~]# cat >/etc/rsyncd.conf <<EOF
uid = rsync
#管理备份用户的用户
gid = rsync
#管理备份用户的用户组
use chroot = no
#安全功能,数据是否锁定到备份目录
fake super = yes
#不使用root用户也能存储文件的完整属性
max connections = 200
#并发连接,同时多少客户端访问
pid file = /var/run/rsyncd.pid
#进程号所在文件
lock file = /var/run/rsync.lock
#锁文件
log file = /var/log/rsyncd.log
#日志文件,查看报错等
ignore errors
#忽略错误
read only = false
#可写
list = false
#不允许列表
hosts allow = 10.0.0.0/24
#授权哪些主机可以访问
#hosts deny = 0.0.0.0/32
#拒绝哪些主机不可以访问,和host allow二选一
auth users = rsync_backup
#远程虚拟连接用户
secrets file = /etc/rsync.password
#存放密码的文件:格式:用户名:密码 权限 必须600
timeout = 600
#超时时间
[backup]
#[模块名]远程访问使用模块名访问
path = /backup/
#服务器用户备份的目录,用户和组,rsync.rsync
comment = welcome to joinlabs backup!
#注释说明
EOF
[root@nicy ~]# useradd rsync
[root@nicy ~]#
[root@nicy ~]#
[root@nicy ~]# mkdir /backup
[root@nicy ~]# chown -R rsync.rsync /backup
启动检查
rsync --daemon (6及以前)
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
添加rsync到防火墙
[root@nicy ~]# firewall-cmd --add-service=rsyncd --permanent
success
[root@nicy ~]# firewall-cmd --reload
success
sebool值设置
[root@nicy ~]# getsebool -a |grep rsync
postgresql_can_rsync --> off
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> off
rsync_full_access --> off
[root@nicy ~]# setsebool rsync_client on
[root@nicy ~]# getsebool -a |grep rsync
postgresql_can_rsync --> off
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> off
rsync_full_access --> on
检查
#检查进程
[root@nicy ~]# ps -ef |grep sync
root 21310 1 0 01:02 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
root 21379 19823 0 01:02 pts/0 00:00:00 grep --color=auto sync
[root@nicy ~]# ps -ef |grep sync|grep -v grep
root 21310 1 0 01:02 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
#检查端口
[root@nicy ~]# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 21310/rsync
tcp6 0 0 :::873 :::* LISTEN 21310/rsync
[root@nicy ~]# lsof -i :873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 21310 root 3u IPv4 157098 0t0 TCP *:rsync (LISTEN)
rsync 21310 root 5u IPv6 157099 0t0 TCP *:rsync (LISTEN)
面试题:如何查看某个端口对应哪一个服务?
配置密码文件
[root@nicy ~]# echo "rsync_backup:joinlabs" > /etc/rsync.password
#"用户:密码" 虚拟用户不需要创建
[root@nicy ~]# chmod 600 /etc/rsync
rsyncd.conf rsync.password
[root@nicy ~]# chmod 600 /etc/rsync.password
[root@nicy ~]# ls -l /etc/rsync.password
-rw-------. 1 root root 20 Mar 8 01:16 /etc/rsync.password
(2)服务端配置完成。
客户端配置:
方法一:
[root@localhost ~]# systemctl restart rsync.service
[root@localhost ~]# echo "joinlabs" > /etc/rsync.password
[root@localhost ~]# chmod 600 /etc/rsync.password
[root@localhost ~]# ls -l /etc/rsync.password
-rw-------. 1 root root 9 Mar 8 08:54 /etc/rsync.password
方法二:
[root@localhost ~]# echo 'export RSYNC_PASSWORD=joinlabs' >> /etc/bashrc
[root@localhost ~]# tail -1 /etc/bashrc
export RSYNC_PASSWORD=joinlabs
[root@localhost ~]# . /etc/bashrc
客户端配置完成。
(3)守护进程模式,客户端rsync的命令语法:
配置服务器守护进程,实现数据传输:1、服务器守护进程;2客户端执行命令。
Pull,拉:从远端拉取到本地;
语法一:
rsync | [OPTION…] | [USER@]HOST::SRC… | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | [虚拟用户]@主机地址::模块名… | 本机路径 |
语法二:
rsync | [OPTION…] | rsync://[USER@]HOST/SRC… | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | rsync://[虚拟用户]@主机地址/模块名… | 本机路径 |
push,推:从本地推到远端;
rsync | [OPTION…] | [DEST] | [USER@]HOST::SRC… |
---|---|---|---|
rsync命令 | 参数选项 | 本机路径 | [虚拟用户]@主机地址:模块名… |
语法二:
rsync | [OPTION…] | [DEST] | rsync://[USER@]HOST/SRC… |
---|---|---|---|
rsync命令 | 参数选项 | 本机路径 | rsync://[虚拟用户]@主机地址/模块名… |
注意双引号。
(4)测试成果
[root@clent ~]# rsync -avz /etc/redhat-release rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
sending incremental file list
redhat-release
sent 135 bytes received 34 bytes 338.00 bytes/sec
total size is 45 speedup is 0.27
客户端按方法二配置不需要–password-file=/etc/rsync.password。
2.3 rsync选项说明
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
企业常用参数组合:-avz或者 -vzrtopg。
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,关于更完整更详细的选项说明,rsync man手册翻译。
2.4 rsync的功能应用扩展
2.4.1 排除指定目录和文件数据复制
操作准备
[root@clent ~]# mkdir /opt/{{a..z},{A..Z}}
[root@clent ~]# touch /opt/{{a..z},{A..Z}}/{1..9}
[root@clent ~]# tree /opt/
/opt/
├── a
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ ├── 5
│ ├── 6
│ ├── 7
│ ├── 8
│ └── 9
├── A
│ ├── 1
... ...
例题一:排除/opt里的N,i,c,y目录
#方法一:多选项
[root@clent ~]# rsync -avz /opt/ --exclude=N --exclude=i --exclude=c --exclude=y rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
#方法二:不连续文件名可以用逗号分隔(推荐)
rsync -avz /opt/ --exclude={N,i,c,y} rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
例题二:排除/opt里面的abcd目录
#连续名字用法
[root@clent ~]# rsync -avz /opt/ --exclude={a..d} rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
例题三:排除/opt下每个目录里名为1,2,3,4,5的文件
#按文件内容排除
[root@clent ~]# seq 1 5 >no.txt
[root@clent ~]# cat no.txt
1
2
3
4
5
[root@clent ~]# rsync -avz /opt/ --exclude-from=no.txt rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
2.4.2 两端目录和文件数据一致性操作
慎用!!!
rsync作为镜像,相当于raid1,让两台服务器保持一致
–delete
推送:本地有啥,远端就有啥;
rsync -avz --delete /opt/ rsync_backup@10.0.0.123::backup --password-file=/etc/rsync.password
拉取:远端有啥,本地就有啥。
rsync -avz --delete rsync_backup@10.0.0.123::backup /opt/
2.4.3 断点续传和限速(了解即可)
--partial
--partial-dir=DIR
--bwlinit=KBPS
例题:某企业高峰期,DBA人员通过rsyn备份数据库上百G数据,导致带宽占满,用户反映无法打开公司网站。可以通过--bwlinit解决。
三、Rsync企业应用
3.1 rsync排错思路
排错必备思想:要对部署流程步骤熟练,熟悉rsync数据同步原理,并且要学会多看日志,rsync命令行输出的日志文件为/var/log/rsyncd.log。
排错能力练习:模拟错误,重视日常错误总结。
3.2 rsync服务端排错
查看rsync服务配置文件路径是否正确,正确的默认路径为/etc/rsyncd.conf。
查看配置文件里host allow,host deny,允许的ip网段是否是允许客户端访问的ip网段。
查看配置文件中path藏书里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组)。
查看rsync服务是否启动,查看命令为:ps -ef|grep rsync。端口是否存在netstat lnt|grep 873。
查看iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭。
查看服务端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,正确格式用户名 密码,文件路径和配置文件里的secrect files参数对应。
如果是推送数据,要查看一下,配置rsyncd.conf文件中用户是否对模块下目录有可读可写的权限。
3.2.1 rsync服务端常见报错整理
3.3 rsync客户端排错思路
3.3.1 rsync客户端常见报错整理
3.4 Rsync复制工具的优缺点
3.4.1 Rsync的优点
增量备份,支持socket(daemon)守护进程模式,集中备份(支持推拉模式备份)。
远程SHELL通道模式还可以加密(SSH)传输;
socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务。
3.4.2 Rsync的缺点
大量小文件复制的时候,rsync进程可能会僵死或效率不高。
一次性远程拷贝可以用scp,如果大量小文件可打成压缩包再拷贝。
3.5 Rsync服务安全
3.5.1 利用软件自身参数实现安全复制
rsync服务的安配置信息说明:
hosts allow = 10.0.0.0/24
hosts deny = 0.0.0.0/32
#两个参数不能同时配置不然会导致安全策略冲突造成失效的情况
3.6 Rsync企业常用工作场景
3.6.1 服务器之间数据备份(手工或定时任务cron+rsync)
在集群架构中,搭建一台备份服务器,用于全网服务器的数据备份工作。利用手工或定时任务能将所有服务本地重要的数据定时备份到rsync备份服务器上。
该工作场景一般用于程序代码以及运维人员对系统的配置变更的备份。
3.6.2 两台服务器之间实时数据复制(实时任务inotify/sersync+rsync)
四 Rsync企业全网备份项目案例介绍与实践
4.1 项目前言介绍
4.2 项目需求说明
某公司有一台web服务器,里面的数据很重要,但如果数据坏了,数据就会丢失,现在领导要求把数据做备份,这样web服务器上的数据就可以进行恢复,要求如下:
每天晚上0点整web服务器A上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送到服务器B上备份保留(备份思路可以事先在本地按日期打包,然后再推送到备份服务器B上)。
已知3台服务器主机名为web01、backup、nfs01主机信息见下表:
全网备份主机信息表
服务器说明 | 外网ip(nat)ssh | 内网ip(nat)交换数据用 | 主机名 |
---|---|---|---|
nginx web服务器 | 10.0.0.7/24 | 172.16.1.7/24 | web01 |
NFS存储服务器 | 172.16.1.31/24 | nfs01 | |
rsync备份服务器 | 172.16.1.41/24 | backup |
备份要求
每天晚上0点整再web服务器上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送备份服务器backup上备份保留。
备份思路
可以事先在本地按日期打包,然后再推送到备份服务器backup上;NFS存储服务器上web服务器实际工作中就是运维主要管理的全部服务器。
4.3 项目实战部署
4.3.1 服务器创建
初始化3台服务器,作为全网方案测试测试服务器,配置如下表:
服务器说明 | 网络地址规划 | 服务器系统信息 | 主机名 |
---|---|---|---|
nginx web服务器 | 10.0.0.7/24 | CentOS Linux release 8.0 | web01 |
NFS存储服务器 | 172.16.1.31/24 | nfs01 | |
rsync备份服务器 | 172.16.1.41/24 | backup |