简介
文件实时同步对于运维是个很常见的需求。
如集群的机器,需要上传个文件,之前的步骤是每台服务器分别上传。
做文件同步以后,只上传一台,其他机器自动同步。
目前实现实时同步的主流方案有 rsync+inotify、sersync、lsyncd。
rsync + inotify
rsync + inotify 是最常见的方案。
Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等
本准备试验一下,在网上看到如下评价:
当向监控目录下拷贝复杂层次目录(多层次目录中包含文件),或者向其中拷贝大量文件时,inotify经常会随机性地遗漏某些文件。这些遗漏掉的文件由于未被监控到,所有监控的后续操作都不会执行,例如不会被rsync同步。
sersync
这是国人开发的实时同步工具。优点如下:
1.sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
2.配置简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。
3.使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4.有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
5. 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

实战
ip 目录 角色
192.168.1.2 /home/work 同步机
192.168.1.3 /home/work 被同步机

基于Centos6 ,使用 sersync + rsync 将 192.168.1.2 的 /home/work 目录实时同步到 192.168.1.3 的 /home/work 目录下。

192.168.1.3 被同步机操作

yum install rsync -y

vim /etc/rsyncd.conf

log file = /var/log/rsyncd.log #日志文件
pidfile = /var/run/rsyncd.pid #pid 文件
lock file = /var/run/rsync.lock #锁文件
secrets file = /etc/rsync.pass #认证文件
max connections = 0 # 连接数限制,0即不限制 [dubbo] # 模块名
path = /home/work # 同步目录
comment = dubbo # 注释,要与模块名一致
uid = root #设置rsync运行权限
gid = root
port = 873
use chroot = no
read only = no
list = no
timeout = 600
auth users = xx # 认证用户
hosts allow =192.168.1.2 # 允许同步的机器
hosts deny = 0.0.0.0/32

vim /etc/rsync.pass

xx:abc123  #对应rsyncd.conf 的 auth users

设置文件权限

chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass

启动

rsync --daemon

192.168.1.2 同步端操作

yum install rsync -y
rsync --daemon
echo "abc123" > /etc/passwd.txt
chmod 600 /etc/passwd.txt

sersync

以下解释下配置文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/> #是否开启debug模式,默认未开启
<fileSystem xfs="false"/> # 文件系统是xfs的要开启才能正常工作
<filter start="true"> #是否开启文件过滤,如下几种类型可以根据自己需要进行修改。
<exclude expression="(.*)\.out"></exclude> #过滤.out文件,如tomcat的catalina.out,微服务的nohup.out
<exclude expression="(.*)\.gz"></exclude> #过滤.gz文件
<exclude expression="^logs/*"></exclude> #过滤logs目录,如tomcat的logs目录
<exclude expression="^static/*"></exclude> #同上解释
</filter>
<inotify> # inotify的选项,默认即可
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify> <sersync>
<localpath watch="/home/work/"> # 要同步的目录
<remote ip="192.168.1.3" name="dubbo"/> # 要同步的服务器,及rsyncd.conf 模块名
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync> # 这里使用的是 rsync daemon 去同步,而不是ssh,所以要指定 passwordfile文件
<commonParams params="-artuz"/>
<auth start="true" users="xx" passwordfile="/etc/passwd.txt"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.log" timeToExecute="60"/><!--default every 60mins execute once--> # 同步错误日志
<crontab start="true" schedule="600"><!--600mins--> #是否开启全盘同步。
<crontabfilter start="false"> #如果开启了全盘同步,这里也要开启,并设置与上面一致的过滤类型。
<exclude expression="*(.*)\.out"></exclude>
<exclude expression="^logs/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync> <plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin> <plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>
</head>

执行同步

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml

监控脚本

vim /home/check_sersync.sh

#!/bin/bash

sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l) if [[ $status -eq 0 ]]; then
$sersync -d -r -o $confxml &
else
exit 0;
fi

添加执行权限

chmod +x /home/check_sersync.sh

设置定时任务

crontab -e

每隔两分钟执行一次
*/2 * * * * /bin/bash /home/check_sersync.sh > /dev/null 2>&1
lsyncd

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。

这个比sersync设置简单些。

实战

被控制端与如上一致。

同步机设置如下:

yum install lsyncd -y

vim /etc/lsyncd.conf

settings {
logfile = "/tmp/lsyncd.log", #日志
statusFile = "/tmp/lsyncd.status", #记录同步的文件和目录
pidfile = "/var/run/lsyncd.pid",
statusInterval = 1, #将lsyncd的状态写入上面的statusFile的间隔,默认10秒
nodaemon = false,
inotifyMode = "CloseWrite", #指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
maxProcesses = 1, #同步进程的最大个数
maxDelays = 1, #累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
}
sync {
default.rsync,
source = "/home/work/",
delete = true,
target = "xx@192.168.1.3::dubbo", # 认证用户,被同步的服务器,同步的模块名
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", #要同步的文件或目录列表,我测试lsyncd过滤并不好用,不清楚是哪里的问题。
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = false,
owner = true,
perms = true,
whole_file = false,
password_file = "/etc/passwd.txt"
}
}

启动即同步

/etc/init.d/lsyncd start
总结

我个人测试

  • sersync 文件多时同步较快
  • lsyncd 同步大文件时速度较快
  • sersync 过滤功能比较好用,lsyncd过滤我测试失败,暂未解决。

Linux文件同步的更多相关文章

  1. 烂泥:linux文件同步之rsync学习(一)

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1. rsync是什么 2. rsy ...

  2. Linux文件同步工具之rsync

    学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器.但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器 ...

  3. Qt linux文件同步写入

    因为linux 系统机制问题,文件的创建和写入并不会直接写入硬盘.而是先写入缓存,当系统要关闭或须要时才写入硬盘.为防止突然掉电,应将缓存中的文件及时同步到硬盘上去. linux 下的sync 命令具 ...

  4. linux 文件同步

    ref: https://www.cnblogs.com/MacoLee/p/5633650.html https://wenda.so.com/q/1505308236213470 http://b ...

  5. Inotify+Rsync实现Linux服务器文件同步

    做这个功能的时候遇到了好多坑,在此感谢一下这篇博客 http://kerry.blog.51cto.com/172631/734087/  ,大家参照这篇博客就能实现该功能. 另外如果想详细了解一下的 ...

  6. linux 下的 rsync 文件同步

    rsync是linux下的一款快速增量备份工具Remote Sync,是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync ...

  7. Linux下简单粗暴使用rsync实现文件同步备份【转】

    这篇来说说如何安全的备份,还有一点不同的是上一篇是备份服务器拉取数据,这里要讲的是主服务器如何推送数据实现备份. 一.备份服务器配置rsync文件 vim /etc/rsyncd.conf #工作中指 ...

  8. linux服务器之间的文件同步;rsync+inotifywait;同步多个目录

    1.双向同步:unison+inotify 2.单向同步:rsync+inotify python版的pyinotify 本文介绍第二种方法: 1.Inotify 是一个 Linux特性,它监控文件系 ...

  9. 负载均衡配置下的不同服务器【Linux】文件同步问题

    负载均衡配置下的不同服务器[Linux]文件同步问题2017年04月13日 22:04:28 守望dfdfdf 阅读数:2468 标签: linux负载均衡服务器 更多个人分类: 工作 问题编辑版权声 ...

随机推荐

  1. Rewrite json

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. Beta冲刺三

    Beta冲刺三 1.团队TSP 团队任务 预估时间 实际时间 完成日期 对数据库的最终完善 120 150 12.2 对学生注册功能的完善——新增触发器 150 140 11.29 对教师注册功能的完 ...

  3. 推理机Jess,Racer,Jena

    推理机 Jess(Java Expert Shell System)是基于Java语言的CLISP推理机. CLISP是基于产生式的前向推理引擎,许多上层的推理任务,都要映射到这个推理引擎上来运行. ...

  4. zookeeper分布式服务中选主的应用

    通常zookeeper在分布式服务中作为注册中心,实际上它还可以办到很多事.比如分布式队列.分布式锁 由于公司服务中有很多定时任务,而这些定时任务由于一些历史原因暂时不能改造成框架调用 于是想到用zo ...

  5. Windows下杀掉全部的子线程

    最近遇到一个问题,就是在Windows下怎么杀掉全部的子线程,现把解决方法记录下. 问题来源: 用python执行了一个bat脚本,脚本的内容是执行一系列的adb命令,然后运行一个server.其中需 ...

  6. C++入门程序作业2

    程序在Dev-C++5.5.3版本运行 结构体的使用 给结构体赋值,打印出结构体中学生姓名,分数,平均分 #include <iostream>#include <cassert&g ...

  7. reat + cesium。 实现 初始化时自动定位,鼠标移动实时展示坐标及视角高度, 淹没分析

    只贴实现淹没分析这块的代码. import styles from './cesium.less'; import React from 'react'; import Cesium from 'ce ...

  8. Java线程的创建及启动

    1.继承Thread类,重写该类的run()方法. package samTest; import java.util.Scanner; /** * Created by Sam on 2018-01 ...

  9. two pointers

    two pointers是算法编程中一种非常重要的思想,但是很少会有教材单独拿出来将,其中一个原因是它更倾向于是一种编程技巧,而长得不太像是一个是“算法”的模样.two pointers的思想十分简介 ...

  10. ubuntu两个conda安装和切换

    1. 下载anaconda2安装,一路默认,注意添加/home/wang/.bashrc选择yes 2. 在/home/wang/envs/py3安装anaconda3,其他同anaconda2 3. ...