Linux文件同步
简介
文件实时同步对于运维是个很常见的需求。
如集群的机器,需要上传个文件,之前的步骤是每台服务器分别上传。
做文件同步以后,只上传一台,其他机器自动同步。
目前实现实时同步的主流方案有 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文件同步的更多相关文章
- 烂泥:linux文件同步之rsync学习(一)
		本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1. rsync是什么 2. rsy ... 
- Linux文件同步工具之rsync
		学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器.但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器 ... 
- Qt linux文件同步写入
		因为linux 系统机制问题,文件的创建和写入并不会直接写入硬盘.而是先写入缓存,当系统要关闭或须要时才写入硬盘.为防止突然掉电,应将缓存中的文件及时同步到硬盘上去. linux 下的sync 命令具 ... 
- linux  文件同步
		ref: https://www.cnblogs.com/MacoLee/p/5633650.html https://wenda.so.com/q/1505308236213470 http://b ... 
- Inotify+Rsync实现Linux服务器文件同步
		做这个功能的时候遇到了好多坑,在此感谢一下这篇博客 http://kerry.blog.51cto.com/172631/734087/ ,大家参照这篇博客就能实现该功能. 另外如果想详细了解一下的 ... 
- linux 下的 rsync 文件同步
		rsync是linux下的一款快速增量备份工具Remote Sync,是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync ... 
- Linux下简单粗暴使用rsync实现文件同步备份【转】
		这篇来说说如何安全的备份,还有一点不同的是上一篇是备份服务器拉取数据,这里要讲的是主服务器如何推送数据实现备份. 一.备份服务器配置rsync文件 vim /etc/rsyncd.conf #工作中指 ... 
- linux服务器之间的文件同步;rsync+inotifywait;同步多个目录
		1.双向同步:unison+inotify 2.单向同步:rsync+inotify python版的pyinotify 本文介绍第二种方法: 1.Inotify 是一个 Linux特性,它监控文件系 ... 
- 负载均衡配置下的不同服务器【Linux】文件同步问题
		负载均衡配置下的不同服务器[Linux]文件同步问题2017年04月13日 22:04:28 守望dfdfdf 阅读数:2468 标签: linux负载均衡服务器 更多个人分类: 工作 问题编辑版权声 ... 
随机推荐
- Flutter 卡在 package get 的解决办法
			今天在尝试使用Flutter 的时候,需要使用一个第三方库 修改了 pubspec 文件之后,AS 像往常一样提示 需要 package get. 之前都挺正常,不知道今天怎么了. 一直处在 Runn ... 
- WINDOWS SERVER 2016 IE使用FLASH PLAYER的方法
			Windows Server 2016出于安全的考虑,默认禁用了Flash Player.把Windows Server 2016作为日常操作系统的童鞋会发现,IE里完全没有Flash Player这 ... 
- 集成学习-Adaboost
			Adaboost 中文名叫自适应提升算法,是一种boosting算法. boosting算法的基本思想 对于一个复杂任务来说,单个专家的决策过于片面,需要集合多个专家的决策得到最终的决策,通俗讲就是三 ... 
- redis 脑裂等极端情况分析
			脑裂真的是一个很头疼的问题(ps: 脑袋都裂开了,能不疼吗?),看下面的图: 一.哨兵(sentinel)模式下的脑裂 如上图,1个master与3个slave组成的哨兵模式(哨兵独立部署于其它机器) ... 
- nginx——优化 Nginx access 日志
			1. 配置日志切割 #!/bin/bash savepath_log='/usr/local/clogs' nglogs='/usr/local/nginx/logs' mkdir -p $savep ... 
- Python成长之路【第四篇】模块儿
			模块儿&包(* * * * *) 模块儿(modue)的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多 ... 
- 浏览器兼容性汇总--CSS篇
			目录 CSS篇 1. cursor:hand VS cursor:pointer 2. innerText在IE中能正常工作,但在FireFox中却不行 3. ... 
- 「LuoguP1280」尼克的任务
			LuoguP1280尼克的任务 : 线性dp 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构 ... 
- 周强 201771010141  《面向对象程序设计(Java)》第十一周学习总结
			实验十一 集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: Vector类实现了长度可变的数组. Stack ... 
- React Native - 网页组件(WebView)的使用详解
			一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍. 1,属性介绍 source: ... 
