用lsyncd和rsyncd实现无ssh支持的文件实时同步

文件存储与同步的基本讨论

网站发展到必定阶段,有时须要将各服务器上传的文件进行集中,这里讨论若是集中的问题,至于若是分散负载均衡、CDN加速、多主机、多域名等blablabla,概不讨论。linux

集中共享的方案(环境以CentOS 6.5为例)一般的做法是文件同步、共享硬盘空间、硬件堆叠和分布式文件存储四种。git

  1. 文件同步是用工具定时或自动将分散的文件同步到一个集中的存储区域,如cron配合ftp、ssh、rsync等实现定时同步;github

  2. 共享空间的作法是用文件存储协议实现挂载和管理,如mount、samba、NFS;apache

  3. 硬件堆叠是采用大磁盘空间实现,如阵列;centos

  4. 最后一种是集群和分布式文件系统,如taobao文件系统 tfs服务器

第2种不太稳定,第3种成本高,第4种实施复杂,最简单实用的是第1种。负载均衡

第1种方案传统的作法是用rsync命令,结合ssh证书受权免账号登陆来实现同步,但这种作法有几个负面影响:ssh

  • 须要添加本地账号分布式

  • 不是实时同步工具

  • 配置稍显啰嗦

好了,咱们要实现的功能的实时监控,实时同步,管理简单,维护方便,这里介绍lsyncd和rsyncd两个命令实现的文件集中同步管理。

lsyncd负责监控文件的变化,发起文件推送;rsyncd负责接收同步指令,进行身份认证及写文件到本地。

lsyncd和rsyncd的配置及管理

接收端rsyncd的配置

通常linux服务器均安装有rsync命令,没有的就安装一个。

yum install rsync

配置成daemon运行方式

 vi /etc/rsyncd.conf
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[img]
    path = 换成本地写入文件夹绝对路径
    comment = special offer image files
    uid = root
    gid = root
    read only = no
    list = yes
    auth users = rsyncclient
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.100.0/255.255.255.0 192.168.200.234

注意:[img]为虚拟目录名称,在发起端配置中要用到;hosts allow换成发在发端的IP地址;auth users为认证的用户名,密码存在/etc/rsyncd.secrets文件里。uid和gid此处写的是root注意换成你本身的真实用户和组,如,是网站上传的文件夹,须要换成apache或nobody,不然文件上传会失败。

vi /etc/rsyncd.secrets
rsyncclient:password

注意:此密码文件与发在发端的密码文件稍有不一样,多了一个用户名。

启动rsyncd(假设当前在root环境):

/usr/bin/rsync --daemon

把这个命令加到 /etc/rc.local做自动启动用。

查看服务Log是否有错误

tail -f /var/log/rsyncd.log

 

发起端lsyncd的配置

安装

yum install lsyncd

若是提示没有找到lsyncd你须要下载epel.repo (关于阿里云镜像的配置)到/etc/yum.repos.d/目录下再安装便可。

vi /etc/lsyncd.conf

将下述代码粘贴到此文件

settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd-status.log",
    statusInterval = 10
}
--------------------------------
-- sync files to product server
-------------------------------
sync {
    default.rsync,
    source="换成你的要监控并同步的文件夹绝对路径",
    target="rsync://rsyncclient@[换成接收端IP]:/img",
    delete = false,-- Doesn't delete files on the remote host eventho they're deleted at the source. This might be beneficial for some not for others
    delay = 5, -- We want to delay the syncing for 5 seconds so we queue up the events
    maxProcesses = 4, -- We only want to use a maximum of 4 rsync processes at same time
    rsync = {
        password_file = "/etc/rsyncd.secrets_master",
        compress = true,
        acls = true,
        verbose = true,
        owner = true,
        group = true,
        perms = true
    }
}

重要:注意上面的 delete = false 参数,若是不要删除接收端的文件,请设置为 false,不然将自动删除发起端没有,但在接收端有的文件!!请慎重选择,通常设成false。

上面配置中假设同步账号叫 rsyncclient,密码文件存放在 /etc/rsyncd.secret_master,注意:这里的账号不是本地账号,只是rsyncd的虚拟账号。

接收端虚拟路径叫 img,具体定义参考接收端的配置,它只是一个虚拟目录,实际指向在配置文件中。

vi /etc/rsyncd.secrets_master
password

注意:此文件一行只有一个明文密码。

最后,启动lsyncd服务

service lsyncd start

查看log看是否正常启动

tail -f /var/log/lsyncd/lsyncd.log

若是有这行代表正常启动并配置成功了。

Normal: Finished a list after exitcode: 0

将lsyncd设成自动启动

chkconfig --level 3 lsyncd on

 

一切顺利的话,发起端已经监控了文件的变化,并在5秒延时后自动推送到接收端,您能够本身测试查看实际效果。再次提醒,请先在测试环境演练多遍,观察至少一周时间后再配置到生产环境!

‍总结‍

此方案的优势是实时同步,无须ssh协议支持,不须要添加本地账号,配置简单,布署灵活。

 

<做者:朱淦 350050183@qq.com>‍

相关文章
相关标签/搜索