成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

经验杂笔

分段图

最新文章

经验杂笔
当前位置: 首页 » 大学杂谈 » 经验杂笔 » CentOS搭建lsyncd实时同步——取代rsync+inotify

CentOS搭建lsyncd实时同步——取代rsync+inotify

编辑:狂族晨曦 来源:经验杂笔 日期:2018-02-08 阅读: 581 次 3 条评论 » 百度已收录

昨天先森发布了“CentOS下inotify+rsync实现文件实时同步”,inotify+rsync实时同步的方案是用shell在后台常驻来实现实时同步,没有守护进程,感觉不是很靠谱,如果脚本突然挂了,实时同步岂不是GG了?所以先森在实现了inotify+rsync后还是再找其他的解决方案。

其实在找到lsyncd之前,先森先找到了sersync这个工具,但是好像这个工具很久没有更新了,所以虽然也有较多好评,但是先森目前还是先研究lsyncd了。

当然,无论是sersync还是lsyncd,其实都是对inotify这个内核中的文件事件监控系统进行了封装,类似inotify-tools,给我们提供的是封装好了的inotify+rsync工具。sersync是用C写的,lsyncd是使用lua语言封装的。

搭建lsyncd实时同步

搭建lsyncd实时同步

lsyncd

lsyncd项目也托管在GitHub上面,具体地址是https://github.com/axkibe/lsyncd,一会儿若是要编译安装也需要去这个地方。

上文也说过,lsyncd是使用lua语言封装的,所以初识lsyncd的配置文件时,还是有点不习惯,但是用久应该就还好了。

lsyncd不仅仅是实现两台服务器的同步的,它还能够在一台服务器内对两个文件夹进行同步,这里可以是cp,也可以是rsync。两台或多台服务器间可以是rsync,也可以是rsyncssh。本文主要讲的是两台服务器间的rsync。

lsyncd可以配置inotify检测到文件变动后多少秒才执行同步,也就是时间延迟。也可以配置文件变动个数达到多少个后立即执行同步,无论有没有到达前面的时间延迟的要求,这就是累计触发事件次数。这两个配置可以减少rsync的同步,避免海量文件同步时rsync的频繁发送文件对比列表。

lsyncd安装

lsyncd的安装方式有两种,yum安装和编译安装。

yum安装:

yum安装也有两种方式,一个是阿里云的镜像源,一个是fedoraproject的镜像源。

阿里云:

#CentOS 7
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#CentOS 6
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

#yum 安装
yum install lsyncd -y

fedoraproject:

#只找到CentOS 6的
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install lsyncd -y

编译安装:

1、首先还是去上文提到的GitHub上下载项目,通过下面的下载就是最新的了:

wget https://github.com/axkibe/lsyncd/archive/master.zip

2、下载了软件包,先别急着安装,上文提到了几次,lsyncd是用lua语言封装的,所以还需要安装lua环境。另外lsyncd不是使用的make,而是cmake,所以也需要安装cmake。

yum install -y lua lua-devel asciidoc cmake

3、下载了软件包,装好了环境依赖,下面就是编译安装:

unzip lsyncd-master.zip
cd lsyncd-master
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd
make && make install

安装好了的lsyncd在/usr/local/lsyncd下。配置文件、日志文件夹等需要我们自己定义与创建。

4、配置文件。先森的配置文件是用于两台服务器间实时同步的,使用的是rsync模式。

lsyncd的配置文件其实有点类似nginx,如nginx的server可以多定义互不冲突一样,lsyncd也可以多个定义。

settings {
    logfile ="/usr/local/lsyncd/logs/lsyncd.log",
    statusFile ="/usr/local/lsyncd/logs/lsyncd.status",
    inotifyMode = "CloseWrite or Modify",
    maxProcesses = 15,
    }
sync {
    default.rsync,
    source    = "/web/data/ftp",
    target    = "user@172.17.8.16::datahome",
    delete="running",
    exclude = { ".*", ".tmp","*.swp","*.swx" },
    delay = 0,
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        password_file = "/etc/rsyncd/rsync.passwd",
        }
    }

注释版:

settings {
    --定义日志文件
    logfile ="/usr/local/lsyncd/logs/lsyncd.log",
    --定义状态文件
    statusFile ="/usr/local/lsyncd/logs/lsyncd.status",
    --指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
    --这个就是使用的inotify能监控的事件
    inotifyMode = "CloseWrite or Modify",
    --同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
    maxProcesses = 15,
    --(这个配置先森没有使用)累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
    --maxDelays=10,
    }
sync {
    --使用rsync通过daemon方式连接远程rsyncd进程;
    default.rsync,
    --同步的源目录,使用绝对路径。
    source    = "/web/data/ftp",
    --定义目的地址,对应不同的模式有不同的写法。这里是远程rsync,使用“用户名@ip::模块名”写法。
    target    = "user@172.17.8.16::datahome",
    --是否同步删除,除了running选项,还有true、false和startup,这个配置先森不是很明白,大概是true是完全同步删除,false是不允许删除,startup和running要难理解一些\
    --先森的理解是,startup是仅在启动时将源目录和目的目录来一次完全同步,lsyncd运行时的源目录的删除文件在目的目录中不做删除操作\
    --running是启动时不对源、目的目录进行完全同步,lsyncd运行时源目录删除的文件,目的目录也会被删除。
    delete="running",
    --排除的文件,这里排除了一些隐藏文件,和文件打开是时的临时文件
    exclude = { ".*", ".tmp","*.swp","*.swx" },
    -- 累计事件,等待rsync同步延时时间,默认15秒。先森配置的是0,也就是实时同步。
    delay = 0,
    rsync     = {
        --本地rsync命令路径
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        --远程rsyncd的密码
        password_file = "/etc/rsyncd/rsync.passwd",
        }
    }

5、启动lsyncd

/usr/local/lsyncd/bin/lsyncd -log Exec /usr/local/lsyncd/lsyncd.conf

也可以自己创建一个启动脚本,脚本内容如下,是先森从yum安装的lsyncd拷贝的,一样的可以使用。

只是用之前,需要对lsyncd守护命令与配置文件先做个软连接,免得需要修改启动脚本:

ln -s /usr/local/lsyncd/bin/lsyncd /usr/bin/lsyncd
ln -s /usr/local/lsyncd/lsyncd.conf /etc/lsyncd.conf

启动脚本:

#!/bin/bash
#
# chkconfig: - 85 15
# description: Lightweight inotify based sync daemon
#
# processname:  lsyncd
# config:       /etc/lsyncd.conf
# config:       /etc/sysconfig/lsyncd
# pidfile:      /var/run/lsyncd.pid

# Source function library
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf"

if [ -e /etc/sysconfig/lsyncd ]; then
  . /etc/sysconfig/lsyncd
fi

RETVAL=0

prog="lsyncd"
thelock=/var/lock/subsys/lsyncd

start() {
	[ -f /etc/lsyncd.conf ] || exit 6
        echo -n $"Starting $prog: "
        if [ $UID -ne 0 ]; then
                RETVAL=1
                failure
        else
                daemon ${LSYNCD_USER:+--user ${LSYNCD_USER}} /usr/bin/lsyncd $LSYNCD_OPTIONS
                RETVAL=$?
                [ $RETVAL -eq 0 ] && touch $thelock
        fi;
        echo
        return $RETVAL
}

stop() {
        echo -n $"Stopping $prog: "
        if [ $UID -ne 0 ]; then
                RETVAL=1
                failure
        else
                killproc lsyncd
                RETVAL=$?
                [ $RETVAL -eq 0 ] && rm -f $thelock
        fi;
        echo
        return $RETVAL
}

reload(){
        echo -n $"Reloading $prog: "
        killproc lsyncd -HUP
        RETVAL=$?
        echo
        return $RETVAL
}

restart(){
        stop
        start
}

condrestart(){
    [ -e $thelock ] && restart
    return 0
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  reload)
        reload
        ;;
  condrestart)
        condrestart
        ;;
  status)
        status lsyncd
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
        RETVAL=1
esac

exit $RETVAL

优化

因为lsyncd其实也是用到了inotify,所以和inotify+rsync方案一样,我们还是需要对服务器的inotify内核配置进行优化。

inotify检查磁盘变动是有队列等值的配置的,inotify默认内核参数值太小,会导致实际检测的时候报错。

查看系统默认参数值

sysctl -a | grep max_queued_events
sysctl -a | grep max_user_watches
sysctl -a | grep max_user_instances

临时修改

sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"

固定修改:vim /etc/sysctl.conf #添加以下代码

fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

其他

官方配置文件wiki:

https://axkibe.github.io/lsyncd/manual/config/file/

标签:
除特别注明外,本站所有文章均为成航先森 www.capjsj.cn原创,本文共6204个字
转载请注明出处来自http://www.capjsj.cn/lsyncd.html
已有 3 位"计工"发布了激烈的评论,还有N多人围观笑而不语评论
小C博客的头像
欢迎发表评论
取消评论

表情
疑问调皮伤心抠鼻黑线微笑可爱奸笑震惊吓到了撇嘴大兵忍不住笑笑狂骂狂怒噢?鼓掌酷⊙﹏⊙b汗鄙视大哭嘿嘿

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 跨境电商之家的头像

    希望能学有所成。

    2018-02-08 23:22 回复
  2. 苏幕遮的头像
    苏幕遮:

    我有两个服务器A和B,上面都启动了lsync和rsync,现在发现一个问题。

    我1点启动同步任务,进程OK文件都是正常同步的,但是在2点的时候同步进程死掉,这期间文件发生了变化(文件夹里多了好多的新文件)。然后我3点的时候重启了同步任务,此时在A或者B上文件变化都会同步,但是2~3点进程死掉之间的文件变化,却迟迟不见同步,请问怎么办?

    2018-04-23 18:51 回复
  3. 小C博客的头像

    前不久我也刚搞完这个

    2018-06-09 21:28 回复
官方微信
发表评论 返回顶部