作业13:Rsync+Crontab实现日志定时同步/Rsync+Inotify实现日志实时同步
文章目录
13.1 将本地/var/log目录文件同步到远程主机的/data/log目录中
-
安装配置
#本地主机: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
-
本地主机同步文件到远程主机
#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服务端指定模块中(守护进程模式)
-
配置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
-
-
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.146 | Centos 6.9 |
Rsync服务器 | 192.168.6.128 | Centos 7 |
- 实验目的:监控Inotify服务器/var/log目录的数据变化并自动同步到Rsync服务器上
- 实验使用场景:生产环境里,企业拥有多台web服务器,为了保证数据的一致,做到统一管理,节省存储空间,web文件会放置在samba服务器或者nfs服务器上,但是为了确保数据安全,我们可以找一台(Rsync)服务器,来做实时同步数据。
- 实验拓扑:
- 实验步骤:
-
配置Rsync服务推送/var/log目录文件到Rsyncd服务端指定模块中,此步骤与 [13.7(ctrl+点击跳转)](#13.7 配置Rsync服务推送/var/log目录文件到Rsyncd服务端指定模块中(守护进程模式))相同,在完成该节实验的基础上即:Inotify服务器可以顺利将/var/log文件同步到Rsyncd服务器后,继续第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服务器同步目录信息,更新同步成功(时间发生变化)