简介
文件实时同步对于运维是个很常见的需求。
如集群的机器,需要上传个文件,之前的步骤是每台服务器分别上传。
做文件同步以后,只上传一台,其他机器自动同步。
目前实现实时同步的主流方案有 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. Flutter 卡在 package get 的解决办法

    今天在尝试使用Flutter 的时候,需要使用一个第三方库 修改了 pubspec 文件之后,AS 像往常一样提示 需要 package get. 之前都挺正常,不知道今天怎么了. 一直处在 Runn ...

  2. WINDOWS SERVER 2016 IE使用FLASH PLAYER的方法

    Windows Server 2016出于安全的考虑,默认禁用了Flash Player.把Windows Server 2016作为日常操作系统的童鞋会发现,IE里完全没有Flash Player这 ...

  3. 集成学习-Adaboost

    Adaboost 中文名叫自适应提升算法,是一种boosting算法. boosting算法的基本思想 对于一个复杂任务来说,单个专家的决策过于片面,需要集合多个专家的决策得到最终的决策,通俗讲就是三 ...

  4. redis 脑裂等极端情况分析

    脑裂真的是一个很头疼的问题(ps: 脑袋都裂开了,能不疼吗?),看下面的图: 一.哨兵(sentinel)模式下的脑裂 如上图,1个master与3个slave组成的哨兵模式(哨兵独立部署于其它机器) ...

  5. nginx——优化 Nginx access 日志

    1. 配置日志切割 #!/bin/bash savepath_log='/usr/local/clogs' nglogs='/usr/local/nginx/logs' mkdir -p $savep ...

  6. Python成长之路【第四篇】模块儿

    模块儿&包(* * * * *) 模块儿(modue)的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多 ...

  7. 浏览器兼容性汇总--CSS篇

    目录 CSS篇 1.       cursor:hand   VS   cursor:pointer 2.        innerText在IE中能正常工作,但在FireFox中却不行 3.     ...

  8. 「LuoguP1280」尼克的任务

    LuoguP1280尼克的任务 : 线性dp 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构 ...

  9. 周强 201771010141 《面向对象程序设计(Java)》第十一周学习总结

    实验十一   集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: Vector类实现了长度可变的数组. Stack ...

  10. React Native - 网页组件(WebView)的使用详解

    一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍.   1,属性介绍 source: ...