Linux 实时同步数据

文摘   2024-12-12 16:23   江苏  

为什么要用实时同步服务

因为定时任务有缺陷,一分钟以内的数据无法进行同步,容易造成数据丢失

图解备份方式

rsync+crond定时备份

rsync+inotify实时同步

实时同步结合NFS

NFS+实时同步

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

实时同步的难点

1.什么条件下开始同步
2.同步哪些文件夹
3.多长时间同一次?
4.用什么工具同步?
????

inotify隆重出场

Inotify是一个强大的,细粒度的,异步的文件系统事件监控机制。

事件是指如文件的增删改查都是事件。

Linux2.6.13开始就引入了inotify这个功能,用于监控文件系统的增删改查等事件。

第三方软件能实现监控文件内容变化,其实是因为linux提供了这个inotify机制功能。

实施复制软件介绍

Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加、删除、修改等事件,利用这个内核接口,第三方软件可以监控文件系统下的情况变化
1.实时复制软件会监控磁盘文件系统的变化,比如指定的/data目录,实时复制软件进程会实时监控这个/data目录中对应文件系统数据的变化。

2.一旦/data目录文件发生变化,就会执行rsync命令,将变化的数据推送到备份服务器对应的备份目录中

Inotify+Rsync实施复制实战

部署拓扑图

Backup服务器(rsync服务端)

1.rsync程序安装

2.rsync配置文件修改

3.创建rsync服务特定用户

4.创建rsync数据备份的目录,对特定用户授权

5.创建rsync认证密码文件,修改密码文件权限600

6.启动rsync服务,以守护进程模式

7.设置rsync开机启动

1.恢复了快照,重新安装rsync服务端

2.快速的部署rsyncd服务端
#!/bin/bash
yum install rsync -y

cat > /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]comment = chao rsync backup!
path = /backup
EOF

useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:yuchao666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd



3.执行脚本部署服务端的rsync
bash instal_rsync.sh

dev服务器部署(rsync客户端)

准备部署inotify-tools软件(nfs-31机器)

只有Linux内核版本在2.6.13起才支持,以及是否存在三个系统文件,存在则支持

[root@nfs-31 ~]#uname -r
3.10.0-862.el7.x86_64

脚本通用型,健壮性

还有内核参数检查,
本质上是linux支持inotify机制
在性能还可以优化,支持更高的文件并发数
#检测多少个文件 ,文件内容大量的发生变化,inotify机制能同时检测多少文件
这个参数的优化,就是调整linux的几个文件
[root@nfs-31 ~]#ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Apr 20 20:08 max_queued_events
-rw-r--r-- 1 root root 0 Apr 20 20:08 max_user_instances
-rw-r--r-- 1 root root 0 Apr 20 20:08 max_user_watches

系统文件解释
max_user_watches: 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认只能监控8192个文件

max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认每个用户可以开启inotify服务128个进程

max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量
默认监控事件队列长度为16384



inotify-tools 系统自带的比较low的工具

sersync 金山云的运维通过c++开发的工具

lsyncd三个工具 最新的,目前有人在用,适用于大规模服务器环境的工具
这些工具就3件事
1.优化,调整了这3文件的参数
2.检测某个目录
3.触发rsync命令

安装inotifty-tools工具

需要配置好epel源,才可以安装

[root@nfs-31 ~]# yum install inotify-tools -y


检查生成的软件命令
[root@nfs-31 ~]# rpm -ql inotify-tools |head -2
/usr/bin/inotifywait
/usr/bin/inotifywatch

Inotifywait详解

上述操作我们安装好了Inotify-tools软件,生成2个重要的命令

inotifywait:在被监控的目录等待特定文件系统事件(openclosedelete等事件),执行后处于阻塞状态,适合在Shell脚本中使用,是实现监控的关键
Inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)

【inotifywait命令解释】

inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;

inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息

从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]

-m:即“–monitor” 表示始终保持事件监听状态。

-d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数

-r:即“–recursive” 表示递归查询目录

-q:即“–quiet” 表示打印出监控事件

-o:即“–outfile” 输出事情到一个文件而不是标准输出

-s: 即“–syslog” 输入错误信息到系统日志

-e:即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等


-format:指定输出格式;常用的格式符如:

%w:表示发生事件的目录

%f:表示发生事件的文件

%e:表示发生的事件

%Xe:事件以“X”分隔

%T:使用由-timefmt定义的时间格式

-timefmt:指定时间格式,用于-format选项中的%T格式

利用Inotify软件监控的事件主要是如下,也是我们使用命令,需要指定的那些事件,指的就是你想监控文件内容变化了,还是被删了,还是正在被编辑,被修改,等情况。

Events    含义
access 文件或目录被读取
modify 文件或目录内容被修改
attrib 文件或目录属性被改变
close 文件或目录封闭,无论读/写模式
open 文件或目录被打开
moved_to 文件或目录被移动至另外一个目录
move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载

关于监控事件的细节解释

可监控的事件
有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。

IN_ACCESS
被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY
被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB
被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE
一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE
一个以只读方式打开的文件或目录被关闭。
IN_CLOSE
一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
IN_OPEN
文件或目录被打开。
IN_MOVED_FROM
被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO
文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF
IN_MOVE
可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE
在被监控目录中创建了子目录或文件。
IN_DELETE
被监控目录中有子目录或文件被删除。
IN_DELETE_SELF
被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF
监控项目本身被移动。

inotifywait实践

使用参数解释

命令用法
inotifywait -mrq --timefmt "%d/%m/%y %H:%M" --format "%T %w%f" /yuchao-data


-m:即“–monitor” 表示始终保持事件监听状态。
-r:即“–recursive” 表示递归查询目录
-q:即“–quiet” 表示打印出监控事件
-e:即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等



--timefmt:指定时间格式
%m  月份(以01-12来表示)。
%d  日期(以01-31来表示)。
%y  年份(以00-99来表示)。
%F

%w:表示发生事件的目录
%f:表示发生事件的文件
%T:使用由-timefmt定义的时间格式
%e:表示发生的事件

所有事件,任意的linux命令,只要对该目录的数据
对文件发生了修改动作,都会被检测到
mkdir /nfs-data

mkdir /nfs-data

[root@nfs-31 ~]#inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" /nfs-data
12:27:56----/nfs-data/------ 捕获到的事件是:CLOSE_NOWRITE,CLOSE,ISDIR
12:27:56----/nfs-data/------ 捕获到的事件是:OPEN,ISDIR
12:27:56----/nfs-data/------ 捕获到的事件是:CLOSE_NOWRITE,CLOSE,ISDIR

Create、delete
检测,创建,删除两个时间,只有你执行了对应的linux命令,才会生成日志

-e  events 事件名

[root@nfs-31 ~]#inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e delete,create /nfs-data


12:29:46----/nfs-data/------hehe.log 捕获到的事件是:CREATE
12:30:24----/nfs-data/------aoligei.log 捕获到的事件是:CREATE

12:31:03----/nfs-data/------hehe.log 捕获到的事件是:DELETE

move事件

[root@nfs-31 ~]#
[root@nfs-31 ~]#inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e move /nfs-data


12:31:48----/nfs-data/------xixi.log 捕获到的事件是:MOVED_FROM
12:31:48----/nfs-data/------xixi.png 捕获到的事件是:MOVED_TO
12:32:17----/nfs-data/------xixi.png 捕获到的事件是:MOVED_FROM

12:32:54----/nfs-data/------xixi.png 捕获到的事件是:MOVED_TO

close_write事件

[root@nfs-31 ~]#inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e  close_write     /nfs-data

inotify + rsync实时同步--------------------------------------------------------------------------

rsync-41机器服务端

1.恢复了快照,重新安装rsync服务端

2.快速的部署rsyncd服务端
#!/bin/bash
yum install rsync -y

cat > /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]comment = chao rsync backup!
path = /backup
EOF

useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:yuchao666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd


3.执行脚本部署服务端的rsync
bash instal_rsync.sh

nfs-31机器客户端

[root@nfs-31 ~]#cat /inotifty_rsync/about_inotify.sh 
#!/bin/bash
path=/nfs-data
backup_server=172.16.1.41
export RSYNC_PASSWORD=yuchao666

/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /nfs-data | while read line
do
echo ${line}
rsync -az --delete /nfs-data/ rsync_backup@${backup_server}::backup
done

添加权限,执行脚本

chmod u+x about_inotify.sh
[root@nfs-31 ~]#./about_inotify.sh

测试脚本结果
写入数据;2.查看rsync是否有数据同步 ;3.删除事件也支持

sersync + rsync实时同步-------------------------------------------------------------------------------------

1.下载安装
cd /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-31 /opt]#tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz

修改名字
[root@nfs-31 /opt]#mv GNU-Linux-x86/ sersync254




2.修改配置文件
找到需要检测的目录配置段,修改为你的机器环境即可

检测nfs-31 /nfs-data目录

修改如下部分配置
23 <sersync>
24 <localpath watch="/nfs-data">
25 <remote ip="172.16.1.41" name="backup"/>
26 </localpath>
27 <rsync>
28 <commonParams params="-az"/>
29 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pwd"/>


2.1写入密码
2.2修改密码文件权限
[root@nfs-31 /nfs-data]#echo "yuchao666" > /etc/rsync.pwd
[root@nfs-31 /nfs-data]#chmod 600 /etc/rsync.pwd


3.启动服务
[root@nfs-31 /nfs-data]#/opt/sersync254/sersync2 -r -d -o /opt/sersync254/confxml.xml


测试数据是否同步
4.使用工具
必须先确认sersync帮你生成的rsync命令,能正确的执行

5.查看sersync是否帮你做了同步
你必须确保,rsync可以手动,sersync才能帮你同步!!!
排查错误的经验所在
 23     <sersync>
24 <localpath watch="/data">
25 <remote ip="172.16.1.41" name="data"/> # rsyncd服务器地址以及模块名
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="-az"/> # rsync参数
31 <auth start="true" users="rsync_backup" # rsync认证用户 passwordfile="/etc/rsync.passwd"/>

命令解释

[root@nfs-31 /opt/sersync-2-5-4]#./sersync2 -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命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
[root@nfs-31 /opt/sersync-2-5-4]#

分析工具启动日志

lsyncd + rsync实时同步----------------------------------------------------------------------------------------

lsyncd工具(推荐使用)

https://github.com/lsyncd/lsyncd

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

实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录),一个命令搞定。

配置文件
只监控一个目录

[root@nfs-31 /data]#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 = "/data",
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.passwd",
_extra={"--bwlimit=200"}
}
}


监控2个目录

[root@nfs-31 /data]#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 = "/data",
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.passwd",
_extra={"--bwlimit=200"}
}
}

sync {
default.rsync,
source = "/backup",
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.passwd",
_extra={"--bwlimit=200"}
}
}

配置文件详解

syncd.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 :本地目录间同步,使用cprm等命令完成差异文件备份;
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,各自的模式,互不影响。

操作步骤
如果机器上没有密码文件得先创建密码文件
echo 'lisa666' > /etc/rsync.pwd
chmod 600 /etc/rsync.pwd

0.干掉sersync工具  kill 端口号

1.下载安装
yum install lsyncd -y

2.修改配置文件,(只检测一个目录)
[root@nfs-31 /data]#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 = "/nfs-data",
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.pwd",
_extra={"--bwlimit=200"}
}
}





3.启动服务
systemctl start lsryncd
[root@nfs-31 /nfs-data]#
[root@nfs-31 /nfs-data]#systemctl start lsyncd
[root@nfs-31 /nfs-data]#
[root@nfs-31 /nfs-data]#systemctl status lsyncd


4.使用工具

[root@nfs-31 /nfs-data]#for i in {1..100};do echo ${i} > ${i}.log;sleep 0.1;done

链接:https://www.cnblogs.com/btcm409181423/p/18051068

                                                              (版权归原作者所有,侵删)


运维派
领先的IT运维社区,和运维同学们一起交流成长!
 最新文章