zoukankan      html  css  js  c++  java
  • rsync

    我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
    个人博客:传送阵
    笔者微信:zhanghe15069028807,非诚勿扰。

    一、概念

    1、rsync-server必知概念

    1. rsync 一个快速、通用的远程(和本地)文件备份工具。
    2. 默认占用tcp-873端口
    3. c/s架构,注意不是b/s,b/s是指带浏览器那样的。

    2、备份的模式

    备份的模式也就分为三种:推,拉,推拉结合

    何谓推?比如我们将本地的文件上传到百度云服务器做备份,这就是推。

    何谓拉?百度云有一个同步本地磁盘的功能,当我们在本地磁盘上做了更改之后,百度云盘会将我们做的更改“拉”走,同步到百度云的服务器上。

    什么是推拉结合呢?其实很简单,比如我们本地有一个备份服务器,集群中所有的服务器将重要文件定时推到备份服务器上,此时我们新增一个异地容灾服务器,它也要同步本地备份服务器上的内容,但本地备份服务器在内网,数据无法在公网上传输!昨办?我们现在再不讨论NAT端口映射,只考虑存储的话,我们也有一个比较好的解决方案。我们可以买一个云存储,将本地备份服务器上的数据全部推到云存储上,然后用异地的备份服务器将云存储的内容拉下来。

    二、rsync的三种备份模式

    rsync有三种备份模式:本地备份、远程备份、守护进程备份。

    本地备份

    我们经常使用cp也可以用来做本地备份,其实rsync其实也可以用来做本地备份。但我们平时用cp就可以了,短小精悍,如果本地备份也要用rsync的话,有一种杀鸡用宰牛刀的感觉,演示一下吧!

    rsync [OPTION...] SRC... [DEST]  #这就是本地备份的语法,简单至极,与cp一样
     
    [zhanghe@localhost ~]$ rsync /etc/issue /tmp
    [zhanghe@localhost ~]$ cat /tmp/issue 
    S
    Kernel 
     on an m
    

    远程备份

    远程备份,一看就要用到两台服务器,我们先来规划一下。

    • client:192.168.80.100
    • server:192.168.80.200

    我们上面提到过,备份分为三种模式,我们在这里面演示两种,在client演示,将本地的文件推送到服务器上和用clinet将服务器上文件拉下来。

    • Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #pull是下拉,别搞混了!
    • Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #push是推送
    [root@client ~]# rsync -avz root@192.168.80.200:/etc/issue /tmp
    #从客户端把服务器(80.200)的文件拉到本地的/tmp目录下,请先忽略avc是什么意思,我们下面会详细讲解的。
    The authenticity of host '192.168.80.200 (192.168.80.200)' can't be established.
    ECDSA key fingerprint is SHA256:57uTU9xPTEOp2Zt/LR3O9M9o0fpAlPxRn3CYL8i9fhg.
    ECDSA key fingerprint is MD5:48:98:4f:85:40:07:b4:6a:6b:d9:34:fc:67:47:be:d1.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.80.200' (ECDSA) to the list of known hosts.
    root@192.168.80.200's password: 
    receiving incremental file list
    issue
    
    sent 43 bytes  received 105 bytes  26.91 bytes/sec
    total size is 23  speedup is 0.16
    [root@client ~]# ls /tmp/issue 
    /tmp/issue
    
    [root@client ~]# echo zhanghehe > test.txt
    [root@client ~]# rsync -avz ./test.txt root@192.168.80.200:/tmp
    #将本地的test.txt文件上传到server服务器的/tmp目录下。
    [root@server ~]# ls /tmp/issue 
    /tmp/issue
    

    远程备份其实也是有缺点的,有什么缺点呢?

    1. 首先,你得知道远程服务器的登录密码,而且每次都得手动输入密码,这样风险太大!
    2. 其次 ,我们上面演示的时候用的都是最高权限的用户root,如果用普通用户的话,肯定会权限不足的。

    结论就是,rsync的远程备份模式平时偶尔用一用就可以了!

    既然远程备份缺点这么多,怎么办呢?那就是我们下面要说的守护进程备份,这种方式才是我们要讲的重点,也是我们在真实的环境当中使用的。

    守护进程备份

    安装、启动:

    [root@server ~]# yum -y install rsync    #默认就在后台运行
    [root@server ~]# systemctl start rsyncd 
    [root@server ~]# systemctl enable rsyncd
    [root@server ~]# systemctl status rsyncd 
    
    
    [root@server ~]# rpm -qc rsync
    /etc/rsyncd.conf
    /etc/sysconfig/rsyncd
    

    配置文件:

    第一份配置文件用于学习不能直接粘贴使用,因为配置文件后面加了#,会干扰配置的,如果要用的话,请用第二份。

    [root@server ~]# cat /etc/rsyncd.conf 
    uid = rsync    #使用哪个用户来运行rsync
    gid = rsync
    port = 873 
    fake super = yes   #忽略组的原始属性
    use chroot = no  #是否把用户固定到某一个目录,不能到处跑,关闭
    max connections = 200  #最大连接数
    timeout = 600   #超时时间
    ignore errors    #忽略错误
    read only = false  #是否只读,关闭,我们要的可不只是这些
    list = false     #是否只允许列表,关闭,我们要的可不只这些!
    auth users = rsync_backup      #定义登录的用户
    secrets file = /etc/rsync.passwd  #定义登录用户的密码文件
    log file = /var/log/rsync.log  #定义日志的位置
    [backup]   #模块的名称
    comment = welcome!
    path = /backup
    
    cat /etc/rsyncd.conf 
    uid = rsync
    gid = rsync
    port = 873 
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 600
    ignore errors
    read only = false
    list = false
    auth users = rsync_backup
    secrets file = /etc/rsync.passwd
    log file = /var/log/rsync.log
    [backup]
    comment = welcome!
    path = /backup
    

    根据上面定义的配置文件,我们要做以下几个事情:

    1. 创建rsync用户用来运行rsync服务,不创建家目录,不能登录。
    2. 创建登录用户,以及登录用户密码文件,并定义权限为600,记住,linux上的密码文件权限必须是600,密码的所有人和所属组不用搞成rsync
    3. 创建/bakcup目录,用来存放文件,并保证sync用户能在此目录下写入
    [root@server ~]# useradd -M -s /sbin/nologin rsync
    [root@server ~]# echo "rsync_backup:1" > /etc/rsync.passwd  #密码定义为1
    [root@server ~]# chmod 600 /etc/rsync.passwd
    [root@server ~]# mkdir /backup
    [root@server ~]# chown -R rsync:rsync /backup
    

    好,下面要在客户端上进行测试使用了

    Access via rsync daemon:

    ​ Push: rsync [OPTION...] SRC... [USER@]HOST::DEST #上传

    ​ Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #下载

    [root@client ~]# rsync -avz /etc/issue rsync_backup@192.168.80.200::backup   #上传
    rsync: failed to connect to 192.168.80.200 (192.168.80.200): No route to host (113)
    rsync: mkstemp ".issue.3ZZt8M" (in backup) failed: Permission denied (13)
    

    尽管我们已经考虑的很周到了,但是不可避免,还是出了以上两个错误,我们来仔细看一下,第一个报错说是没有主机路由,其实这两台主机是可以通信的,不存在路由问题,其实这是因为没有关闭防火墙,关了就好了。第二个错误说是错误拒绝,没有理由,权限我们问题已经很全面了,那是为什么呢?原因是因为selinux没关,关了就好了!

    后来复现实验的时候,又出现了一个错误,如下

    [root@Nfs tmp]# rsync -avz /tmp/test.txt rsync_backup@192.168.80.222::data
    Password: 
    @ERROR: auth failed on module data    #提示模块错误
    rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
    

    这个错误是因为配置文件后面后空格,导致的,删除了空格之后重启之后就好了。

    上面演示的是上传,我们下面演示下载是怎样的:

     rsync -avz rsync_backup@192.168.80.200::backup /tmp   #将bakcup模块里面的东西下载下来,
    

    三、选项讲解

    我们上面一起用avx这三个 选项,我们还没有来得及好好讲解呢!下面就来说一说。

    我们主要是记忆这三个,其余的会用就可以了。

    -a 归档模式传输,和cp -a的意思差不多

    -v verbose 输出详细信息

    -z 传输时进行压缩

    --exclude=指定排除文件,例如:

    [root@server backup]# touch zhanghe{01..10}   #在服务端创建10个文件
    [root@server backup]# ls
    zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    

    在客户端上如果我们不排除任何文件的话,就会把所有的文件都会下载下来,假设我们想要排除zhanghe01,如下:

    [root@client tmp]# rsync -avz --exclude=zhanghe01  rsync_backckup /tmp
    

    在客户端上如果我们不排除任何文件的话,就会把所有的文件都会下载下来,假设我们想要排除zhanghe01一直到zhanghe05这五个文件呢?我们把这个五个文件名写入到一个文件,让rsync命令直接读取这个文件,如下:

    [root@client tmp]# echo -e "zhanghe01
    zhanghe02
    zhanghe03
    zhanghe04
    zhanghe05" > paichu.list
    [root@client tmp]# cat paichu.list
    zhanghe01
    zhanghe02
    zhanghe03
    zhanghe04
    zhanghe05
    [root@client tmp]# rsync -avz --exclude-from=paichu.list  rsync_backup@192.168.80.200::backup /tmp
    

    --delete 客户端是什么样子服务器就应该是什么样子。客户端强制让服务器一致,有覆盖的意思,比较危险,如下所示:

    [root@server backup]# ls  #服务器上有10个文件
    zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    [root@client tmp]# ls   #客户端上只有6个
    paichu.list  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    [root@client tmp]# rsync -avz --delete rsync_backup@192.168.80.200::backup /tmp       #将服务器上backup目录强行同步到客户端
    [root@client tmp]# ls   #客户端就成了10个文件了
    zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    

    反过来写效果更危险:

    [root@client tmp]# ls    #客户端的/tmp目录什么都没有
    [root@client tmp]# 
    [root@server backup]# ls  #服务器这个目录有10个文件
    zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    [root@client tmp]# rsync -avz ./ rsync_backup@192.168.80.200::backup  #客户端正常上传
    [root@server backup]# ls  #由于/tmp里面什么都没有,所以不影响服务器的backup目录
    zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
    [root@client tmp]# rsync -avz --delete ./ rsync_backup@192.168.80.200::backup      #加上delete选项
    [root@server backup]# ls    #服务器的bakcup目录啥都没有了,太危险了,这操作,少用!慎用!
    [root@server backup]# 
    

    再来个限速的,限速真的非常重要,如果内部没有上网行为管理类的设备,一旦同步开启,就会加足马力,把内网的带宽完全占满,这是很常见的故障,所以我们在同步的时候,最好限定网速,通过--bwlimit 来限速,默认是单位是MB,我们先来看看如果不限速的话,带宽占用可以达到多少吧!

    [root@client tmp]# dd if=/dev/zero of=./1g.txt bs=1M count=1000   #在客户端上生成一个1g的文件
    [root@client tmp]# rsync -avzP ./1g.txt rsync_backup@192.168.80.200::backup    #-P就是显示传输速度
    Password: 
    sending incremental file list
    1g.txt
        462,389,248  44%  110.32MB/s    0:00:05    #如果不限速可达100多MB,下面我们限一下速度
    
    [root@client tmp]# rsync -avzP --bwlimit=10 ./1g.txt rsync_backup@192.168.80.200::backup     
    Password: 
    sending incremental file list
    1g.txt
        135,266,304  12%   10.13MB/s    0:01:28     #速度会一直保持在10M左右
    

    四、避免交互输入密码

    两种方法:

    1. 第一种方法是通过定义变量的方式
    2. 第二种方法是通过密码文件

    我们最常用的就是第一种方法,由于是写脚本的时候,如下所示:

    [root@web1 ~]# export RSYNC_PASSWORD=1
    [root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup
    

    第二种方法就是我们我们把密码提前写到文件里面,然后通过rsync命令调用

    [root@web1 ~]# echo 1 > /etc/rsync.pass   #先生成一个密码文件
    [root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup --password-file=/etc/rsync.pass  #通过参数调用
    ERROR: password file must not be other-accessible   #其他人权限错误,权限必须是600
    rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
    [root@web1 ~]# chmod 600 /etc/rsync.pass 
    [root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup --password-file=/etc/rsync.pass   #成功
    
  • 相关阅读:
    黑白逆向编程课程笔记 8.静&动态地址&偏移
    黑白逆向编程课程笔记 7.CE使用(2)
    黑白逆向编程课程笔记 6.CE使用(1)
    传奇资源
    分布式——分布式发号器
    SpringBoot——属性注入
    SpringBoot——启动与自动配置类查找
    Mybatis——Spring事务实现
    SpringAOP——事务实现
    Linux——IO技术
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12106461.html
Copyright © 2011-2022 走看看