使用inotify现实,实时同步的前提条件
a 先部署好rsync服务
b 其次部署好inotify服务,并对需要实时的数据进行监控
c 建立rsync与inotify服务的关联,对变化的数据进行实时备份传输
测试最少需要两台主机
cat /etc/hosts
192.168.40.26 nfs01 # rsync客户机+inotify,把监控的数据实时传输到备份服务器
192.168.40.27 backup01 # rsync服务器,作为备份服务器
1 修改ip 主机名 查看rsync是否安装
hostnamectl set-hostname nfs01
rpm -qa inotify-tools
nmcli c mod eth1 ipv4.addr "192.168.40.26/24"
nmcli d reapply eth1
ifconfig
# 系统优化,请参考:https://blog.51cto.com/lehappy/2781516
2 rsync服务器部署参考
https://blog.51cto.com/lehappy/2759036
3 inotify服务部署
3.1 安装程序
yum -y install inotify-tools
3.2 命令使用
[root@nfs01 ~]#rpm -ql inotify-tools
/usr/bin/inotifywait # 监控数据变化
/usr/bin/inotifywatch # 对监控变化信息进行统计
# --------下面不重要 -------------------------------
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
-----------------------------------------------------
3.3 man inotifywait 参数说明
-m, --monitor # 始终保持事件监听状态
-r, --recursive # 递归监控
-q, --quiet # 打印很少的信息
--format <fmt> # 指定输出信息的格式 %T时间 %w路径 %f文件名 %e状态
--timefmt <fmt> # 指定输出的时间格式 %Y年 %m月 %d日 %H小时 %M分钟
-e <event> # 指定监控事件信息
#------------事件信息------------------
create file # 创建文件 ***
open file # 打开文件
attrib file # 修改文件属性
close_write,close file # 保存并关闭文件 ***
delete file # 删除文件 ***
modify file # 修改文件
moved_to file # 文件移入 ***
# 打开两个窗口测试同一个系统
[root@nfs01 ~]#inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f status:%e' -e create,close_write,delete,moved_to /data
2021-05-13 13:59 /data/2.txt status:CREATE # 监控数据变化
2021-05-13 13:59 /data/2.txt status:CLOSE_WRITE,CLOSE
2021-05-13 14:00 /data/1 status:CREATE,ISDIR
2021-05-13 14:00 /data/2.txt status:CLOSE_WRITE,CLOSE
2021-05-13 14:00 /data/hosts status:DELETE
2021-05-13 14:02 /data/hosts status:MOVED_TO
#------------------------------------------------------------------------
[root@nfs01 /data]#touch 2.txt # 执行命令
[root@nfs01 /data]#mkdir -p /data/1/2/3
[root@nfs01 /data]#echo 123 >2.txt
[root@nfs01 /data]#rm -f hosts
[root@nfs01 /data]#mv /etc/hosts /data
3.4 inotify+rsync实现实时同步
# 实现实时同步需要写shell脚本,最好是把测试正常的命令复制到里面。
vim /scripts/backup.sh
#!/bin/sh
inotifycmd=”/usr/bin/inotifywait –mrq –format ‘%w%f’ -e create,close_write,delete,moved_to,attrib”
$inotifycmd /data | while read line
do
/usr/bin/rsync –az –delete $line –timeout=100 rsync_backup@192.168.40.27::backup \
--password-file=/etc/rsync.pwd &>/dev/null
done
shell测试成功后把它增加到/etc/rc.local
/usr/bin/sh /scripts/backup.sh &
4 优化
[root@nfs01 /]#ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 13 15:21 max_queued_events
-rw-r--r-- 1 root root 0 May 13 15:21 max_user_instances
-rw-r--r-- 1 root root 0 May 13 15:21 max_user_watches
# max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数据(单进程)
# max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进行数
# max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量
[root@nfs01 /]#sysctl -a|grep inotify
fs.inotify.max_queued_events = 16384 # 工作中可以修改为50000000
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192 # 工作中可以修改为50000000
5 inotify缺点:
# 1、并发如果大于200个文件(10-100k),同步有延迟
# 2、写的脚本,每次都是全部推送一次,但确实是增量
# 3、监控到事件后,调用rsync同步是单进程的。
####################################################################
1 sersync服务部署
# sersync利用inotify与rsync技术实现对服务器数据实时同步。sersync与inotify相比优点是:
# 1、对linux产生的临时文件和重复文件操作会进行过滤。
# 2、配置简单,下载解压后可直接进行使用。
# 3、使用多线程进行同步。
# 4、sersync自带出错处理机制,对出错的文件重新同步。
# 5、sersync自带crontab功能,只需要在xml配置中开启,即可按预先的配置,隔一段时间整体同步一次。
# 6、可以满足有特殊需求的公司二次开发。
1.1 安装程序
# 这个程序需要手动下载,搜索下载地址为
# https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 /data]#mkdir /tools
[root@nfs01 /data]#cd /tools
[root@nfs01 /tools]#wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 /tools]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz # 解压
[root@nfs01 /tools]#ll
total 712
drwxr-xr-x 2 root root 41 Oct 26 2011 GNU-Linux-x86
-rw-r--r-- 1 root root 727290 Oct 26 2011 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 /tools]#cd GNU-Linux-x86/
[root@nfs01 /tools/GNU-Linux-x86]#ll
total 1772
-rwxr-xr-x 1 root root 2214 Oct 26 2011 confxml.xml # 配置文件
-rwxr-xr-x 1 root root 1810128 Oct 26 2011 sersync2 # 命令
[root@nfs01 /tools/GNU-Linux-x86]#cp sersync2 /usr/bin/sersync # 把sersync2复制到/usr/bin/并改为sersync
[root@nfs01 /tools/GNU-Linux-x86]#ll /usr/bin/ser*
-rwxr-xr-x 1 root root 1810128 May 13 15:04 /usr/bin/sersync
1.2 编辑配置文件
[root@nfs01 /tools/GNU-Linux-x86]#cp confxml.xml confxml.xml.bak # 修改前先备份
[root@nfs01 /tools/GNU-Linux-x86]#vi /tools/GNU-Linux-x86/confxml.xml
# 在vi里面输入 :set nu 查看共有66行
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <head version="2.5">
3 <host hostip="localhost" port="8008"></host>
4 <debug start="false"/>
5 <fileSystem xfs="false"/>
6 <filter start="false">
7 <exclude expression="(.*)\.svn"></exclude>
8 <exclude expression="(.*)\.gz"></exclude>
9 <exclude expression="^info/*"></exclude>
10 <exclude expression="^static/*"></exclude>
11 </filter>
12 <inotify>
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="false"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>
22
23 <sersync>
24 <localpath watch="/opt/tongbu">
25 <remote ip="127.0.0.1" name="tongbu1"/>
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>
29 <rsync>
30 <commonParams params="-artuz"/>
31 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
32 <userDefinedPort start="false" port="874"/><!-- port=874 -->
33 <timeout start="false" time="100"/><!-- timeout=100 -->
34 <ssh start="false"/>
35 </rsync>
36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
37 <crontab start="false" schedule="600"><!--600mins-->
38 <crontabfilter start="false">
39 <exclude expression="*.php"></exclude>
40 <exclude expression="info/*"></exclude>
41 </crontabfilter>
42 </crontab>
43 <plugin start="false" name="command"/>
44 </sersync>
45
46 <plugin name="command">
47 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
48 <filter start="false">
49 <include expression="(.*)\.php"/>
50 <include expression="(.*)\.sh"/>
51 </filter>
52 </plugin>
53
54 <plugin name="socket">
55 <localpath watch="/opt/tongbu">
56 <deshost ip="192.168.138.20" port="8009"/>
57 </localpath>
58 </plugin>
59 <plugin name="refreshCDN">
60 <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
61 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
62 <sendurl base="http://pic.xoyo.com/cms"/>
63 <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
64 </localpath>
65 </plugin>
66 </head>
# 6至11行:默认排除指定数据信息不要进行实时同步,修改<filter start="false">可以实时同步把false改为true
# 12至21行:定义inotify监控事件,只要把false改为true就执行
# 重点23至35行:和inotifywait命令做对比
[root@nfs01 ~]#inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f status:%e' -e create,close_write,delete,moved_to /data
# -e create,close_write,delete,moved_to 对应 12至21行
# /data 对应 24行 <localpath watch="/opt/tongbu">
# 修改 <localpath watch="/data">
# 重点23至35行:和rsync命令做对比
[root@nfs01 ~]#rsync -az /etc/hosts rsync_bak@192.168.40.27::backup --password-file=/etc/rsync.pwd
# @192.168.40.27::backup 对应 25行 <remote ip="127.0.0.1" name="tongbu1"/>
# 修改 <remote ip="192.168.40.27" name="backup"/>
# rsync -az 对应30行 <commonParams params="-artuz"/>
# 修改 <commonParams params="-az"/>
# rsync_bak@192.168.40.27 --password-file=/etc/rsync.pwd 对应31行 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
# 修改 <auth start="true" users="rsync_bak" passwordfile="/etc/rsync.pwd"/>
# 32行是设置端口号,必须和rsync配置/etc/rsyncd.conf文件里面的端口号一致(port = 873)
# 把false修改为true启用并修改端口号 <userDefinedPort start="true" port="873"/><!-- port=874 -->
# 33行是设置设置超时时间,把false修改为true启用 <timeout start="true" time="100"/><!-- timeout=100 -->
# 修改完成,保存退出。
1.3 启动sersync服务
[root@nfs01 /tools/GNU-Linux-x86]#sersync -h # 使用命令帮助
set the system param # 这里告诉可以设置系统参数,参考inotify 4优化的内容
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个 (指定线程总数为10,cpu过高可调低)
参数-o:指定配置文件,默认使用confxml.xml文件 ***(可以指定多个配置文件)
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
[root@nfs01 /tools/GNU-Linux-x86]#sersync -dro /tools/GNU-Linux-x86/confxml.xml # 启动服务
[root@nfs01 /tools/GNU-Linux-x86]#killall sersync # 关闭服务
1.4 设置为开机启动
[root@nfs01 /tools/GNU-Linux-x86]#echo '/usr/bin/sersync -do /tools/GNU-Linux-x86/confxml.xml' >>/etc/rc.local
[root@nfs01 /tools/GNU-Linux-x86]#tail -1 /etc/rc.local
/usr/bin/sersync -do /tools/GNU-Linux-x86/confxml.xml