date: 2020-11-24title: lsyncd + rsync实现数据实时同步 #标题
tags: 文件同步 #标签
categories: linux大杂烩 # 分类
业务需求:主机node01的/data/webdata/
和主机node02的/data/web/
目录需要保证数据一致。我选择采用lsyncd + rsync来实现。
环境准备
OS | hostname | IP | service |
---|---|---|---|
Centos 7.5 | node01 | 192.168.20.5 | rsync |
Centos 7.5 | node02 | 192.168.20.6 | lsyncd |
配置rsync服务器
安装rsync
$ rpm -qa | grep rsync # 查看rsync是否安装
rsync-3.1.2-10.el7.x86_64
# 若没有安装,请执行下面指令进行安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install rsync
配置rsync服务器
$ cat /etc/rsyncd.conf
uid = zhsjpt # 这里的uid和gid决定了rsync同步过来的文件属主及属组,默认是nobody
gid = zhsjpt
use chroot = yes
address = 192.168.20.5 # rsync监听地址
port = 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.20.0/24
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[NRPE]
path=/data
comment=test rsync
read only=no
list=false # Rsync客户端不可以列出目录结构
# 创建相应的用户、目录及设置属主属组为配置文件中指定的用户,以便拥有相应权限
useradd zhsjpt
echo passwd | passwd --stdin zhsjpt
mkdir /data
chown zhsjpt.zhsjpt /data
# 启动rsync启动进程,并确定端口在监听
systemctl start rsyncd
ss -lnput | grep 873
tcp LISTEN 0 5 192.168.20.5:873 *:* users:(("rsync",pid=2578,fd=3))
上面的配置基本够用,若想了解详细的配置参数,请参考: rsync服务器配置参数详解。
测试rsync服务器
以下操作在node02主机上进行测试。
# 准备测试文件并查看属主及权限
$ echo 'test rsync service' > test.txt
$ ll
-rw-rw-r-- 1 ljza ljza 19 6月 25 15:56 test.txt
$ cat test.txt
test rsync service
# 将准备好的文件同步到rsync服务器NRPE模块指定的data目录下的rsync_test目录下(注:此时rsync的data目录下没有rsync_test目录)
$ rsync -avz test.txt 192.168.20.5::NRPE/rsync_test/
# rsync服务器上查看同步过来的文件如下:
$ ll /data/
drwxr-xr-x 2 zhsjpt zhsjpt 22 6月 25 16:00 rsync_test
$ cat /data/rsync_test/test.txt
test rsync service
# node02主机删除测试数据,然后再将node01的文件同步过来
$ rm -f test.txt
$ rsync -avz 192.168.20.5::NRPE/rsync_test/test.txt .
$ cat test.txt
test rsync service
以上测试,不管是要把文件同步到rsync主机,还是从rsync主机同步文件,都没有问题了,rsync服务器就配置完成了。
配置lsyncd服务器
安装lsyncd
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install lsyncd
配置lsyncd
# 修改lsyncd配置文件
$ cat /etc/lsyncd.conf
settings {
inotifyMode = "CloseWrite or Modify",
nodaemon=false,
maxDelays=3,
statusFile = "/tmp/lsyncd.status",
statusInterval = 1,
logfile = "/var/log/lsyncd/lsyncd.log"
}
sync {
default.rsync,
source = "/data/web",
target = "192.168.20.5::NRPE/webdata/",
delete = false,
delay = 3,
maxProcesses = 8,
exclude = {
".git",
".idea",
},
rsync = {
binary = "/usr/bin/rsync",
perms = true,
acls = true,
xattrs = true,
quiet = true,
archive = true,
compress = true,
verbose = true,
}
}
# 创建需要同步的目录
mkdir /data/web -p
# 创建用户,并修改目录属主(不建议使用root用户去同步数据,这样rsync服务器会产生不必要的错误日志(虽然也可以同步成功),因为rsync服务器不是用root用户同步的。)
useradd user_lv
chown user_lv.user_lv /data/ -R
lrsync部分配置参数解释
参考: 官方文档
settings字段
此字段是全局设置,- -开头表示注释,下面是几个常用选项说明:
- logfile: 定义日志文件
- stausFile: 定义状态文件
- nodaemon=false: 表示启用守护模式,默认为true。
- statusInterval: 将lsyncd的状态写入上面的statusFile的间隔,默认10秒。
- inotifyMode: 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
- maxProcesses: 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
- maxDelays 累计到多少所监控的事件(发生变化的文件数)激活一次同步,即使后面的delay延迟时间还未到。
sync字段
此字段是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。
一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式:
- default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
- default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份;
- default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证。
source: 同步的源目录,使用绝对路径。
- target: 定义目的地址.对应不同的模式有几种写法: /tmp/dest: 本地目录同步,可用于direct和rsync模式,192.168.88.133:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd —delete —include-from=- —exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步,192.168.88.133::module :同步到远程服务器目录,
- init: 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true
- delay: 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)
- delete: 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。但建议配置此选项为false。
rsync字段
此字段是配置在同步时的rsync参数,这里简单些几个参数,如果不明白参数的含义,可以通过rsync --help | grep 参数
指令去获取相应参数的含义。
- bwlimit: 限速,单位kb/s。
- compress: 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false。
- perms: 默认保留文件权限。
注:lsyncd.conf文件中可以有多个sync,各自的source,各自的target,各自的模式,互不影响。另外要特别注意,建议一定要在lsync配置中指定delete = false
参数,此举是为了避免lsyncd上误删除,而造成rsync服务器上的同步文件也被删除。
启动lsyncd
$ systemctl start lsyncd
测试主机间数据同步效果
# node02主机使用user_lv用户新建数据
su - user_lv
cd /data/web
echo test1 > test1.txt
# node01查看数据是否同步
$ cat /data/webdata/test1.txt
test1
# node02删除刚才新建的数据
rm -f test1.txt
# node01再次查看,数据不会丢,因为我们在lsyncd中配置了delete = false参数。
$ cat /data/webdata/test1.txt
test1