多台服务器文件实时同步利器“lsyncd”的填坑之旅

一、什么情况下会用到文件实时同步?

用到文件实时同步的地方有很多,比如实时备份等等。下面是我在实际项目中遇到需要使用文件同步的情况:

一个项目中使用了两台服务器做负载均衡,但是并没有第三台服务器作为文件服务器,所以在上传文件后需要将文件同步到另一台服务器,不然前台访问不了这个文件。

二、使用什么工具来实现文件实时同步?

经过比较,最终选择Lysncd作为文件同步的工具。

Lysncd 实际上是 lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。

三、Lysncd的安装

我的两台服务器环境是centos系统,目前Lysncd还不支持Windows。

centos下使用以下命名,即可安装:

yum -y install lsyncd

四、Lysncd的配置

假设两台服务器的地址分别为:192.168.0.1,192.168.0.2

  • 设置SSH免密登录

假设让192.168.0.1免密登录到192.168.0.2。

1.分别登录到两台服务器执行命令:

ssh-keygen -t rsa

2.登录到192.168.0.1服务器执行以下命令(就是192.168.0.2将公钥拷贝到192.168.0.2实现SSH免密登录):

ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 27 root@192.168.0.2"

注:如果需要双向同步(两台服务器相互同步),请将上面的第二步到另一台服务器执行一遍。

  • Lysncd配置

下面给出一个最基本的配置,更多配置请参考官方。配置文件一般在目录:etc/lsyncd.conf

settings {
	logfile      ="/var/log/lsyncd.log",
	statusFile = "/tmp/lsyncd.stat",
	statusInterval = 1,
	inotifyMode  = "CloseWrite or Modify",
    	maxProcesses = 5,--最大线程数
    	maxDelays = 1,  --文件变更事件数达到1就触发同步,即使下面定义的delay延迟时间还没到
    -- nodaemon =true,
}

sync{
	default.rsync,
	     source = "/var/www/",                  --源目录
    		delete = true,                          --保持完全同步
    		target = "root@192.168.0.1:/var/www/",   --目标目录
    		exclude = { "*.log",".*","*.filepart"},  --过滤不同步的文件类型
	rsync = {
    		binary = "/usr/bin/rsync",
    		archive = true,
    		compress = false,
    		verbose = true,
    } 
}

五、Lysncd启动

启动命令:

systemctl start lsyncd

六、采坑之旅

在实际使用中在后台上传文件后两台服务器双向同步的过程中发现会产生很多临时的隐藏文件,并且上传的图片经常显示不全。

经过排查发现只有上传较大的文件(比如1M以上的图片)会产生这样现象,原因是Lysncd在同步大文件时会把文件切割成小块的文件传输最后合并。导致这些小块文件来回同步互相锁定而发生错误。

解决方案:即在Lysncd的配置文件中把隐藏的临时文件和切割分段文件的过滤不同步即可:

exclude = { ".*","*.filepart"},

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/28297.html

发表评论

登录后才能评论