Lsyncd实时同步

1、实时同步简介

实时同步是指当存储服务器中数据新增、删除或发生改变后,立刻将变化后的数据同步至备份服务器,保持存储服务器和备份服务器之间数据的统一。

1.1 实时同步使用场景

1.解决NFS单点故障问题
2.备份NFS服务器数据,提供冗余服务

1.2 实时同步实施难点

1.什么条件下才对数据同步?
2.同步哪些文件?
3.多久同步一次?
4.使用什么工具同步?

2、Inotify实现实时同步

2.1 Inotify简介

Inotify是一个Linux特性,提供了文件系统事件监控机制;它监控文件系统操作,比如读取、写入和创建。Linux-2.6.13内核起加入inotify支持。

查看系统是否支持inotify

[root@nfs ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 11月 25 15:00 max_queued_events
-rw-r--r-- 1 root root 0 11月 25 15:00 max_user_instances
-rw-r--r-- 1 root root 0 11月 25 15:00 max_user_watches

#状态解释
max_queued_events    #设置inotify实例事件(event)队列可容纳的事件数量
max_user_instances   #设置每个用户可以运行的inotify或者inotifywatch命令的进程数
max_user_watches     #设置inotifywait或者inotifywatch命令可以监视的文件数量(单进程)

2.2 inotify工具安装使用

使用inotify工具监控存储服务器本地数据是否发生变化,当监控到本地数据变化,将变化之后的数据使用Rsync工具同步至备份服务器。

存储服务器安装inotify-tools工具

[root@nfs ~]# yum -y install http://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/inotify-tools-3.13-2.el7.art.x86_64.rpm

inotifywait命令选项

-m        #始终保持事件监听状态
-r        #递归查询目录
-q        #仅打印监控事件信息
--timefmt #指定时间输出格式
--format  #指定事件输出格式
-e        #指定事件,增、删、改等事件
-t        #超时时间
-exclude  #排除指定文件或目录,不区分大小写

#事件输出格式
%T        #调用并显示定义好的时间格式
%w        #显示发生变化的文件路径
%f        #显示监控到的文件名称,和%w一起显示文件的绝对路径
%e        #显示事件类型

#事件说明
access    #读取文件或目录内容
modify    #修改文件或目录内容
create    #在监视目录下创建文件或目录
delete    #删除监视目录下的文件或目录
attrib    #文件或目录属性改变
close     #文件被关闭
open      #文件或目录被打开
move      #文件或目录被移动到监视目录
umount    #卸载文件系统

inotifywait监控命令测试

#创建数据存放目录/data,使用inotifywait命令监控/data目录变化
[root@nfs ~]# mkdir /data
[root@nfs ~]# inotifywait -mrq --format '%w%f' -e create,delete,modify /data/

#此时当/data目录有create,delete,modify事件时,会将触发事件的文件绝对路径打印出来

#监控多个目录,并显示时间与触发的事件信息
[root@nfs ~]# inotifywait -mrq --timefmt '%F %H:%M' --format '%T %w%f %e' -e create,delete,modify /data/ /backup/

2.3 Inotify+Rsync实现实时同步

#环境准备
NFS存储服务器:利用inotify+rsync工具撰写实时同步脚本
Backup备份服务器:Rsync服务模式,配置/backup目录为数据备份目录,模块名称为backup

#存储服务器安装Rsync,撰写实时同步脚本
[root@nfs ~]# mkdir /scripts
[root@nfs ~]# vim /scripts/inotify_rsync.sh
#!/bin/bash
#配置rsync客户端虚拟用户密码
export RSYNC_PASSWORD='passwd'
#使用监测数据目录变化,将变化的文件绝对路径通过管道符传递给while循环进行读取,进行传输
inotifywait -mrq --format '%w%f' -e create,delete,modify /data/ | while read line
do
    if [ -f ${line} ];then
        rsync -avz ${line} rsync_backup@10.0.0.16::backup
    else
        rsync -avz --delete /data/ rsync_backup@10.0.0.16::backup
    fi
done

[root@nfs ~]# chmod +x /scripts/inotify_rsync.sh
[root@nfs ~]# /scripts/inotify_rsync.sh

#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch file1
[root@nfs /data]# ls
file1

[root@backup ~]# ls /backup/
file1

注意:虽然Inotify+Rsync可以实现实时同步,但其效率低下,同步延迟较高。

3、Sersync实现实时同步

Sersync = Inotify + Rsync
Inotify有监控的功能,而Rsync有数据同步的功能,Sersync的功能就是监控某个目录,当这个目录触发事件时(插入、删除、修改等事件)就自动触发Rsync将数据变化及时的同步到备份服务器。

Sersync服务部署

#环境准备
NFS存储服务器:Rsync + inotify + Sersync
Backup备份服务器:Rsync服务模式

#存储服务器下载安装Sersync工具
[root@nfs ~]# cd /opt/
[root@nfs /opt]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@nfs /opt]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@nfs /opt]# cd GNU-Linux-x86/
[root@nfs /opt/GNU-Linux-x86]# ls
confxml.xml  sersync2

[root@nfs /opt/GNU-Linux-x86]# cp confxml.xml confxml.xml.bak

#修改sersync配置文件
[root@nfs /opt/GNU-Linux-x86]# vim confxml.xml
    <sersync>
        <localpath watch="/data">        #监控的本地目录,需要同步的目录
            <remote ip="10.0.0.16" name="backup"/>    #备份服务器的IP和rsync模块名称
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-az"/>        #本地rsync工具使用选项
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pass"/>    #rsync虚拟用户名和密码文件
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>

[root@nfs /opt/GNU-Linux-x86]# echo 'passwd' > /etc/rsync.pass
[root@nfs /opt/GNU-Linux-x86]# chmod 600 /etc/rsync.pass

#启动sersync服务
[root@nfs /opt/GNU-Linux-x86]# ./sersync2 -rdo confxml.xml

[root@nfs /opt/GNU-Linux-x86]# ps aux | grep '[s]ersync'
root      36134  0.0  0.0  92336   756 ?        Ssl  17:09   0:00 ./sersync2 -rdo confxml.xml

#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch test1
[root@nfs /data]# ls
test1

[root@backup /backup]# ls
test1

注意:Sersync服务可以实现实时同步,但性能还是不够高,效率比较低;虽说可以通过多个配置文件启动多个Sersync服务解决效率问题,但是Sersync服务程序已经停止维护不再更新。

4、Lsyncd实现实时同步

Lysncd是lua语言封装了inotify和rsync工具,采用了Linux内核中的inotify触发机制,然后通过rsync去差异同步,达到实时的效果。它最令人称道的特性是完美解决了inotify+rsync海量文件同步带来的频繁发送文件列表的问题 (通过时间延迟或累计触发事件次数实现)。

Lsyncd服务部署

#环境准备
NFS存储服务器:lsyncd服务
Backup备份服务器:Rsync服务模式

#存储服务器配置阿里云扩展源
[root@nfs ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@nfs ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

#存储服务器安装lsyncd服务
[root@nfs ~]# yum -y install lsyncd

#修改lsyncd配置文件
settings {
  logfile = "/var/log/lsyncd/lsyncd.log",
  statusFile = "/var/log/lsyncd/lsyncd.status",
  inotifyMode = "CloseWrite",
  maxProcesses = 10,
  maxDelays = 10,
  nodaemon = true,
  statusInterval = 10,
  }
sync {
  default.rsync,
  source = "/data",
  target = "rsync_backup@10.0.0.16::backup",
  delay = 1,
  delete = true,
  exclude = {".*"},
  rsync = {
    binary = "/usr/bin/rsync",
    password_file = "/etc/rsync.pass",
    archive = true,
    compress = true,
    verbose = true,
    _extra = {"--bwlimit=20"},
  }
}

#配置文件解析
[root@nfs ~]# vim /etc/lsyncd.conf
settings {        #全局配置
  logfile = "/var/log/lsyncd/lsyncd.log",          #服务日志文件存放位置
  statusFile = "/var/log/lsyncd/lsyncd.status",    #数据传输日志存放位置
  inotifyMode = "CloseWrite",        #inotify事件监控模式
  maxProcesses = 10,        #同步时最大进程数
  maxDelays = 10,           #累计多少监控事件后激活一次同步
  nodaemon = true,          #是否启用守护模式,默认不启用
  statusInterval = 10,      #数据传输日志写入间隔,默认10秒
  }
sync {              #定义sync同步参数
  default.rsync,    #同步使用rsync模式,有rsync、rsyncssh、direct三种模式
  source = "/data",     #源目录(监控目录),需要同步的数据存放目录
  target = "rsync_backup@10.0.0.16::backup",    #目标备份服务器rsync虚拟用户和目标模块
  delay = 1,         #延迟同步,可避免过于频繁的同步
  init = true        #进程启动时是否先进行一次同步
  delete = true,     #使得目标目录和源目录数据保持一致
  exclude = {".*"},  #排除匹配到的项,可以使用通配符,这里排除隐藏文件
  excludeFrom = ""   #排除列表,后面指定排除的列表文件
  rsync = {
    binary = "/usr/bin/rsync",
    password_file = "/etc/rsync.pass",     #rsync虚拟用户密码文件
    archive = true,      #相当于rsync的-a选项
    compress = true,     #相当于rsync的-z选项
    verbose = true,      #相当于rsync的-v选项
    _extra = {"--bwlimit=20"},     #扩展选项
  }
}

[root@nfs ~]# echo 'passwd' > /etc/rsync.pass
[root@nfs ~]# chmod 600 /etc/rsync.pass

#启动服务并设置开机自启
[root@nfs ~]# systemctl start lsyncd.service
[root@nfs ~]# systemctl enable lsyncd.service

#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch testfile
[root@nfs /data]# ls
testfile

[root@backup /backup]# ls
testfile

建议:lsyncd服务实现实时同步效率较高,若服务器系统支持,建议使用lsyncd服务实现数据实时同步备份。