当前位置: 游戏平台 > 互联网科技 > 正文

(转)rsync+inotify实时一只

时间:2019-11-09 15:12来源:互联网科技
rsync 是Linux下的一个文件同步利器,以高效的增量传输而闻名,适用于同步,备份等多个场合。几乎所有的Linux发行版都收录了该软件,安装非常容易,以CentOS6.4为例: 原文: 由于现在

rsync 是Linux 下的一个文件同步利器,以高效的增量传输而闻名,适用于同步,备份等多个场合。几乎所有的Linux 发行版都收录了该软件,安装非常容易,以CentOS 6.4为例:

原文:

由于现在的环境没有使用共享存储,为了保证各个节点的web目录一致,这里结合了rsync和inotify-tools实时同步web目录。从网上查了相关资料,发现方法都差不多。自己测试后把步骤记录下,方便参考。 

yum install rsync

声明:rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端向rsync客户端同步数据。当需要添加inotify实现实时同步数据时,我们就需要从rsync客户端向各rsync服务端同步数据,这样rsync客户端就变成了master,而rsync服务端就变成了slave。

rsync+inotify-tools 实现web发布目录文件同步
环境 Ubuntu 10.04
源目录服务器(客户端)web1: 192.168.1.24
集群节点服务器(服务端)web2: 192.168.1.3
web的发布目录都为/var/www/eztest
同步方向为web1 --> web2

rsync 有个特别之处,既可以作为服务端在后台运行,也可以作为客户端去连接服务器,甚至可以抛弃服务端,直接在本地文件系统上进行同步。

原理:当web3的本地目录,也就是需要同步的目录发生变化时,比如有文件改名、更新、删除、权限变化,此时就使用inotify命令查找这些变化,进行相应的轮询工作

客户端安装rsync 和 inotify #放源程序目录的服务器
服务端安装rsync  #集群节点,运行rsync守护进程

本文讲述 inotify+rsync 打造文件实时同步系统,先讲讲它与传统的rsync 服务器之间的区别,这点非常重要,很少有人提及这个,以至于新手在配置inotify+rsync 产生疑惑。

服务器地址分配:

安装软件 apt-get install rsync

通常而言,rsync 作为服务端监听在873端口,等待客户端来连接,对应的模式是一个服务端,多个客户端,比如

Web1:192.168.1.103 (rsync 服务节点)

服务端配置:
先配置服务端,也就是集群的各个节点。各节点配置一样
默认安装情况下rsync没有文件,需要自己手工创建。
服务端rsync配置 /etc/rsyncd.conf

rsync -avz --delete 10.1.1.11::web/ /var/www/

Web2:192.168.1.104 (rsync 服务节点)

uid = nobody
gid = nobody
use chroot = no
max connections = 20
strict modes = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log format = %t %a %m %f %b

上面的例子中,只要规则允许,任何一个可以连接到10.1.1.11的机器,都可以去同步它。这种场合下,服务端10.1.1.11 是一般是权威内容的发布器,因此其内容是只读的。

Web3:192.168.1.105  (rsync 内容发布节点、inotify)

[eztest]
path = /var/www/eztest/
auth users = eztestback
ignore errors = yes
read only = no
write only = no
list = no
hosts allow = 192.168.1.0/24
hosts deny = *
uid = root
gid = root
secrets file = /etc/rsync.passwd

在 inotify+rsync 场合中,工作模式是一个客户端,多个服务端,客户端掌握了权威内容,主动向服务端推送内容(服务端必须是可写的),例子如下:

 

创建认证文件,方便同步过程中自动同步,不需输入密码。
echo "eztestback:sjjm1605" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

rsync -avz --delete /var/www/ 10.1.1.11::web/
rsync -avz --delete /var/www/ 10.1.1.12::web/
rsync -avz --delete /var/www/ 10.1.1.13::web/

同步的目录是 /mnt ,自动同步顺序为 web2,web3——web1。我们将web1 配置成 rsync 的服务器即可。

启动rsync守护进程
rsync --daemon --config=/etc/rsyncd.conf
利用ps 或netstat查看是否启动成功

上面的例子就是,客户端将/var/www里的网页内容,主动推向3个服务端。

 

创建同步的目录
mkdir /var/www/eztest && chown www-data:www-data /var/www/eztest

inotify 是个内核工具,能够监视文件目录的变化,客户端通过inotify 得知变化后立即主动将内容写入服务端。

一、配置 rsync 服务器端(web1)

客户端配置:
apt-get install rsync inotify-tools
客户端,即存放源程序目录的服务器(git更新的目录),这个只需按照rsync 和 inotify-tools
rsync不需要配置,只需创建认证文件,且认证文件中只有密码。
echo "sjjm1605" > /etc/rsync.passwd && chmod 600 /etc/rsync.passwd

所谓的原理就这么多了,关于inotify 的东西,别人都讲清楚了,不详述。

 

使用如下命令测试,参数的解释参考

配置服务端
1 、创建并编辑文件 /etc/rsyncd.conf

1.安装rsync软件

rsync -vzrtopg  --delete --exclude=a/ --password-file=/etc/rsync.passwd /var/www/eztest/ eztestback@192.168.1.3::eztest

uid = root
gid = root
address = 10.1.1.11
use chroot = no
read only = no
max connections = 512
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
[web]
path=/var/www/
list = yes
ignore errors = yes
hosts allow = 10.1.1.20
hosts deny = *

# yum install rsync

使用如下命令测试inotify对文件的监控

2、启动rsync 服务端

 

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e modify,delete,create,attrib /var/www/eztest

rsync --daemon -4

2.手动创建rsync配置文件

 

将上面一句命令加入/etc/rc.local ,可以让rsync 随系统启动。

# vim /etc/rsyncd.conf

利用脚本自动同步,脚本内容如下
#!/bin/bash
 host1=192.168.1.3
 #host2=192.168.1.4
 #集群节点有多少,写多少个变量
 src=/var/www/eztest/
 dst=eztest  #变量值和配置中模块名字相同。
 username=eztestback

3、配置防火墙,开启873端口

uid = root                             #全局配置开始,运行rsync的用户

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib  $src
 | while read files
  do
 /usr/bin/rsync -vzrtopgq  --delete --exclude=test1/a/ --password-file=/etc/rsync.passwd $src $username@$host1::$dst  # --exclude 使用相对路径,--exclude-from=file 文件中写明要排除的文件
 if [ $? -eq 0 ];then
  echo "${files} was rsynced ok" >>/tmp/rsync.log 2>&1
 fi
  done

/sbin/iptables -A INPUT -s 10.1.1.20 -p tcp --dport 873 -j ACCEPT

gid = root                             #运行rsync的用户组

将脚本放到启动文件中
echo "/home/wang/rsync.sh &" >> /etc/rc.local

4、服务端配置完成,如果有多个服务端,请依葫芦画瓢。

usechroot = no                     #是否让进程离开工作目录

图片 1

配置客户端
1、安装rsync

max connections = 20            #最大并发数

yum install rsync

timeout = 600                       #连接超时时间

2、安装inotify-tools

pid file = /var/run/rsyncd.pid            #指定rsync的pid存放路径

yum install inotify-tools --enablerepo=epel

lock file = /var/run/rsync.lock           #指定rsync的锁文件存放路径

3、写个脚本,一旦 inotify 发现变化,立即触发rsync 将变化推送到服务端。
#!/usr/bin/env bash
set -e
src=/var/www/
web01=10.1.1.11
web02=10.1.1.12
web03=10.1.1.13
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e'
-e modify,delete,create,attrib $src
| while read files
    do
        /usr/bin/rsync -vzrtopg --delete --progress $src $web01::web/
        /usr/bin/rsync -vzrtopg --delete --progress $src $web01::web/
        /usr/bin/rsync -vzrtopg --delete --progress $src $web01::web/
        echo $files have been pushed to all web servers.
    done

log file = /var/log/rsyncd.log             #指定rsync的日志存放路径

4、启动脚本,并在后台运行,或者让它开机启动

[web_log]                            #模块配置开始

chmod 755 /opt/inotify-rsync.sh
/opt/inotify-rsync.sh&
echo "/opt/inotify-rsync.sh&" >>/etc/rc.local

path = /data/web_log/             #需要备份的文件路径

至此,inotify + rsync 全部搞定。

ignore errors                         #忽略一些无关的I/O错误

推荐阅读:

read only = false                    #false为关闭,true表示开启。表示只读,不允许上传文件

rsync同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

writeonly = false                    #不允许下载

利用rsync工具进行同步Windows和Linux机器之间的文件 http://www.linuxidc.com/Linux/2013-06/86122.htm

list = false                            #客户请求可以使用模块列表时是否被列出

图片 2

hosts allow = 192.168.1.0/24           #可以访问此模块的主机,*表示任何主机,此处是网段,某个主机直接写ip

hosts deny = 0.0.0.0/32                     #禁止访问此模块的主机地址

auth users = backuser                        #自定义连接该模块的用户名,多个用户用逗号分隔

secrets file = /etc/rsync.password #指定一个包含“用户名:密码”格式的文件

 

 

3.创建备份目录

# mkdir -p /data/web_log/

 

4.建立 rsync 用户名和密码文件

# echo"backuser:123" >> /etc/rsync.password

 

5.为 /etc/rsync.password授权为 600(这个文件的权限必须是 600)

# chmod  600 /etc/rsync.password

 

6.启动rsync并添加开启自动启动

# /usr/bin/rsync --daemon  &

# echo "/usr/bin/rsync --daemon" >> /etc/rc.local

 

二、配置 rsync 服务器端(web2),和web1配置一样

 

# yum install rsync

 

# vim /etc/rsyncd.conf

uid = root

gid = root

usechroot = no

max connections = 20

timeout = 600

pid file = /var/run/rsyncd.pid

 

lock file = /var/run/rsync.lock  

log file = /var/log/rsyncd.log

[web_log]

path = /data/web_log/             #定义你需要备份的路径,可以跟web1上不一样

ignore errors

read only = false

writeonly = false

list = false

hosts allow = *

hosts deny = 0.0.0.0/32

auth users = backuser

secrets file = /etc/rsync.password

 

# mkdir -p /data/web_log/

 

# echo "backuser:123" >> /etc/rsync.password

 

# chmod  600 /etc/rsync.password

 

# /usr/bin/rsync --daemon  &

# echo "/usr/bin/rsync --daemon" >> /etc/rc.local

 

到此,服务器端配置完成

 

三、客户端配置(web3):

 

1.设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名

# yum install rsync

# echo "123" > /etc/rsync.password

 

编辑:互联网科技 本文来源:(转)rsync+inotify实时一只

关键词: