跟老男孩学Linux运维:高性能Web集群实践(上)
上QQ阅读APP看书,第一时间看更新

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客户端命令对应的常用参数说明表