生产环境中大家也许会遇到需要将2台服务器xx目录进行实时同步,有人可能会想到sersync,但是臣妾做不到(例如2台服务器双向配置了sersync进行实时同步,如果有一台重启后,那么sersync将会按照重新启动sersync软件的服务器目录进行同步,所以请慎重使用)!
下面介绍一下lsyncd这个软件,Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync 海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。
lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。
实验环境:
VMware14
Centos7.6
lsyncd2.2.2(yum安装即可)
rsync3.1.2(yum安装即可,lsyncd自带可能版本低,请自行安装)
创建2台服务器(nfs01、nfs02)
首先配置好rsync配置文件(/etc/rsyncd.conf),然后配置lsyncd配置文件(/etc/lsyncd.conf),详解如下:
#只适合小文件,实验环境(1g内存1核心)大于500m,死机;
settings {
#定义日志文件位置
logfile = "/var/log/lsyncd.log",
#定义(文件修改等)状态文件位置;
statusFile = "/var/log/lsyncd.status",
#指定inotify监控的事件,默认是 CloseWrite ,还可以是 Modify 或 CloseWrite or Modify;
inotifyMode = "CloseWrite or Modify",
#同步进程的最大个数,可根据服务器性能修改,最好不要超过核心数;
maxProcesses = 2,
}
sync {
#默认同步方式有rsync、direct、rsyncssh等;
default.rsync,
#需要同步的本地目录;
source = "/zhihuupload",
#目标远端服务器;
target = "rsync_backup@172.16.1.32::zhihuupload",
#running:指Lsyncd在启动时不会删除目标上的文件,但会删除正常运行操作期间删除的文件,同步删除需要使用running;
delete = "running",
#多久(15s)同步一次;
delay = 15,
#当 init = false ,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步,但是2.2版本无法填写init=true会报错,所以不写默认为true
#init = true,
rsync = {
#rsync命令位置;
binary = "/usr/bin/rsync",
#归档模式
archive = true,
#压缩传输;
compress = true,
#增量复制
verbose = true,
password_file = "/etc/rsync.passwd",
#限制传输速率1m,参数-av;
_extra = {"--bwlimit=5000"}
}
}
实现功能:
nfs01和nfs02共享目录/zhihuupload实现双向实时同步,且重启服务时同步拉取对方最新数据,还可以定时如15s同步一次,降低负载,但不足之处就是同步文件过大会造成负载过高的问题(可能是实验环境造成的)。
报错分析:
1、加载配置文件正常,服务启动失败报lsyncd[7885]错误
Error: in Lua: /builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659: attempt to call field 'init' (a boolean value)
Error: Backtrace 1 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659
Error: Backtrace 2 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:4374
主要是因为lsyncd2.2版本bug引起,如需使用init=true功能,配置文件中请不要直接写init=true来开启功能,如需init=true请将init=true注释或删除(因为默认init=true)来解决7885报错。
2、rsync未启动或配置错误,报错中会突出显示rysnc错误,根据错误提示修改即可
BTC:3LD8DBk5nZSwmGoF1mvM12Pp5YqNFEvfLA
ETH:0xAD765200e7Feb98a2AF262387A41F078e9F91eAc