Rsync远程同步实验

实验前准备
服务端:192.168.188.15
客户端:192.168.188.16
关闭防火墙
systemctl stop firewalld
setenforce 0

  1. 配置rsync源服务端
    1. 检查一下有没有rsync,一般系统会默认安装,没有就自己安装一下
      rpm -q rsync
      我这样就是已经安装了
    2. 修改配置文件
      vim /etc/rsyncd.conf
      添加以下配置项
      uid = root
      gid = root
      use chroot = yes                                                 
      address = 192.168.188.15
      port 873
      log file = /var/log/rsyncd.log
      pid file = /var/run/rsyncd.pid
      hosts allow = 192.168.188.0/24
      dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
      
      [wwwroot]                                                                
      path = /var/www/html
      comment = Document Root of www.dzd.com
      read only = yes
      # 如果采用匿名的方式,则不需要下面两行
      auth users = backuper
      secrets file = /etc/rsyncd_users.db
    3. 为备份账户创建数据文件
      这个文件默认是没有的,vim直接新建并编辑
      vim /etc/rsyncd_users.db
      我只有一个账户要登录,所以我就准备了一个,前面是用户名,后面是密码

      赋权,机密文件属性必须是600
      chmod 600 /etc/rsyncd_users.db
    4. 准备源目录
      创建并赋权,保证所有用户都有读取权限
      chmod +r /var/www/html
      ls -ld /var/www/html
    5. 启动rsync服务
      rsync --daemon
      查看一下端口是不是打开了
      netstat -anpt | grep rsync
  2. 测试
    1. 在客户端上将指定资源下载到本地/opt目录下进行备份
      rsync -avz backuper@192.168.188.15::wwwroot /opt/
  3. 客户端与服务端的双向同步
    1. 先把服务端rsync配置文件里的只读关掉,不然同步时无法写入
      vim /etc/rsyncd.conf

      重启服务
      先杀掉现在的进程
      kill $(cat /var/run/rsyncd.pid)
      rm -rf /var/run/rsyncd.pid
      然后再启动
      rsync --daemon
      更改一下源目录的权限,全给
      chmod 777 /var/www/html/
    2. 在客户端调整inotify内核参数
      在Linux内核中,默认的inotify机制提供了三个调控参数:
      max_queue_events:监控事件队列,默认值为16384
      max_user_instances:最多监控实例数,默认值为128
      max_user_watches:每个实例最多监控文件数,默认值为8192
      当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。
      我这里稍微提高一点
      vim /etc/sysctl.conf
      fs.inotify.max_queued_events = 16384
      fs.inotify.max_user_instances = 1024
      fs.inotify.max_user_watches = 1048576


      sysctl -p
    3. 在客户端安装inotify-tools
      cd /opt
      tar -zxvf inotify-tools-3.14.tar.gz -C /opt/
      cd /opt/inotify-tools-3.14
      ./configure
      make && make install
    4. 在一个终端先执行inotifywait命令,用来监控同步的目录,这里我们监视/opt/ky01目录
      inotifywait -mrqe modify,create,move,delete /opt/ky01
      #选项“-e”:指定要监控的事件,增(create),删(delete),改(modify)等
      #选项“-m”:持续监控
      #选项“-r”:递归整个目录
      #选项“-q”:简化输出信息
      我们另开一个终端,移动一个文件到我们监视的目录下
      mv /opt/jdk-8u201-linux-x64.rpm /opt/ky01/
      然后我们能看到inotifywait的终端有了一些内容,能看到jdk的压缩包被移动到该目录
    5. 由此可以编写一个触发式的同步脚本
      vim /opt/inotify.sh
      #!/bin/bash
      INOTIFY_CMD="inotifywait -mrqe modify,create,attrib,move,delete /opt/ky01"
      RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /opt/ky01 backuper@192.168.188.15::wwwroot/"
      $INOTIFY_CMD | while read DIRECTORY EVENT FILE
      do
        if [ $(pgrep rsync | wc -l) -le 0 ]
        then
          $RSYNC_CMD
        fi
      done

      详细解释一下,直接看图

      我要补充两句,rsync同步命令中写/opt/ky01和写/opt/ky01/效果应该是不一样的,写/opt/ky01会把ky01这个目录和其下的文件或目录上传过去,写/opt/ky01/的话就只会上传ky01下的文件或目录
      赋权
      chmod +x /opt/inotify.sh
      chmod 777 /opt/ky01
      设置开机自启
      chmod +x /etc/rc.d/rc.local
      echo '/opt/inotify.sh' >> /etc/rc.d/rc.local
      准备一下密码文件
      echo "123456" > /etc/server.pass
      chmod 600 /etc/server.pass
  4. 测试
    1. 先执行脚本,bash执行或者重启都可以,我们已经设置了开机自动执行
      直接丢后台执行
      bash /opt/inotify.sh &

      到这里我们已经完成了目标,底下是为了加深对rsync同步的了解进行的测试

    2. 根据我们上面的设置,客户端的/opt/ky01是与服务端的/var/www/html是同步的,我们先看一下两个目录底下有什么
      都是空的


      我们在客户端中,往/opt/ky01中新增文件

      看一下服务端的/var/www/html目录,就会多出一个文件,没有就等几秒再看

      如果我们在服务端的/var/www/html目录下新增一个文件

      再去客户端的/opt/ky01看一下

      不管怎么等都不会有那个文件,因为我们脚本中触发rsync同步命令的条件是/opt/ky01目录有相关操作,和服务端的/var/www/html并没有什么关系
      那我们动一下/opt/ky01

      还是没有那个文件?
      回服务端看一下

      服务端也没了,这是为什么?

      这是因为脚本中的
      rsync -azH --delete --password-file=/etc/server.pass /opt/ky01/ backuper@192.168.188.15::wwwroot/
      也就是rsync的同步命令,这句很重要
      rsync的格式是这样的:rsync [选项] 原始位置 目标位置
      谁在前面谁就是原始位置,这意味着上传和下载其实是由同步目录的前后位置来决定的,之前我们在2.1那步执行下载操作时的命令是这样的:
      rsync -avz backuper@192.168.188.15::wwwroot/ /opt/
      我们能看到这个命令里面的wwwroot/是写在前面的,所以我们才能把服务端的内容下载下来,上传的这条命令wwwroot/就是写在后面的
      那么我们测试一下
      在服务端新增文件

      我们在客户端手动执行下载的命令
      rsync -avz backuper@192.168.188.15::wwwroot/ /opt/ky01/

      现在就有了
      另外为什么刚刚服务端多出来的文件会被删掉,这是因为--delete选项导致的,可以看一下各个选项的含义
      常用选项:
      -r:递归模式,包含目录及子目录中的所有文件。
      -l:对于符号链接文件仍然复制为符号链接文件。
      -v:显示同步过程的详细(verbose)信息。
      -z:在传输文件时进行压缩(compress)。
      -a:归档模式,保留文件的权限、属性等信息,等同于组合选项“-rlptgoD”。
      -p:保留文件的权限标记。
      -t:保留文件的时间标记。
      -g:保留文件的属组标记(仅超级用户使用)。
      -o:保留文件的属主标记(仅超级用户使用)。
      -H:保留硬连接文件。
      -A:保留 ACL 属性信息。
      -D:保留设备文件及其他特殊文件。
      --delete:删除目标位置有而原始位置没有的文件。
      --checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
    3. 实验完毕

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-21 22:08:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-21 22:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-21 22:08:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-21 22:08:02       20 阅读

热门阅读

  1. dart 学习抽象类学习接口

    2023-12-21 22:08:02       37 阅读
  2. js实现给html加水印

    2023-12-21 22:08:02       37 阅读
  3. Android 8.0.0源码系统目录结构说明

    2023-12-21 22:08:02       35 阅读
  4. 深入理解 Rust 中的元编程

    2023-12-21 22:08:02       36 阅读
  5. FFmpeg实现RTSP推流

    2023-12-21 22:08:02       39 阅读
  6. 【重点】【DP】72.编辑距离

    2023-12-21 22:08:02       43 阅读