Centos7.x部署lsyncd和rsync实现文件的实时同步

既然rsync可以实现服务器间的文件同步,为何还需要lsyncd?

  • rsync无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”。
  • lsyncd就可以监听文件的修改,换句话说,某个文件修改了,lsyncd会得到通知(原理是使用linux系统的inotify/fsevents功能),得到通知之后,再去调用rsync把修改的文件进行同步(即组装一句rsync同步语句并执行),达到“实时同步”的效果。

实验环境:

CentOS 7.6 最小化安装

需求及网络拓扑图如下

A(192.168.123.100):Rsync客户端+lsyncd

B(192.168.123.200):Rsync服务端(daemon模式)

需求:

当A服务器中的文件发生变化(新增、修改、删除),实时推动到B服务器

实现思路:

A中部署Rsync客户端+lsyncd,lsyncd通过内核的inotify触发机制监控文件的动向,并将改动发送给Rsync,由Rsync同步到服务器B;服务器B以守护进程的方式部署Rsync服务端,接收A发来的文件同步请求,并将文件同步!

一、安装Rsync

在A服务和B服务器执行以下命令安装Rsync

yum install -y rsync

二、安装lsyncd

CentOS 7自带的yum无法安装lsyncd。可以通过安装EPEL存储库的方式再用yum安装lsyncd,命令如下:

yum install -y epel-release

yum -y install lsyncd

lsyncd 只需要在A服务器上安装,B服务器无需安装

三、配置Rsync(B端)

A服务器为Rsync客户端,安装完成即可,B服务器以daemon方式运行,所以只需要对B服务器的Rsync进行配置

1、修改配置文件:

vim /etc/rsyncd.conf

将配置文件修改如下:

uid = rsync
gid = rsync
use chroot = no
max connections = 200
pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
log file = /var/log/rsyncd.log
timeout = 900
ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# 无需rsync以root身份运行,允许接受数据
fake super = yes

[project]
path = /data/project/project_file
comment = 项目文件
ignore errors
read only = false
list = false
auth users = rsync
secrets file = /etc/rsyncd.pwd

2、创建用户组和用户

groupadd rsync

useradd -s /sbin/nologin -M -g rsync rsync

3、创建同步目录并授予权限

mkdir /data/project_file

chown -R rsync:rsync /data/project_file

4、创建认证用户和密码文件并修改权限

Rsync进行同步需要一个同步的虚拟用户,这个用户的用户名已经在配置文件里指定,下面创建这个用户名的用户密码文件

由于是用户名和密码文件所以必须要将其修改为600权限,不然后期会报错无法认证

echo "rsync:rsync" >/etc/rsyncd.pwd

chmod 600 /etc/rsyncd.pwd

5、启动Rsync

systemctl start rsyncd

6、验证Rsync是否启动

我们可以通过查看Rsync监听端口(Rsync默认监听873端口),或者查看日志文件以确定Rsync是否以daemon模式成功启动

netstat -anlpt | grep rsync

或者

cat /var/log/rsyncd.log

至此,服务器B端的操作,已经结束

7、测试Rsync

服务器A需要创建相应的密码认证文件用于用户自动认证

由于也是密码文件,所以也需要将文件权限修改为600

echo "rsync" > /etc/rsyncd.pwd #由于我们要在同步命令里指定用户名,所以这里就不再指定用户名

chmod 600 /etc/rsyncd.pwd

由于服务端路径存在权限问题,所以同步源(Rsync客户端)也需要进行相同权限设置

下面进行创建用户(组)、目录、创建测试文件并赋予其权限

groupadd rsync

useradd -s /sbin/nologin -M -g rsync rsync

# 创建需要同步的目录
mkdir /data

关闭两台服务器的防火墙

systemctl stop firewalld

关闭两台服务器的selinux

# vi /etc/selinux/config

#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加

# setenforce 0  #立即生效

下面进行测试

将A服务器/data/ 目录下的文件同步到B服务器

rsync -avz /data/ rsync@192.168.123.200::project --password-file=/etc/rsyncd.pwd

注:

  1. 两个冒号
  2. /data   服务器A的数据源路径
  3. project是模块名称,配置文件里已写明
  4. rsync@192.168.123.200 认证用户名@被同步的服务器IP,这里是B服务器的IP

8、检测传输

查看B服务器的/data/project_file目录,看下文件是否已经同步过来了

四、配置lsyncd

1、修改配置文件

vim /etc/lsyncd.conf

删除原有内容并键入以下内容

settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
    inotifyMode = "CloseWrite",
    maxProcesses = 8,
    maxDelays = 1,
    nodaemon = false,
}
sync {
    default.rsync,
    source = "/data/",                         --监控目录
    target = "rsync@192.168.123.200::project",    --rsync的认证用户名、IP、模块
    delete = true,
    delay = 15,
    init = false,
    rsync = {
        binary = "/usr/bin/rsync",               --rsync可执行文件路径,必须为绝对路径
        password_file = "/etc/rsyncd.pwd",       --密码认证文件
        archive = true,
        compress = false,
        verbose = false,
        _extra = {"--bwlimit=200", "--omit-link-times"}
    }
}
--如果有多台服务器需要同步,依次往下配置多个sync即可

注:lsyncd的配置文件是lua语法,注释方式为:“--”

2、启动lsyncd

systemctl start lsyncd

3、测试

修改/data 目录下的任意文件,保存,查看B服务器是否同步

五、常见问题

1. 启动lsyncd报错

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)来解决报错。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值