0. 背景
一般web站点为了提高可用性都会使用多台服务器配置负载均衡, 但如果站点需要上传附件的话就会遇到一个问题, 上传到服务器内的附件如何能够让两台服务器都访问的到?
一般情况我们可以用这些方法:
- 大型站点可以考虑搭建专用的文件存储集群,可以考虑使用GlusterFS、Lustre、MooseFS、Ceph来实现。
- 如果在云环境下可以使用NAS,但是NAS只能作为一种临时性的存储方案,因为一旦NAS故障了就不存在什么高可用了。
- 介于NAS的稳定性,我们可以对NAS集群化,配合其他存储复制解决方案,例如使用NFS+DRBD的方式来实现。
- 较中小型的站点可以考虑将文件直接存储在每台服务器的磁盘上,使用代码触发文件同步,或者使用rsync类的工具进行文件同步。
本文主要针对最后一种,直接存储在服务器本地磁盘的方式来说明。
1. 简介
lsyncd 是一个支持实时、双向、多机器的多模式文件同步工具。 使用 Lua 语言封装,采用 Linux 内核(2.6.13 及以后)的 inotify 触发机制,然后通过 rsync 做差异同步,达到实时的效果。
为什么我们不直接使用rsync做文件同步,而要使用lsyncd呢? 这就要说以下lsyncd的主要特点:
- 实时性
- 使用rsync做同步的情况下 一般都需要额外配置定时任务触发。那么定时任务配置多长时间呢? 文件较小的情况下可以配置每分钟,但是依然可能存在50多秒的空白期,当访问量较大时这段时间内的用户访问都会出现404。 而文件较大的情况下呢,如果时间设置的短了,可能上一次同步任务还未完成就已经到了下一次同步任务启动的时间,最终的情况可能会导致出现多个相同文件的同步任务把系统资源耗尽。但如果同步的时间设置的长了呢又会留下空白期。
- 使用lsyncd的情况下 与rsync不同,不需要创建定时任务,文件一旦修改即发起同步。当然也可以灵活的配置修改后延迟多久再同步,或者接收到了几次修改后再同步。
- 高效率
- 使用rsync 众所周知,rsync的每一次同步任务都是将路径下的所有文件、子文件遍历,然后校验对比,需要消耗相当的系统资源或网络资源。
- 使用lsyncd lsync只对修改的这一个文件做校验和同步,不做额外无用的资源消耗。
- 同步方式 lsyncd与rsync一样,支持本机文件同步、rsync协议传输同步、ssh协议传输同步。其实lsyncd也是利用了rsync的二进制文件做文件校验与传输。
lsync支持使用多种协议传输文件,本文只列举其中一种。
2. 部署和使用
2.1. 安装
安装其实很简单只需要使用yum
yum install -y epel-release
#安装
yum install -y rsync lsyncd
2.2. 修改配置
#默认lsyncd配置文件路径
/etc/lsyncd.conf
#默认lsyncd日志路径,使用yum安装会自动配置日志截断,不需要额外干预
/var/log/lsyncd/lsyncd.log
#默认的rsync路径
/etc/rsyncd.conf
#默认的rsync日志路径
/var/log/messages
在两台服务器上修改rsyncd配置, 在rsync配置内新增一个area,授权指定ip或者网段的设备进入指定路径读写 hosts allow配置两台服务器对方的ip 具体的配置项说明详见:download.samba.org/pub/rsync/r…
#cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
max connections = 10
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.xz
[ops]
path = /root/ops
ignore errors
read only = no
hosts allow = 192.168.0.1 192.168.0.2
hosts deny = *
配置lsyncd.conf,同样分别在两台服务器上做配置,其中的target需要配置对方的ip 配置项说明详见:axkibe.github.io/lsyncd/manu…
# cat /etc/lsyncd.conf
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
settings {
logfile ="/var/log/lsyncd/lsyncd.log",
statusFile ="/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 7,
nodaemon = false,
insist = true
}
sync {
default.rsync,
source = "/root/ops/",
target = "192.168.0.11::cs-conf-ops/",
delete= "running",
exclude = {
".*"
},
delay = 0,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = false,
verbose = true
}
}
2.3 启动服务
systemctl start rsyncd
systemctl start lsyncd
systemctl enable lsyncd
systemctl enable rsyncd
2.4 验证
可以在其中一台服务器创建或者修改一个文件,看看另外一台有没有做出相应的变动