互联网技术博客

CentOS 7 使用 Lsyncd 实现文件实时同步

使用多台Linux服务器通过Nginx做负载均衡,根据配置的转发规则,不同的请求会被转发到其不同的服务器上进行处理,那么这个时候就存在一个问题,多台服务器上的数据如何能保持一致,比如:用户在A服务器上传了一张图片,但是B服务器上没有,如果其他用户的请求被分配到了B服务器上,那么请求就会变成404,为了避免这类问题,就需要每台服务器之间数据保持实时双向同步。

本文主要介绍使用Lsyncd工具在两台服务器上做实时双向同步。

注意:Lsyncd存在数据被替换风险,操作前请做好数据备份!

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

首先在两台服务器上分别安装 Lsyncd:

安装lsyncd依赖包:

yum install lua lua-devel pkgconfig gcc asciidoc
安装lsyncd rpm资源,并安装lsyncd:

rpm -iUvh http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-9.noarch.rpm
yum install lsyncd
复制lsyncd配置文件:

cp /usr/share/doc/lsyncd-2.2.2/examples/lrsync.lua /etc/lsyncd.conf
CentOS 7搭建lsyncd实现两台服务器文件实时双向同步可用于负载均衡

查看lsyncd版本:

CentOS 7搭建lsyncd实现两台服务器文件实时双向同步可用于负载均衡

到这一步lsyncd已经安装好了。

下面进行两台服务器之间做免密登录设置,互相可以免密登录:

分别在两台服务器执行下面命令,生成key(以下操作两台服务器都要同时进行):

ssh-keygen #默认全部回车
然后执行下面命令:

ssh-copy-id ip #这里的ip地址为想要连接的那台服务器ip地址,并非本机ip
命令执行后输入“yes”,然后输入密码,即可连接到第二台服务器,如下图所示:

CentOS 7搭建lsyncd实现两台服务器文件实时双向同步可用于负载均衡

然后执行下面命令测试一下从这台服务器登录到另外一台服务器,不输入密码是否能成功:

ssh ip
到这里我们就完成了两台服务器之间互相无密码登录。

配置lsyncd:

在A服务器根目录创建创建一个目录“download”,B服务器创建一个目录“public”,进行演示这两个目录互相实时同步。

编辑lsyncd配置文件:

vim /etc/lsyncd.conf
在A服务器配置文件中添加如下配置信息(B服务器同样需要添加,修改下源目录和远程目录即可):

—-
— User configuration file for lsyncd.

— Simple example for default rsync.

settings {
logfile =”/var/log/lsyncd.log”,
statusFile =”/tmp/lsyncd.stat”,
inotifyMode = “CloseWrite or Modify”,
maxProcesses = 5,
maxDelays = 1,
— nodaemon =true,
}

sync {
default.rsync,
source = “/download”, #源目录,使用绝对路径
target = “root@116.85.xx.xx:/public”, #远程目录
— excludeFrom = “/etc/rsyncd.d/rsync_exclude.lst”,
rsync = {
binary = “/usr/bin/rsync”,
archive = true,
compress = true,
verbose = true,
}
}
启动lsyncd服务,并设置开机启动:

systemctl start lsyncd
启动完成后查看lsyncd状态,确保lsyncd启动成功:

systemctl status lsyncd
设置开机启动:

systemctl enable lsyncd
启动成功后,我们可以测试一下看看效果,如下图所示:

CentOS 7搭建lsyncd实现两台服务器文件实时双向同步可用于负载均衡


问题1:

执行命令:/etc/init.d/lsyncd status

显示:lsyncd 已死,但 pid 文件仍存

于是查看日志文件:cat /var/log/lsyncd/lsyncd.log

日志里显示:

Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches

———————————————————–

其中 max_user_watches 是一个文件,里面有一个数字值,表示每个inotify实例可监听的最大上限数量。

这问题明显就是文件增多,导致无法监控更多的文件,把里面的那个值改大点就可以了

修改方法1:echo 10008192 > /proc/sys/fs/inotify/max_user_watches(修改后,Linux系统重启inotify配置max_user_watches无效被恢复默认值8192)

修改方法2:vim /etc/sysctl.conf 

注意添加的内容:

fs.inotify.max_user_watches=99999999(你想设置的值,此方法修改后重启linux,max_user_watches值不会恢复默认值8192

重新启动 lsyncd :service lsyncd restart

查看 lsyncd 状态 :/etc/init.d/lsyncd status

显示:lsyncd (pid  9943) 正在运行…

问题解决。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注