3.2 Rsync工作方式介绍与实践
Rsync有3种传输数据模式,具体介绍如下。
1.本地(Local)数据传输模式
Rsync的本地数据传输模式,很类似于cp本地复制命令,可以实现文件、目录的移动备份等功能,所不同的是Rsync有增量复制的功能。
2.远程Shell数据传输模式
远程Shell数据传输模式一般是借助通道(如SSH)在两台服务器之间进行复制数据,这两台服务器之间是对等的,没有客户端与服务端之分,整个过程类似于scp远程复制命令,所不同的是Rsync有增量复制的功能,但缺少scp的加密复制的功能。
3.守护进程(Daemon)传输模式
守护进程传输模式是在客户端与服务端之间进行数据复制的,通常需要服务端部署守护进程服务,然后在客户端执行命令,实现数据的拉取和推送复制。
以上几种Rsync的工作方式,可以通过man rsync帮助或者查看官方手册获得。下面分别对上面3种模式进行详细说明,帮助初学者掌握Rsync软件工具的应用。
3.2.1 本地数据传输模式
1.本地数据传输模式语法
了解了上文介绍的本地数据传输模式以后,下面来了解下该模式的命令语法,如表3-1所示。
表3-1 本地模式命令语法格式说明
2.本地数据传输模式实践
(1)作为本地复制命令应用(类似cp命令)
实例一:利用rsync命令实现本地文件的复制,命令如下。
[root@backup ~]# cd /tmp/ [root@backup tmp]# ls [root@backup tmp]# rsync /etc/hosts /tmp/ #<==实现hosts文件本地复制。 [root@backup tmp]# ls hosts 说明:根据以上操作信息,实现了本地拷贝文件操作。
实例二:利用rsync命令实现复制本地目录,命令如下。
[root@backup tmp]# mkdir /oldboy_dir -p #<==创建测试目录。 [root@backup tmp]# touch /oldboy_dir/file{1..5}.txt #<==在测试目录中,创建5 个测试文件。 [root@backup tmp]# ls /oldboy_dir/ file1.txt file2.txt file3.txt file4.txt file5.txt [root@backup tmp]# rsync /oldboy_dir /tmp/ #<==直接复制目录会显示报 错信息。 skipping directory oldboy_dir [root@backup tmp]# rsync -r /oldboy_dir /tmp/ #<==复制目录需要加入-r 参数。 [root@backup tmp]# ls hosts oldboy_dir #<==本地目录复制成功。 [root@backup tmp]# ls oldboy_dir/ file1.txt file2.txt file3.txt file4.txt file5.txt #<==测试目录中数据也复制 成功。 说明:根据以上操作信息,实现了本地拷贝目录操作。
(2)作为删除数据命令应用(类似rm命令)
实例一:利用rsync命令的删除功能清空文件内容,命令如下。
[root@backup tmp]# mkdir /opt/null -p #<==创建一个空目录。 [root@backup tmp]# rsync -r --delete /opt/null/ /tmp/ #<==清除/tmp下所有内容。 [root@backup tmp]# ls #<==已删除。 说明:利用上面所学的本地复制命令结合删除功能参数--delete,对tmp目录进行清除。 提示:在使用--delete删除功能参数时,必须结合-r或-d参数使用。
实例二:利用rsync命令的删除功能清空文件内容,命令如下。
[root@backup tmp]# echo "www.oldboyedu.com" >file1.txt #<==生成测试文件。 [root@backup tmp]# cat file1.txt www.oldboyedu.com [root@backup tmp]# touch null.txt #<==创建空文件null.txt,利用空文件实现对相应file1.txt文件内容的清除。。 [root@backup tmp]# rsync -r --delete /tmp/null.txt file1.txt #<==利用rsync命令删除功能实现对文件数据信息清除。 [root@backup tmp]# cat file1.txt #<==数据信息已清除
通过以上实践操作,相信大家已经对rsync命令数据删除功能有所了解,以上实践操作只是利用--delete参数与本地复制命令结合,实现本地数据的删除。同理,可利用--delete参数与远程复制命令结合,实现对远程数据的删除,这部分内容见后续章节。
提示:在使用rsync命令对目录数据进行本地或远程复制时,目录名称后面是否加“/”,产生的复制效果是不一样的。目录后面不加“/”,会将/oldboy_dir目录及目录下面的文件内容一并复制到tmp目录中;如果目录后面加“/”,会将/oldboy_dir目录下面的文件内容复制到tmp目录中,但oldboy_dir目录本身没有被复制。
(3)作为查询数据命令应用(类似ls命令)
实例:利用rsync命令的查询功能查看文件和目录信息
[root@backup tmp]# rsync /etc/hosts #<==查询文件信息。 -rw-r--r-- 3322019/04/10 22:07:43 hosts [root@backup tmp]# rsync /etc drwxr-xr-x 8,1922019/04/11 20:42:54 etc #<==查询目录信息。 说明:根据以上操作信息,实现了查询数据信息功能。
通过以上实践操作,相信大家已经对rsync命令的查询数据功能有所了解。
3.2.2 远程Shell数据传输模式
1.远程Shell数据传输模式语法
远程Shell数据传输模式分为拉取和推送两种模式,拉取是指从远端服务器把数据拉取到本地服务器;推送是指把数据从本地服务器推送到远端服务器,这两种传输方式的语法格式如下。
(1)拉取(Pull)
远程Shell传输数据拉取语法说明如表3-2所示。
表3-2 拉取模式语法格式说明
(2)推送(Push)
远程Shell传输数据推送语法说明如表3-3所示。
表3-3 推送模式语法格式说明
注意:Pull和Push的区别就是[USER@]HOST:SRC...和DEST位置对调而已。
根据以上语法格式信息画图对推拉概念进行说明,如图3-2所示。
图3-2 Rsync数据传输推拉原理图
2.远程Shell数据传输模式实践
实践一:利用拉取模式从远端服务器把/etc/hosts复制到本地/tmp。具体实现过程如下:
[root@nfs01~]# rsync -av -e 'ssh -p 22' root@172.16.1.41:/etc/hosts /tmp #<==借助-e参数指定数据传输方式为ssh隧道加密传输,/tmp目录为当前命令行的本地目录。 #<==如果ssh端口是默认的22,命令中的-e 'ssh -p 22’部分可以省略。 Are you sure you want to continue connecting (yes/no)? yes #<==首次需输入yes。 Warning: Permanently added '172.16.1.41' (ECDSA) to the list of known hosts. root@172.16.1.41's password: #<==输入41服务器的root密码。 receiving incremental file list hosts sent 43 bytes received 243 bytes 44.00 bytes/sec total size is 158 speedup is 0.55 说明:利用服务器B作为参照服务器,将远程服务器A(172.16.1.41)上的数据进行拉取同步。
实践二:利用推送模式从本地服务器把/etc/hosts复制到远端主机的/tmp。具体实现过程如下:
[root@nfs01~]# rsync -av /etc/hosts root@172.16.1.41:/tmp #<==省略-e参数,/tmp目录为远程服务器的目录,/etc/hosts为本地文件。 root@172.16.1.41's password: #<==输入nfs01服务器的root密码。 sending incremental file list hosts sent 243 bytes received 35 bytes 61.78 bytes/sec total size is 158 speedup is 0.57 说明:利用服务器nfs01作为参照服务器,将本地服务器nfs01上的数据进行推送同步。
通过以上两个实践操作过程,相信读者已经熟悉推和拉的概念与作用了。
提示:
1)采用远程Shell数据传输模式,每次都需要输入远程主机密码信息,无法实现免交互;因此需要配合SSH key免密码登录来完成数据免交互同步。
2)该复制使用系统用户进行存在安全隐患,而使用普通用户进行又会导致权限不足。
3)实际工作中守护进程传输方式是更重要的方式。
3.2.3 守护进程传输模式
1.守护进程传输模式语法
守护进程传输模式是在客户端与服务端之间进行数据复制的,通常需要服务端部署守护进程服务(后文会讲解部署),然后在客户端执行命令,实现数据的拉取和推送复制,即把数据推送到服务器端,或者从服务器端把数据拉取到本地客户端,这两种传输方式的客户端命令又有不同的语法格式,具体说明如下。
1)拉取模式的两种语法格式说明如表3-4、表3-5所示。
表3-4 第一种拉取模式语法格式说明【笔者推荐】
表3-5 第二种拉取模式语法格式说明
2)推送模式的两种语法格式说明如表3-6、表3-7所示。
表3-6 第一种推送模式语法格式说明
通过语法说明不难发现,拉取和推送数据传输模式拥有的两种语法格式作用是完全相同的,可以根据用户自身命令语法记忆习惯选择其一,本书以第一种拉取和推送模式为例进行讲解。
通过对守护进程传输语法的介绍,可以看出其应用方法与远程Shell传输模式类似,但是如果想采用守护进程传输模式进行实际复制传输数据,还必须要额外部署Rsync Daemon服务才行,下面会对守护进程传输模式的部署过程进行说明。
2.守护进程传输模式实践
(1)部署前准备工作
第一步:部署环境准备
考虑到很多读者没有实际的生产环境,本文使用VMware虚拟机环境下Linux主机来进行试验,和生产环境的真实服务器部署几乎没区别。
本书采用的CentOS7.6系统相关信息如下:
[root@nfs01~]# cat /etc/redhat-release #<==查看操作系统信息。 CentOS Linux release 7.6.1810 (Core) [root@nfs01~]# uname -r #<==查看内核信息。 3.10.0-957.1.3.el7.x86_64 [root@nfs01~]# uname -m #<==查看系统是32位还是64位。 x86_64 [root@nfs01~]# rpm -qa rsync #<==Rsync软件信息。 rsync-3.1.2-4.el7.x86_64 说明:Rsync软件默认系统已经安装,若未安装可以通过yum命令进行安装。
网络拓扑配置参见表3-8。
表3-8 Rsync守护进程模式网络拓扑地址规划表
第二步:具体需求
要求在Rsync备份服务器(BACKUP)上以rsync守护进程的方式部署Rsync服务,使得所有Rsync节点客户端主机,可以把本地数据通过rsync命令的方式备份数据到数据备份服务器Rsync服务器上。本例的客户端服务器以Web01服务器、NFS服务器为例讲解说明。
第三步:备份数据架构拓扑
参照图3-3进行Rsync守护进程模式服务器架构部署搭建,并且以远程数据同步方式由客户端节点向服务端推送数据。
图3-3 Rsync服务守护进程模式部署架构图
图3-4 R s y n c服务守护进程客户端访问原理
(2)Rsync服务器端部署
表3-9为Rsync守护进程操作步骤以及形象记忆比喻。
表3-9 Rsync守护进程操作步骤说明
1)配置rsyncd.conf。
提示:Rsync守护进程模式服务需要部署在BACKUP服务器上,即172.16.1.41服务器上。
编写rsyncd.conf单模块配置文件,命令如下。
#说明:增加如下配置,/etc/rsyncd.conf为默认的Rsync服务的配置文件路径及文件名, #特别注意,是rsyncd.conf不是rsync.conf。 cp /etc/rsyncd.conf{, .ori} cat >/etc/rsyncd.conf<<EOF #rsync_config_______________start #created by oldboy #site: http://www.oldboyedu.com uid = rsync gid = rsync fake super = yes #<==CentOS7比CentOS6增加的参数。 use chroot = no max connections = 200 timeout = 600 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 = 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 # hosts allow和hosts deny不要同时存在,否则可能导致功能不生效。 # 如果使用普通用户Rsync,则fake super = yes需要加上,否则系统会报错(CentOS7特有)。
表3-10所示为Rsync服务配置文件常用参数说明。
表3-10 Rysnc服务配置文件参数说明
提示:
1)模块中的参数项可以拿到全局配置中(放到模块前面)使用。
2)以上配置参数为老男孩经常使用的参数,正常情况下掌握这些已足够。
3)更多参数可执行man rsyncd.conf查看。
2)配置用于数据备份的目录。
如果配置文件里配置了“path = /backup”,这里的/backup备份目录默认不存在,创建命令如下。
[root@backup ~]# useradd rsync -s /sbin/nologin -M #<==创建管理备份目录的用户。 [root@backup ~]# mkdir -p /backup #<==创建BACKUP备份目录 [root@backup ~]# chown -R rsync.rsync /backup #<==授权Rsync用户和组管理 /backup用户。
3)配置用于Rsync复制的账号、密码及账号文件权限。
在Rsync服务端创建用于在Rsync客户端与服务端进行验证的账号和密码,并将其写入文件。
创建服务认证账号和密码文件的命令如下。
[root@backup ~]# echo "rsync_backup:oldboy" >/etc/rsync.password #<==将账号和密码写入文件。 [root@backup ~]# chmod 600 /etc/rsync.password #<==文件必须为600权限。 #说明:其中rsync_backup:oldboy中的rsync_backup为同步传输用到的虚拟账号,这个账号仅 为Rsync服务的认证账号,不需要是系统账号,也不需要创建该账号。后面的oldboy为密码, 不超过8位。账号和密码中间用冒号分隔。
检查认证文件信息的命令如下。
[root@backup ~]# cat /etc/rsync.password #<==操作完检查是个好习惯。 rsync_backup:oldboy #<==注意账号密码格式。 [root@backup ~]# ll /etc/rsync.password -rw-------1 root root 40 2月 8 23:12 /etc/rsync.password #<==600权限。
4)启动Rsync服务以及检查确认。
Rsync服务启动、开机自启动及检查等操作过程的命令如下。
[root@backup ~]# systemctl start rsyncd #<==启动Rsyncd,也可以使用rsync --daemon启动。 [root@backup ~]# systemctl enable rsyncd #<==设置开机自启动。 [root@backup ~]# systemctl status rsyncd #<==检查启动状态和开机自启动状态。 ● rsyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2019-04-12 19:44:31 CST; 17s ago Main PID: 7772 (rsync) CGroup: /system.slice/rsyncd.service └—7772 /usr/bin/rsync --daemon --no-detach [root@backup ~]# ps -ef|grep rsync|grep -v grep #<==检查进程。 root 7450 1 0 19:33 ? 00:00:00 rsync --daemon [root@backup ~]# netstat -lntup|grep rsync #<==检查Rsync服务应用的端口是否 已处于监听状态。 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7450/rsync tcp6 0 0 :::873 :::* LISTEN 7450/rsync # 说明:以上操作均是Rsync服务端本地检查服务与端口是否正常。 # 执行lsof -i :873也可以检查端口。
(3)Rsync客户端操作过程
Rsync客户端操作过程如下:
❑ 确认是rsync命令是否存在。
❑ 创建与Rsync服务端建立连接所需的密码文件,并进行授权,权限为600。
配置Rsync账号及账号文件权限
以下内容信息为Rsync客户端认证文件配置信息,注意要与服务端的配置区别。客户端172.16.1.31(nfs01)和172.16.1.7(web01)分别做如下操作,此处仅利用NFS01主机进行演示说明,Web01主机操作相同,不再赘述。
客户端的配置方法有以下两个。
方法一:配置密码文件方式(常用)
[root@nfs01~]# echo "oldboy" >/etc/rsync.password #<==这里oldboy密码必须和 服务器端相同。 #<==客户端密码认证文件里仅配置了密码,不需要账号了。这是与服务端的区别。 [root@nfs01~]# chmod 600 /etc/rsync.password #<==必须为600权限。 [root@nfs01~]# cat /etc/rsync.password #<==验证认证文件配置信息是否 正确。 oldboy #<==必须和服务器端密码信息 相同。 [root@nfs01~]# ll /etc/rsync.password #<==验证认证文件权限信息是否 正确。 -rw-------1 root root 7 2月 7 16:48 /etc/rsync.password
方法二:配置特殊变量RSYNC_PASSWORD
[root@nfs01~]# export RSYNC_PASSWORD=oldboy #<==临时生效配置。 [root@nfs01~]# echo ' export RSYNC_PASSWORD=oldboy' >>/etc/bashrc #<==永久生效配置。 [root@nfs01~]# tail -1 /etc/bashrc export RSYNC_PASSWORD=oldboy [root@nfs01~]# . /etc/bashrc [root@nfs01~]# echo $RSYNC_PASSWORD oldboy 提示:采用环境变量的方式要注意将来使用定时任务执行rsync命令备份时要重新定义这个密码变量。
至此,Rsync守护进程方式服务端和客户端的配置大功告成。
(4)测试数据同步效果
1)推送:从客户端同步文件或目录到服务器端。
从客户端推送/etc目录到服务器端Rsync指定的目录(这里为/backup)下,
[root@nfs01~]# rsync -avzP /etc rsync_backup@172.16.1.41::backup --password- file=/etc/rsync.password building file list ... 1740 files to consider ...中间输出省略 ...... etc/yum/pluginconf.d/fastestmirror.conf 143 100% 0.46kB/s 0:00:00 (xfer#992, to-check=0/1740) sent 5557304 bytes received 26328 bytes 587750.74 bytes/sec total size is 53434678 speedup is 9.57 [root@nfs01~]# export RSYNC_PASSWORD=oldboy #<==如果前文使用了方法二,此步可省。 [root@nfs01~]# rsync -avzP /etc rsync_backup@172.16.1.41::backup #<==省略冗长的密码文件参数。 sending incremental file list sent 54,970 bytes received 646 bytes 111,232.00 bytes/sec total size is 31,237,780 speedup is 561.67
这时我们查看服务器端指定的Rscyn备份目录/backup,发现已经有了etc目录及文件。
[root@backup ~]# ls /backup/ etc [root@backup ~]# du -sh /backup/ 35M /etc
以上同步传输命令拆解简要说明如下。
rsync -avzP /etc rsync_backup@172.16.1.41::backup/ --password-file=/etc/ rsync.password # -avzP /etc解释说明。 -a #<==保持文件原有属性的若干参数。 -z #<==对传输的数据进行压缩传输。 -v #<==是指显示出详细的传输情况。 -P --progress #<==显示文件传输过程中的进度信息。 /etc #<==要推送的本地目录。 # rsync_backup@172.16.1.41::oldboy/解释说明。 rsync_backup #<==rsync同步数据的虚拟认证用户。 @172.16.1.41::backup #<==为要推送的目的地的(Rsync服务端)IP地址及模块名称。 说明:IP和模块名称之间有两个冒号,且双冒号后的backup是/etc/rsyncd.conf配置文件中的 [模块名]中的模块名,而非目录名。 #--password-file=/etc/rsync.password解释说明。 --password-file #<==客户端本地密码文件,可用环境变量RSYNC_PASSWORD替代。
2)拉取:从服务器端同步文件或目录到客户端。
从服务器端Rsync指定的目录下拉取所有文件到本地客户端目录/opt。执行命令如下。
rsync -avz rsync_backup@172.16.1.41::backup /opt/ --password-file=/etc/rsync. password
还可以拉取或推送模块目录下的指定目录或文件,以下为拉取命令。
[root@nfs01 ~]# rsync -vzrtopg rsync_backup@172.16.1.41::backup/etc/hosts / opt \ --password-file=/etc/rsync.password
(5)Rsync客户端命令参数选项
之前内容中已经看到了很多rsync命令参数,现在就来详细了解一下rsync命令的同步参数选项,彻底熟悉一下这些参数,特别强调,是Rsync客户端命令的参数。
常用参数选项说明如表3-11所示。
表3-11 Rsync客户端命令对应的常用参数说明表