实验目的:

 

实现两台Centos 7 宿主机之间文件可以实时同步

 

测试环境

 

服务端ip :192.168.10.180

 

客户端ip :192.168.10.181

 

同步目录:/home/test/html/

 

同步用户:test

 

部署服务端

 

Centos 7 默认已经安装 xinetd  rsync

 

查看 xinetd  rsync 是否安装

 

rpm -aq |grep xinetd

 

xinetd-2.3.15-13.el7.x86_64

 

rpm -aq |grep rsync

rsync-3.0.9-17.el7.x86_64

 

创建配置文件将xinetd服务下面的配置文件,将rsync交给xinetd管理,默认情况下centos7 没有此配置文件

 

cat /etc/xinetd.d/rsync

# default: off

# description: The rsync server is a goodaddition to an ftp server, as it

#  allows crc checksumming etc.

service rsync

 

{

       disable              = no 

       flags                  = IPv6

       socket_type      = stream

       wait                   = no

       user                   = root

       server                =/usr/bin/rsync

       server_args       = --daemon

       log_on_failure  += USERID

 

 

 

重启rsync 服务

 

systemctl restart xinetd

 

查看

netstat -tnlp | grep rsync

tcp       0      0 192.168.10.180:873        0.0.0.0:*               LISTEN      1016/rsync

 

 

创建同步用户(客户端也需要做同样操作)

 

useradd test

echo test | passwd test --stdin

Changing password for user test.

passwd: all authentication tokens updatedsuccessfully.

 

切换普通用户 test  创建ssh 免登陆

 

Su – test

 

ssh-keygen ## 一路回车

Generating public/private rsa key pair.

Enter file in which to save the key(/home/test/.ssh/id_rsa):

Created directory '/home/test/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in/home/test/.ssh/id_rsa.

Your public key has been saved in/home/test/.ssh/id_rsa.pub.

The key fingerprint is:

74:d0:93:24:91:73:8d:1c:94:6b:20:fa:8d:cf:a5:[email protected]

The key's randomart p_w_picpath is:

+--[ RSA 2048]----+

|       +B+*     |

|     . +oO .    |

|    . ..+.o     |

|   .  . .o      |

|    . oS.       |

|     o . .      |

 

将test 用户产生的龚玥拷贝到客户端服务器上面

 

ssh-copy-id -i [email protected]

 

ssh [email protected] #测试不需要输入密码即可成功

 

安装inotify

 

下载软件:

wget https://sourceforge.net/projects/inotify-tools/files/latest/download/inotify-tools-3.14.tar.gz

 

编译安装:

 

tar zxvf  inotify-tools-3.14.tar.gz && cd inotify-tools-3.14

 

./configure

 

make && make install

 

 

配置

 

配置inotify 

 

ll  /proc/sys/fs/inotify/# 查看是否有以下信息输出,如果没有表示系统内核不支持

total 0

-rw-r--r-- 1 root root 0 Oct 27 16:28max_queued_events

-rw-r--r-- 1 root root 0 Oct 27 16:28max_user_instances

-rw-r--r-- 1 root root 0 Oct 27 16:28max_user_watches 

参数说明

max_queued_events   #表示监控事件队列

max_user_instances  #表示最多监控实例数

max_user_watches   #表示每个实例最多监控文件数

 

注:当要监控的目录、文件数量较多或者变化较频繁时,要加大这三个参数的值。

例如:可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为9000000(建议大于监控目标的总文件数)

cat /etc/sysctl.conf

net.ipv4.conf.all.accept_redirects=0

fs.inotify.max_queued_events = 32768

fs.inotify.max_user_instances = 1024

fs.inotify.max_user_watches = 90000000

 

inotify常用参数:

-e  用来指定要监控哪些事件。

这些事件包括: create创建,move移动,delete删除,modify修改文件内容,attrib属性更改。

-m 表示持续监控

-r  表示递归整个目录

-q 表示简化输出信息。

 

测试

 

使用inotifywait命令监控 服务端 /home/test/htmll发生的变化。然后在另一个终端向/home/test/html目录下添加文件、移动文件,查看屏幕输出结果。

 

1 号终端输入:inotifywait-mrq -e modify,delete,create,attrib /home/test/html/

 

2 号终端输入: cd /home/test/html/ && touch1.HTML

 

1 号终端显示2号终端的监控事件

 

/home/test/html/ CREATE 1.HTML

/home/test/html/ ATTRIB 1.HTML

 

 

实例演示:

 

将服务端的/home/test/html/ 文件目录实时同步到客户端,使用实时同步操作前需要,配置test 用户的ssh 免登陆,上面已做配置,在服务器端执此脚本,服务器端的数据就好自动同步到客户端。参考脚本如下

#!/bin/bash
# ---------------------------------------------------------------------------------------------------------
# Filename:    rsync_ inotifywait.sh
# Date:      2017/10/27
# Author:     http://sdsca.blog.51cto.com/10852974/1976974
# Description: Based on Centos 7.2
#
# Usage:      rsync_ inotifywait.sh
# Version:     1.0
# ------------------------------------------
Src=/home/test/html
[email protected]:/home/test/
T=`date+%Y-%m-%d-%H:%M:%S`
log=/home/test/log/rsync.log
 
/usr/local/bin/inotifywait-mrq -e modify,delete,create,attrib ${Src} | while read files   
        do
              /usr/bin/rsync -ahqzt --delete$Src $Dst
        echo "`date +'%F %T'` 出现事件 $files" >>${log}2>&1
        done