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

3.3 Rsync功能应用拓展

3.3.1 多模块复制应用

前文讲述的拉取数据访问的都是服务器端的/backup目录,那么,能不能同时从其他指定目录下拉取呢?答案是肯定的。

修改rsyncd.conf配置实现多模块配置

1)最简单的实现,可以在配置文件结尾加如下内容(特殊底纹部分):

        [root@backup ~]# cat /etc/rsyncd.conf
        #rsync_config____________start
        #created by oldboy
        #site: http://www.oldboyedu.com
        uid = rsync
        gid = rsync
        use chroot = no
        fake super = yes
        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/
        [data]          #<==新模块。
        path = /data/  #<==新备份目录。
        #除了增加以上两行命令外,读者也可以设定更多的独立配置参数,如独立虚拟用户、独立密码文件等。

2)建立目录并授权。

        [root@backup ~]# mkdir -p /data
        [root@backup ~]# chown -R rsync.rsync /data
        [root@backup ~]# ls -ld /data
        drwxr-xr-x 2 rsync rsync 6 4月  16 10:04 /data

3)重启Rsync服务(只要修改配置,就考虑重载服务)。

        [root@backup ~]# systemctl restart rsyncd

4)从客户端访问测试。

        [root@nfs01 /data]# touch oldboy.txt
        [root@nfs01 /data]# rsync -avz /data   rsync_backup@172.16.1.41::data
        sending incremental file list
        data/
        data/oldboy.txt
        sent 123 bytes   received 47 bytes   340.00 bytes/sec
        total size is 0   speedup is 0.00

5)然后在服务端查看。

        [root@backup ~]# ls /data
        data

3.3.2 排除指定目录和文件数据复制

1.实践准备工作(Rsync服务器端操作)

        [root@backup ~]# cd /backup
        [root@backup backup]# mkdir {a..d}
        [root@backup backup]# touch a/1 b/2 c/3 d/4
        [root@backup backup]# tree /backup/
        /backup/
        |-- a
        |    '--1
        |-- b
        |    '--2
        |-- c
        |    '--3
        '-- d
            '--4

我们建立了a、b、c、d 4个目录,目录下的文件分别为1、2、3、4,其中/backup目录为Rsync服务器端指定的备份同步目录。

2.实践复制数据并排除指定目录和文件

本节以在Rsync客户端(nfs01:172.16.1.31)上执行拉取文件的操作,即从服务器端同步文件到客户端为例进行讲解,推送的方式是一样的。

方法一:通过Rsync客户端命令加命令行参数实现

同步数据过程中,假定要排除a、c目录(包括内部文件)及b目录下的2文件,其他同步,实践操作过程如下:

        [root@nfs01~]# ls -l /mnt
        total 0
        [root@nfs01~]# rsync --exclude=a --exclude=b/2--exclude=c -avzrtopgP \
        rsync_backup@172.16.1.41::backup/ /mnt   --password-file=/etc/rsync.password
        receiving file list ...
        4 files to consider
        ./
        b/
        d/
        d/4
                    0100%     0.00kB/s     0:00:00 (xfer#1, to-check=0/4)
        sent 174 bytes   received 197 bytes   247.33 bytes/sec
        total size is 0   speedup is 0.00
        [root@nfs01~]# tree /mnt
        /mnt
        |-- b
        '-- d
            '--4
        2 directories, 1 file

通过rsync同步的过程及使用tree命令可以清晰地看出仅b目录本身和d目录及内部的文件同步过来了。这正是预想的结果,因此在rsync命令的参数的大家庭中,又可以融入两个命令参数。

        --exclude=PATTERN          #<==表示分别排除匹配上的文件信息。
        --exclude-from=FILE        #<==表示将要匹配的文件或目录信息汇总写入到一个文件中。

排除文件的编写形式如下,以上文中利用--exclude参数排除文件和目录的方式为例,如果改为--exclude-from的排除方法,排除文件的命令如下:

        [root@nfs01~]# vim exclude-file.txt
        a
        b/2
        c
        [root@nfs01~]# rsync --exclude-from=./exclude-file.txt -avzP \
        rsync_backup@10.0.0.19::oldboy/ /mnt/ --password-file=/etc/rsync.password
        receiving incremental file list
        ./
        b/
        d/
        d/4
                    0100%     0.00kB/s     0:00:00 (xfer#1, to-check=0/4)
        sent 117 bytes   received 196 bytes   626.00 bytes/sec
        [root@nfs01~]# tree /mnt
        /mnt
        |-- b
        '-- d
            '--4
        2 directories, 1 file

方法二:通过在服务器端配置rsyncd.conf参数实现

注意:在Rsync服务器端[IP为10.0.0.41]上执行操作。

vi /etc/rsyncd.conf修改为如下配置:

        exclude=a c b/2
        说明:仅增加了一行 内容为:exclude=a c b/2, exclude为排除目录或文件的参数,表示排除a、
              c目录及b目录的2文件。文件和目录之间用空格隔开,所有目录及文件为相对于模块的目录。

执行重启命令后测试,结果依然是仅b目录本身和d目录及内部的文件同步过来了。

客户端rsync命令排除总结

1)利用客户端rsync命令排除单个文件的命令如下:

        rsync -avz --exclude=a /data1/ rsync_backup@172.16.1.41::oldboy   --password-
            file=/etc/rsync.password

2)利用客户端rsync命令排除多个文件的命令如下:

        rsync  -avz  --exclude={a, b}  /data1/  rsync_backup@172.16.1.41::oldboy
            --password-file=/etc/rsync.password
        rsync  -avz  --exclude=a  --exclude=b  /data1/  rsync_backup@172.16.1.41::oldboy
            --password-file=/etc/rsync.password
        rsync  -avz  --exclude={a..g}  /data1/  rsync_backup@172.16.1.41::oldboy
            --password-file=/etc/rsync.password

从文件中排除文件的命令如下:

        rsync -avz --exclude-from=paichu.log /data1/ rsync_backup@172.16.1.41::oldboy
            --password-file=/etc/rsync.password

3)在服务器端指定排除参数的写法是:在/etc/rsyncd.conf里加exclude=a b test/oldboy.txt参数及要排除的文件,不推荐在服务器端进行配置,不灵活。

3.3.3 主机之间数据无差异复制说明

要实现这种同步方式就要使用Rsync的--delete参数了。所谓的无差异复制,就是不管是拉取还是推送,都要保持两边的数据完全一致,如图3-5所示。

图3-5 Rsync无差异复制示意图

1)本地推送式删除示例如下。

        mkdir null
        rsync -avzP --delete null/ /mnt/  #<==null为空,因此/mnt内的数据都会被删。

2)拉取数据无差异同步方式的命令如下。

        rsync -avz --delete rsync_backup@172.16.1.41::backup /test/ --password-file=/
            etc/rsync.password
        #<==BACKUP服务器端没有的数据,/test里有的都会删除,和BACKUP模块里的保持一致。

拉取方式表示远程服务器端变化的文件,如删除了文件,那么,本地客户端的数据要保持和服务器端一致,即服务器端删除了什么内容,本地客户端就会删除什么内容,始终和服务器端保持数据一致。

这个命令非常危险,使用不当会造成本地目录及文件,甚至是/根目录数据丢失。因此要特别注意小心使用。

3)推送数据无差异同步方式的命令如下。

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

推送方式表示本地客户端变化的文件,如删除了文件,那么,远程服务器端的数据要保持和客户端数据一致,即本地客户端删除什么内容,服务器端就会删除什么内容,始终和客户端保持数据一致。该命令同样非常危险,使用不当会造成远程服务器端目录及文件丢失。因此要特别注意小心使用。

针对无差异同步--delete拉取和推送知识总结及生产场景应用。

1)Rsync推送企业工作场景:数据备份、上传。

本地有什么,远端就有什么,本地没有的远端有也要删除,这会造成服务器端的目录数据丢失,备份和上传场景下一般不需要--delete功能,除非是像NFS实时复制数据到备份服务器上必须要保持两边一致的情形。

2)Rsync拉取企业工作场景:代码发布、下载。

远端有什么,本地(客户端)就有什么,远端没有的本地有也要删除。这会造成本地目录数据丢失。适用于无差异复制的两台服务器之间,要求数据必须一致,且实时性又不是很高的情况,如两台负载均衡下面Web服务器之间的同步,或者高可用双机配置之间的同步、NFS共享数据的实时复制等。Rsync无差异同步非常危险,而且有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。写了这么多内容的目的是警告读者,这个参数很危险,请慎用,切记。

3.3.4 Rsync断点续传和限速功能(了解)

1)Rsync在传输时支持大文件断点续传,相关参数如表3-12所示。

表3-12 Rsync大文件断点续传相关参数

默认情况下,利用rsync命令进行大文件数据传输时,不加上断点传输参数,在传输中断后,会发现部分传输的数据信息会被删除。加上断点传输参数,在传输中断后,会发现部分传输的数据信息依旧存在。

        rsync -avz --partial /tmp/data.txt 172.16.1.41:/backup

加上断点传输指定目录参数,在传输中断后,会发现部分传输的数据信息会保存在指定目录中。

        rsync -avz --partial-dir=/tmp/ /tmp/data.txt 172.16.1.41:/backup

测试结果省略。

2)rsync命令还可以实现限速传输,相关参数如表3-13所示。

表3-13 rsync命令限速传输相关参数

某上市公司,白天高峰期某DBA人员从数据库服务器通过rsync将上百GB数据复制到备份服务器,导致数据库服务器带宽占满,造成用户无法访问网站。其实可以利用rsync限速功能,将复制速度限制在剩余带宽的1/3或者1/2,可能就不会出现上述故障了,当然,高峰期最好不要做大数据复制行为,这里利用限速功能模拟测试。

        [root@oldboy backup]# dd if=/dev/zero of=test1 bs=1M count=128
        记录了128+0 的读入
        记录了128+0 的写出
        134217728字节(134 MB)已复制,4.83399 秒,27.8 MB/秒
        # 不限速的传输速率信息
        [root@oldboy  backup]#  rsync  -avzP  /backup/  rsync://rsync_backup@172.16.1.41/
            backup \
        --password-file=/etc/rsync.password
        sending incremental file list
        ./
        test1
            134217728100%    83.97MB/s     0:00:01 (xfer#1, to-check=0/11)
        sent 130687 bytes   received 30 bytes   10457.36 bytes/sec
        total size is 134217728   speedup is 1026.78
        # 限速的传输速率信息
        [root@oldboy  backup]#  rsync  -avzP  --bwlimit=100  /backup/  rsync://rsync_
            backup@172.16.1.41/backup
        --password-file=/etc/rsync.password
        sending incremental file list
        ./
        test1
            134217728100%    67.74MB/s     0:00:01 (xfer#1, to-check=0/11)
        sent 130687 bytes   received 30 bytes   15378.47 bytes/sec
        total size is 134217728   speedup is 1026.78
        说明:貌似没有起到什么效果,为什么呢,因为设置的限制速率已经远远大于默认的传输速率,应该设置得
              更小一些。
        [root@oldboy  backup]#  rsync  -avzP  --bwlimit=1  /backup/  rsync://rsync_
            backup@172.16.1.41/backup \--password-file=/etc/rsync.password
        sending incremental file list
        ./
        test1
            134217728100%     1.02MB/s     0:02:05 (xfer#1, to-check=0/11)
        sent 130687 bytes   received 30 bytes   1001.66 bytes/sec
        total size is 134217728   speedup is 1026.78
        说明:将设置的限速速率调小一些,传输限制的效果随即显示出来