BBS500

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
BBS500 首页 学习笔记 云服务器相关 查看内容

【Ubuntu服务器文件同步】利用rsync同步,结合inotify通知功能实现文件自动同步 ...

2018-3-22 14:08| 发布者: firstadmin| 查看: 211| 评论: 0

摘要: 当前项目中需要用到自动备份数据到另外一个服务器,想了rsync结合定时功能,可能是我觉得太low了,所以决定采用网友的rsync+inotify进行单项或者双向同步,此处场景是使用的A电脑数据自动备份到B电脑。 1、A、B两台 ...

当前项目中需要用到自动备份数据到另外一个服务器,想了rsync结合定时功能,可能是我觉得太low了,所以决定采用网友的rsync+inotify进行单项或者双向同步,此处场景是使用的A电脑数据自动备份到B电脑。

1、A、B两台服务器rsync安装

apt-get install rsync

2、A、B两台电脑开机启动rsync服务

sudo vim /etc/default/rsync

在文件中将RSYNC_ENABLE=false改为RSYNC_ENABLE=true

3、A、B两台电脑配置rsyncd.conf

sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc

sudo vim /etc/rsyncd.conf

3.1 在文件中去掉log file=/var/log/rsyncd ,pid file=/var/run/rsyncd.pid ,syslog facility=daemon前面的注释符号#

3.2 在默认模块(可以修改或增加自己的模块)【ftp】中rsync需要同步的路径: path = /var/www/pub ,hosts allowd = 12.12.12.12

3.3修改rsync使其可读可写: read only = false

3.4修改rsync用户:auth users = root,A电脑secrets file = /etc/rsyncd.secrets,B电脑secrets file = /etc/rsyncd.passwd

    3.5 新建密码文件,A电脑中的secrets file中只保存密码123456,B电脑中secrets file密码格式为root:123456

    3.5 修改密码文件权限:sudo chmod 0600 /etc/rsyncd.secrets或者sudo chmod 0600 /etc/rsyncd.passwd

4、启动rsync

    sudo /etc/init.d/rsync start

5、A电脑上手动命令输入同步

    5.1 手动输入密码命令: rsync -av /home/coremail/ 192.168.11.12:/home/coremail/

    5.2 自动输入密码命令:rsync -avz –password-file=/etc/rsyncd.secrets /var/www/mange/ root@xx.xx.xx.xx::ftp

6、A电脑上使用脚本自动同步到B电脑

A电脑上安装inotify

apt-get install inotify tools

代码转至连接:http://www.ttlsa.com/web/let-infotify-rsync-fast/

#!/bin/bash
src=/data/                           # 需要同步的源路径
des=data                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
ip1=192.168.0.18                 # 目标服务器1
ip2=192.168.0.19                 # 目标服务器2
user=root                            # 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

7、启动A电脑中脚本

chmod +x rsyncd-bak.sh

./ rsyncd-bak.sh或者后台启动nohu ./rsyncd-bak.sh $


8、当有文件进行删除、更新、新增的时候,A中电脑的文件会自动同步到B电脑指定目录

9、待解决,在同步过程中显示设置权限失败的问题导致了文件不能同步?

      解决办法:rsyncd.conf文件中的gid、uid需要和同步目录所属一致,可以使用chown进行修改。

备注:

1、明明两边的密码一样,但是提示密码核对失败,是由于A电脑中的密码为直接密码,B电脑密码是用户:密码的格式。

2、出现inotify中的max-watchs为最高,此时会导致rsync无法启动,只需要使用命令进行修改:sysctl -w fs.inotify.max_user_watches=”99999999″

3、B电脑如出现request action not suported,只需要更改B电脑中rsync配置文件中的refuse option,将checksum删除即可

4、B电脑中出现错误提示name lookup failed for: Name or service not known,解决办法是在A电脑中/etc/hosts里面添加B电脑的ip和机器名,如123.020.22.00 cloud

5、在配置自动脚本的时候,一定记得A电脑中脚本里面的secrets file文件里面的只有密码,对应的是B电脑中rsync配置文件中的secrets file,其对应密码文件是有格式的如root:123


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|Archiver|手机版|小黑屋|BBS500 ( 蜀ICP备16012380号-1 )

GMT+8, 2019-10-19 15:18 , Processed in 0.018119 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部