Rsync+Crontab实现日志定时同步/Rsync+Inotify实现日志实时同步

作业13:Rsync+Crontab实现日志定时同步/Rsync+Inotify实现日志实时同步

13.1 将本地/var/log目录文件同步到远程主机的/data/log目录中

  1. 安装配置

    #本地主机:192.168.6.146;远程主机:192.168.6.128都需要安装
    yum -y install rsync
    
    #远程主机创建目录
    [root@ ~ 11:25:20]#mkdir -p /data/log
    [root@ ~ 11:25:24]#ls /data
    centos7  log
    
    
  2. 本地主机同步文件到远程主机

    #0.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器
    #1.本地主机操作
    [root@lin ~]# rsync -avz /var/log root@192.168.6.128:/data/log
    #raync命令选项: -a 归档模式,递归传输并保持文件属性 -v 显示传输过程中详细信息
    #			   -z 传输时进行压缩提高效率
    sending incremental file list
    log/
    ...
    log/samba/old/
    
    sent 721057 bytes  received 1633 bytes  206482.86 bytes/sec
    total size is 9223185  speedup is 12.76
    #2.查看远程主机
    [root@ ~ 11:25:26]#ll /data/log/
    total 4
    drwxr-xr-x 11 root root 4096 Aug 17 04:17 log
        
    #3.其实也可以将文件从远程主机服务器拉回到本地主机
    

13.2 配置Rsync服务推送/var/log目录文件到Rsyncd服务端指定模块中(守护进程模式)

  1. 配置Rsync服务端(远程主机)

    • 创建配置文件(/etc/rsyncd.conf)

      [root@ ~ 11:45:55]#vim /etc/rsyncd.conf 
      uid = rsync   		#客户端连接到服务端后服务端进程执行者(需要系统创建)
      gid = rsync   		#执行组
      use chroot = no   	#是否chroot
      max connections = 10
      timeout 300
      strict modes = yes
      pid file = /var/run/rsyncd.pid   #pid文件
      lock file = /var/run/rsyncd.lock #锁文件,保持文件一致性
      log file = /var/log/rsyncd.log   #日志文件
      
      #模块定义
      [lpzbackmod]     			#模块名称
      path = /backup  		 #备份目录(服务器端共享的目录)
      comment = backup file  #模块说明
      ignore errors   		#忽略错误
      read only = no 			 #可写
      hosts allow = * 		 #允许
      #hosts deny = 172.16.1.1  #拒绝
      list = false   #能否被列表
      auth users = lpz  #用来进行同步的用户,不需要系统用户中有,虚拟的就行 
      secrets file = /etc/rsync.passwd  #用户帐号密码文件(权限必须是600)
      
    • 创建auth users(不需要系统中创建,只适用于该服务)密码文件,并修改权限

      [root@ ~ 01:11:21]#vim /etc/rsync.passwd
      lpz:343385
      [root@ ~ 01:12:14]#chmod 600 /etc/rsync.passwd 
      #rsync.passwd文件所有者,所属主与配置文件rsyncd.conf必须相同
      #否则客户端运行相关命令会报错
      
    • 创建系统用户和共享目录

      #1.创建系统用户
      [root@ ~ 01:13:39]#id rsync
      id: rsync: no such user
      [root@ ~ 01:16:40]#useradd  -r rsync 
      [root@ ~ 01:16:47]#id rsync
      uid=997(rsync) gid=994(rsync) groups=994(rsync)
      
      #2.创建共享目录并修改权属
      [root@ ~ 01:16:50]#mkdir /backup
      [root@ ~ 01:17:40]#chown -R rsync.rsync /backup/
      
      
    • 重新加载模块

      [root@ ~ 01:25:45]#systemctl start rsyncd
      [root@ ~ 01:26:17]#systemctl enable rsyncd
      [root@ ~ 01:21:18]#rsync --daemon --config=/etc/rsyncd.conf 
      
      [root@ ~ 01:25:26]#echo "/usr/bin/rsync --daemon" >> /etc/rc.local
      
      
  2. Rsync客户端(本地主机)

    • 配置密码文件

      [root@lin ~]# vim /etc/rsync.passwd
      343385
      [root@lin ~]# chmod 600 /etc/rsync.passwd 
      
    • 文件推送(客户端->服务器端)

      [root@lin ~]# rsync -avz /var/log lpz@192.168.6.128::lpzbackmod --password-file=/etc/rsync.passwd
      sending incremental file list
      ...
      sent 745187 bytes  received 1667 bytes  213386.86 bytes/sec
      total size is 9548380  speedup is 12.78
      rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
      #部分文件没有写的权限,导致备份数据库(服务器端)权限不够:
      #1、将服务端rsyncd.conf配置文件的uid和gid分别修改成root,重载下,/etc/rc.d/init.d/xinetd reload,再次执行同步,同步成功(记得完事后将权限修改回来)
      #2、将需要同步的文件夹及下属文件赋予777权限(chmod -R 777 xxx),再次执行同步,同步成功
      
    • 查看服务器端
      在这里插入图片描述

    • 客户端定时同步日志到服务器端

      crontab -e
      0 1 * * * rsync -avz /var/log lpz@192.168.6.128::lpzbackmod --password-file=/etc/rsync.passwd >/dev/null 2>&1
      

13.3 实时同步/var/log目录下的文件

节点IP系统版本
Inotify服务器192.168.6.146Centos 6.9
Rsync服务器192.168.6.128Centos 7
  • 实验目的:监控Inotify服务器/var/log目录的数据变化并自动同步到Rsync服务器上
  • 实验使用场景:生产环境里,企业拥有多台web服务器,为了保证数据的一致,做到统一管理,节省存储空间,web文件会放置在samba服务器或者nfs服务器上,但是为了确保数据安全,我们可以找一台(Rsync)服务器,来做实时同步数据。
  • 实验拓扑:

在这里插入图片描述

  • 实验步骤:
  1. 配置Rsync服务推送/var/log目录文件到Rsyncd服务端指定模块中,此步骤与 [13.7(ctrl+点击跳转)](#13.7 配置Rsync服务推送/var/log目录文件到Rsyncd服务端指定模块中(守护进程模式))相同,在完成该节实验的基础上即:Inotify服务器可以顺利将/var/log文件同步到Rsyncd服务器后,继续第2步(实现实时同步)

  2. Inotify服务器(192.168.6.146)配置

    • 安装Inotify

      [root@lin /]#rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 
      
      [root@lin /]#yum -y install inotify-tools
      
    • 创建实时监控脚本

      vim inotify_rsync.sh
      #!/bin/bash
      src=/var/log                    # 需要同步的源路径
      des=lpzbackmod                  # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
      rsync_passwd_file=/etc/rsync.passwd            # rsync验证的密码文件
      ip1=192.168.6.128                # 目标服务器1
      #ip2=192.168.0.19                 # 目标服务器2
      user=lpz                            # rsync --daemon定义的验证用户名
      cd ${src}                              # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
      /usr/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把监控到有发生更改的"文件路径列表"循环
      do
              INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
              INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
              echo "-------------------------------$(date)------------------------------------"
              echo $file
              #增加、修改、写入完成、移动进事件
              #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
              if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
              then
                      echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                      rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&         # INO_FILE变量代表路径哦  -c校验文件内容
                      rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                       #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
              fi
              #删除、移动出事件
              if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
              then
                      echo 'DELETE or MOVED_FROM'
                      rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                      rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                      #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
              fi
              #修改属性事件 指 touch chgrp chmod chown等操作
              if [[ $INO_EVENT =~ 'ATTRIB' ]]
              then
                      echo 'ATTRIB'
                      if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                      then
                              rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&            
                              rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                      fi
              fi
      done
      
    • 修改脚本权限并运行

      [root@lin /]# chmod +x inotify_rsync.sh 
      [root@lin ~]# ./inotify_rsync.sh &
      [1] 8304
      
    • 测试:

      Inotify服务器端在/var/log里创建一个文件aaaaaaabbbb.log

在这里插入图片描述

 Rsync服务器同步目录信息,同步成功

在这里插入图片描述

 Inotify服务器端在/修改文件内容:aaaaaaabbbb.log

在这里插入图片描述

 Rsync服务器同步目录信息,更新同步成功(时间发生变化)

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值