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

  1. $ rpm -qa | grep rsync # 查看rsync是否安装
  2. rsync-3.1.2-10.el7.x86_64
  3. # 若没有安装,请执行下面指令进行安装
  4. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  5. yum -y install rsync

配置rsync服务器

  1. $ cat /etc/rsyncd.conf
  2. uid = zhsjpt # 这里的uid和gid决定了rsync同步过来的文件属主及属组,默认是nobody
  3. gid = zhsjpt
  4. use chroot = yes
  5. address = 192.168.20.5 # rsync监听地址
  6. port = 873
  7. log file = /var/log/rsyncd.log
  8. pid file = /var/run/rsyncd.pid
  9. hosts allow = 192.168.20.0/24
  10. dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
  11. [NRPE]
  12. path=/data
  13. comment=test rsync
  14. read only=no
  15. list=false # Rsync客户端不可以列出目录结构
  16. # 创建相应的用户、目录及设置属主属组为配置文件中指定的用户,以便拥有相应权限
  17. useradd zhsjpt
  18. echo passwd | passwd --stdin zhsjpt
  19. mkdir /data
  20. chown zhsjpt.zhsjpt /data
  21. # 启动rsync启动进程,并确定端口在监听
  22. systemctl start rsyncd
  23. ss -lnput | grep 873
  24. 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