03-inotify+rsync sersync lsyncd实时同步服务

1、Inotify简介

inotify是Linux内核的一个功能,它能监控文件系统的变化,比如删除、读、写和卸载等操作。要使用inotify,Linux内核版本必须是大于2.6.13,实现inotify的软件为inotify-tools

2、Inotify实时同步

2-1 查看当前系统是否支持inotify

# 查看系统内核版本
[root@nfs ~]# uname  -r
3.10.0-1062.12.1.el7.x86_64

# 查看inotify的内核参数的文件是否存在
[root@nfs ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_queued_events
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_user_instances
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_user_watches
max_queued_events   ---设置inotify实例事件(event)队列可容纳的事件数量,默认值16384
max_user_instances  ---设置每个用户单个进程监控文件的数量,默认是8129
max_user_watches    ---设置i用户创建inotify实例的最大值,默认是128

# 修改max_queued_events内核参数
[root@nfs ~]# echo 'fs.inotify.max_queued_events=999999' >> /etc/sysctl.conf 
[root@test ~]# cat /proc/sys/fs/inotify/max_queued_events
999999

2-2 安装inotify-tools

安装inotify-tools需要用到epel源

[root@nfs ~]# yum -y install inotify-tools
[root@nfs ~]# rpm -ql inotify-tools
/usr/bin/inotifywait    --- 监控目录数据信息变化 
/usr/bin/inotifywatch   --- 对监控的变化信息进行统计
......

2-3 inotifywait使用

  • 参数说明
## inotifywait参数说明
参数名称            参数说明
-m ,-monitor       始终保持事件监听状态
-r,-recursive      递归查询目录
-q,-quiet          只打印监控事件的信息
-exclude           排除文件或目录时,不区分大小写
-t,-timeout        超时时间
--timefmt          指定时间输出格式
--format           指定输出格式
-e,event           后面指定增,删,改等事件

## --timefmt <fmt>时间格式
    %Y: ---表示年份信息,包含世纪信息
    %y: ---表示年份信息,不包含世纪信息
    %m: ---表示月份,范围01-12
    %d: ---表示每月的第几天,范围01-31
    %H: ---表示小时信息,使用24小时制度,范围00-24
    %M: ---表示分钟,范围00-59

## --format<fmt>输出信息格式定义
    %T:	 ---输出时间格式中定义的时间格式,这个表示调用我们前面定义时间格式,通常情况--timefmt选项和--format结合使用
    %w:	 ---表示事件出现时,监控文件或目录的名称信息。也就是监控资源名称信息
    %f:  ---时间出现时,显示监控目录下触发事件的文件或目录信息
    %e:  ---显示发生的事件信息,不同事件默认用逗号分隔
	%Xe: ---显示发生的事件,不同的时间指定用"X"分割
    
## -e选项指定监控事件类型说明
    access          ---读取文件或目录内容
    modify          ---修改文件或目录内容
    attrib          ---文件或目录的属性改变
    close_write     ---修改真实文件内容
    close_nowrite   ---示文件或目录关闭,在只读模式打开之后关闭的
    close   		---表示文件或目录关闭,不管是读还是写模式
    open            ---文件或目录被打开
    moved_to        ---文件或目录移动到
    moved_from      ---文件或目录从...移动到
    move            ---移动文件或目录移动到监视目录
    create          ---在监视目录下创建文件或目录
    delete          ---删除监视目录下的文件或目录
    delete_self     ---表示文件或目录被删除,目录本身被删除
    umount          ---卸载文件系统
  • 测试环境,两台服务器
服务器 主机名 外网IP 内网IP 软件
NFS服务器 nfs 192.168.1.31 172.16.1.31 nfs-utils+rpcbind
web服务器 web01 192.168.1.7 172.16.1.7 nfs-utils
  • nfs服务器部署好NFS存储服务,存储目录为/backup
  • web服务器远程挂载/backup目录到本地 /mnt
# 长时间递归监听/mnt目录
[root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data

# /mnt目录下操作文件或目录
[root@web01 mnt]# touch aaa
[root@web01 mnt]# echo "hello" > aaa
[root@web01 mnt]# rm -f aaa
[root@web01 mnt]# mv bbs /root

# 监听信息
[root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data
2020-07-08 14:34 /data/ aaa event_info:CREATE
2020-07-08 14:34 /data/ aaa event_info:CLOSE_WRITE,CLOSE
2020-07-08 14:35 /data/ aaa event_info:MODIFY
2020-07-08 14:35 /data/ aaa event_info:CLOSE_WRITE,CLOSE
2020-07-08 14:35 /data/ aaa event_info:DELETE
2020-07-08 14:35 /data/ bbs event_info:DELETE,ISDIR

2-4 rsync+Inotify实时同步

[root@nfs scripts]# cat 01-inotify_rsync.sh
#!/bin/sh

backup_Server=172.16.1.41
export RSYNC_PASSWORD=123456

/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line
do
  echo ${line}
  if [ -f ${line} ]
  then
    rsync -az ${line} rsync_backup@${backup_Server}::data
  else
    rsync -az --delete /data/ rsync_backup@${backup_Server}::data
  fi
done

3、sersync同步服务

简介

sersync类似于inotify,同样用于监控,但它克服了inotify的缺点.

inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而导致重复调用rsync命令。比如:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的

sersync 优点:

  • sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
  • sersync配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接使用即可
  • sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态
  • sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步
  • sersync不仅可以实现实时同步,另外还自带crontab功能,只需在xml配置文件中开启,即也可以按要求隔一段时间整体同步一次,而无需再额外配置crontab功能

环境准备:两台服务器,一台NFS服务器,一台备份服务器(部署好Rsync守护进程服务)

NFS服务器上操作:

3-1 安装sersync

# 下载软件
[root@nfs tools]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz

# 解压
[root@nfs tools]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz

# 修改名称
[root@nfs tools]# mv GNU-Linux-x86/ sersync

# 移动到/usr/local
[root@nfs tools]# mv sersync /usr/local/
[root@nfs tools]# cd /usr/local/sersync
[root@nfs sersync]# cp confxml.xml confxml.xml.bak

3-2 编写配置文件

[root@nfs sersync]# vim confxml.xml 

## 排除指定数据信息不要进行实时传输同步
<filter start="false"> <!--为true时生效-->
	<exclude expression="(.*)\.svn"></exclude>
	<exclude expression="(.*)\.gz"></exclude>
	<exclude expression="^info/*"></exclude>
	<exclude expression="^static/*"></exclude>
</filter>

## 定义inotify程序需要监控的事件
<inotify>
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
</inotify>

## 监控目录	  
<localpath watch="/data">
# 同步数据远程服务器ip 模块名
	<remote ip="172.16.1.41" name="data"/> 
 	<!--<remote ip="192.168.8.39" name="tongbu"/>-->
 	<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>

<rsync>
	# 同步参数
   <commonParams params="-artuz"/>
   # rsync远程认证用户,认证密码文件
   <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>            # 端口,默认874              
   <userDefinedPort start="false" port="874"/><!-- port=874 -->
   <timeout start="false" time="100"/><!-- timeout=100 -->
   <ssh start="false"/>
</rsync>

3-3 sersync参数

[root@nfs conf]# sersync -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
参数-n:指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
_______________________________________________________

3-4 启动服务

[root@nfs conf]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

3-5 测试sersync

  • 备份服务器操作:
cd /data
while true ;do ls |wc -l;sleep 0.1;done
  • NFS服务器操作
cd /data
for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done

说明:使用sersync是可以解决之前的缺陷问题,但是这个服务自生也是存在缺陷问题,例如:不能同时监控多个目录,该服务实现多目录监控只能将之前的配置文件重新复制一份重命名,之后与之前启动守护进程一样,在重新启动一个新的进程,这样就比较麻烦。这个问题在lsyncd这个服务中就很好地解决了这个问题

4、lsyncd同步服务

简介

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。

官方地址

官方配置手册

4-1 安装lsyncd

[root@nfs ~]# yum -y install lsyncd

4-2 编写配置文件

这里在上面的基础上在主机名为nfs新建一个目录data1,对应在backup新建一个backup1目录

[root@nfs ~]# cat /etc/lsyncd.conf
settings {
  logfile = "/var/log/lsyncd/lsyncd.log",
  statusFile = "/var/log/lsyncd/lsyncd.status",
  inotifyMode = "CloseWrite",
  maxProcesses = 8,
}
sync {
  default.rsync,
  source = "/data1",
  target = "rsync_backup@172.16.1.41::data",
  delete = true,
  exclude = { ".*" },
  delay = 1,
  rsync = {
    binary = "/usr/bin/rsync",
    archive = true,
    compress = true,
    verbose = true,
    password_file = "/etc/rsync.password",
    _extra = {"--bwlimit=200"}
  }
}

sync {
  default.rsync,
  source = "/backup1",
  target = "rsync_backup@172.16.1.41::backup",
  delete = true,
  exclude = { ".*" },
  delay = 1,
  rsync = {
    binary = "/usr/bin/rsync",
    archive = true,
    compress = true,
    verbose = true,
    password_file = "/etc/rsync.password",
    _extra = {"--bwlimit=200"}
  }
}

4-3 配置文件说明

lsyncd.conf配置选项说明
settings
里面是全局设置,--开头表示注释,下面是几个常用选项说明:

logfile 定义日志文件
stausFile 定义状态文件
nodaemon=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模式
172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步
172.29.88.223::module :同步到远程服务器目录,用于rsync模式
三种模式的示例会在后面给出。

init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true

delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)

excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST。
这里的排除规则写法与原生rsync有点不同,更为简单:
监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo
如果规则以斜线/开头,则从头开始要匹配全部
如果规则以/结尾,则要匹配监控路径的末尾
?匹配任何字符,但不包括/
*匹配0或多个字符,但不包括/
**匹配0或多个字符,可以是/
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。
rsync

(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)

bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
perms 默认保留文件权限。
其它rsync的选项
其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后文示例。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。

lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。

4-4 启动lsyncd

[root@nfs ~]# systemctl start lsyncd 

测试

# backup测试
cd /data
while true ;do ls |wc -l;sleep 0.1;done

# NFS测试
cd /data
for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done
posted @ 2020-07-09 01:13  s小毛驴  阅读(393)  评论(0编辑  收藏  举报
返回顶部