专栏首页日常技术Lsyncd搭建同步镜像-远程实时同步备份
原创

Lsyncd搭建同步镜像-远程实时同步备份

背景:因自研日志系统改造,为容灾需要,需将主日志机的日志文件完整备份到备机,而公司内部并没有相应的系统。经过调研,我们的应用场景很简单,logstash也是可以满足我们的需求,但太重了点,后运维推荐使用lsyncd,故将使用中遇到的坑整理处理

1. Lsyncd是啥

    lsyncd会密切监测本地服务器上的参照目录,当发现目录下有文件或目录变更后,立刻通知远程服务器,并通过rsync 或rsync+ssh方式实现文件同步。这样做的好处就是,你可以利用Lsyncd搭建一个VPS同步镜像,应用场景例如CDN镜像、网站数据备份、网站搬家等等

2. 安装Lsyncd

    我们的服务器比较简单,基于centos的yum安装即可

yum install lsyncd

 之后修改配置文件/etc/lsyncd.conf,对应的参数说明可以参考官方文档 具体如下:

settings {
    logfile      = "/var/log/lsyncd/lsyncd.log",
    statusFile   = "/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 1000,
    maxDelays    = 200,
}

sync {
    default.rsync,
    source = "/tmp/logs/",
    target = "user00@xxx.xxx.xxx.xxx::backup",
    delay  = 100,
    rsync  = {
        binary    = "/usr/bin/rsync",
        password_file = "/etc/rsyncd.passwd",
        archive   = true,
        compress = false,
        verbose   = true
    }
}

 之后运行测试

lsyncd -log Exec /etc/lsyncd.conf

但是在使用的过程中遇到个问题

Error: error preparing /etc/lsyncd.conf: Parameter "rsync.password_file" unknown. (if this is not a typo add it to checkgauge)

 后来google告诉我这是一个bug,开发者说2.1.2已经修复,但是github上有人反馈2.1.4版本还是有问题,而我们的TLinux1.2默认用yum安装的话就是2.1.4的,于是自己卸载升级为2.1.5,后面附上编译安装流程,问题解决。

之后新建密码文件/etc/rsyncd.passwd

test1234

 执行如下命令进行测试

/usr/bin/rsync --delete -gvsolptD --password-file=/etc/rsyncd.passwd-r /tmp/logs/user00@::backup/

设置文件的owner为root,并将权限设置为600,否则会提示

@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

3. Rsync client备机启动

    拿我们正常的机器应该都默认安装了rsync,只需要启动一个监听服务即可。

修改/etc/rsyncd.conf文件

uid=root
gid=root
use chroot=yes
max connections=100
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
timeout=600
port=873
secrets file=/etc/.rsyncd.secrets

[app]
path=//app
comment=rsync files
read only=no
list=yes
auth users=user00

[backup]
path=/tmp/backup
read only=no
list=yes
auth users=user00

 添加密码文件/etc/.rsyncd.secrets

user00:test1234
user01:test12345

设置文件的owner为root,并将权限设置为600

执行启动,启动address为备机的ip,即执行该命令的机器ip

/usr/bin/rsync --address= --config=/etc/rsyncd.conf --daemon

最后启动

service lsyncd start

修改文件可以看到日志文件/var/log/lsyncd/lsyncd.log

日志详情

附录:Lsyncd 2.1.5编译安装

yum install lua-devel
tar -xzf lsyncd-2.1.5.tar.gz 
cd lsyncd-2.1.5/
./configure --prefix=/usr/bin
make && make install

lsyncd依赖lua,如果没有lua-devel,会有如下提示

configure: error: Need a Lua toolchain with matching versions ('lua' library and 'lua' and 'luac' programs)

 添加/etc/lsyncd.conf文件

settings {
    logfile      = "/var/log/lsyncd/lsyncd.log",
    statusFile   = "/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 1000,
    maxDelays    = 200,
}

sync {
    default.rsync,
    source = "/tmp/logs/",
    target = "user00@xxx.xxx.xxx.xxx::backup",
    delay  = 100,
    rsync  = {
        binary    = "/usr/bin/rsync",
        password_file = "/etc/rsyncd.passwd",
        archive   = true,
        compress = false,
        verbose   = true
    }
}

 添加启动service文件

vi /etc/init.d/lsyncd
#!/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 /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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 35个免费又实用的开源 AI 项目

    1. ACT-R:ACT-R由卡内基·梅隆大学开发,它既是人类认知理论的名称,又是基于该理论的软件的名称。该软件基于Lisp,提供详细的说明文档。 链接:ht...

    BestSDK
  • Redis Cluster 安装配置

    转载请务必注明原创地址为:http://dongkelun.com/2018/01/09/redisClusterDeployment/

    董可伦
  • Java多线程编程-(14)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析

    在上一篇文章中: Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信 介绍了如何使用Lock实现和synchronized关键字类似的同步功能,...

    Java后端技术
  • 推荐:35个热门又实用的开源 AI 项目!

    2017年企业界在AI技术上的开支将达到125亿美元,比2016年增长逾59.3%。这股强劲的增长势头可能会一直持续到2020年,到时收入有望达到460亿美元。...

    IT派
  • 分布式任务调度框架 Elastic-Job 之动态任务发布实现详解

    任务调度 JDK 的几种实现方式如下: 1)多线程: 通过开启一个线程,while 循环执行业务逻辑,让线程 sleep 休眠,达到任务间隔执行。代码清单如...

    IT技术小咖
  • SDL系列讲解(十二)创建窗口流程

    SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四)...

    用户1263308
  • 【专知荟萃03】知识图谱KG知识资料全集(入门/进阶/论文/代码/数据/综述/专家等)(附pdf下载)

    【导读】主题荟萃知识是专知的核心功能之一,为用户提供AI领域系统性的知识学习服务。主题荟萃为用户提供全网关于该主题的精华(Awesome)知识资料收录整理,使得...

    WZEARW
  • Debian资源库已加入Spectre、Meltdown漏洞检查器

    影响几乎所有现代处理器的“幽灵”(Spectre)和“熔毁”(Meltdown)安全漏洞的余波尚未散尽,软硬件厂商仍在携手努力给平台打补丁。如果你正在运行 De...

    Debian社区
  • 如何把custom form 7添加到wordpress每个页面

      我们已经知道wordpress如何添加contact form 7了,也知道[contact-form-7 id="xx" title="mytitle"]...

    ytkah
  • ELK+Kafka学习笔记之FileBeat日志合并配置输出到kafka集群

    Jetpropelledsnake21

扫码关注云+社区

领取腾讯云代金券