Linux utiliza los servicios inotify y rsync para lograr la sincronización de datos en tiempo real

Realización de sincronización de temporización de archivos:

Usando rsync combinado con tareas programadas de cron para lograr:

rsync -av --delete /data/  10.0.0.12:/back

-a:保留文件属性
-v:显示过程
-delete:如果源文件没有的,目标文件里面有,就把目标文件里面的删除掉

Implementación de sincronización de archivos en tiempo real:

premisa:

  La sincronización se activa cuando cambia un archivo, pero activar la sincronización requiere una función que depende de los cambios de estado del archivo.

notificar

  inotify es un servicio de monitoreo del kernel del sistema, que pertenece a un mecanismo único del kernel del sistema operativo y se utiliza para monitorear los cambios en la información de los archivos.

Compruebe si el kernel admite inotify;

[root@LAP1 data]# ls -l /proc/sys/fs/inotify  
ls: cannot access ' ': No such file or directory
/proc/sys/fs/inotify:
total 0
-rw-r--r-- 1 root root 0 Oct 24 23:39 max_queued_events
-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_instances
-rw-r--r-- 1 root root 0 Oct 24 23:39 max_user_watches

inotificar los parámetros del kernel:

max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679

max_user_instances:每个用户创建inotify实例最大值,默认值:128

max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大

Nota:
  Los parámetros en el proceso se pueden cambiar a través de la herramienta sysctl.

Las principales herramientas del paquete inotify-tools:

  • inotifywait: espera a que ocurran eventos específicos del sistema de archivos (abrir, cerrar, eliminar, etc.) en el archivo o directorio monitoreado, a menudo se usa para el monitoreo síncrono de directorios en tiempo real (esta herramienta se usa principalmente)

  • inotifywatch: recopile estadísticas sobre el uso del sistema de archivos monitoreado, refiriéndose a la cantidad de veces que ocurren eventos del sistema de archivos

Comando inotifywait:

inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

opciones:

-m, --monitor 始终保持事件监听

-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用

-r, --recursive 递归监控目录数据信息变化

-q, --quiet 输出少量事件信息

--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现

--excludei <pattern> 和exclude相似,不区分大小写

-o, --outfile <file> 打印事件存到文件中,注意:使用绝对路径

-s, --syslogOutput 发送错误到syslog相当于标准错误输出

--timefmt <fmt> 指定时间输出格式

--format <fmt> 定义输出格式;即实际监控输出内容

-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

Por ejemplo:

# 10.0.0.11
[root@LAP1 data]# cat file1 
[root@LAP1 data]# echo hello > file1
[root@LAP1 data]# ll file1
-rw-r--r-- 1 root root 6 Oct 24 23:50 file1
[root@LAP1 data]# chmod 666 


# 10.0.0.11
[root@LAP1 data]# inotifywait -m  file1
Setting up watches.
Watches established.
file1 OPEN
file1 CLOSE_NOWRITE,CLOSE
file1 MODIFY
file1 OPEN
file1 MODIFY
file1 CLOSE_WRITE,CLOSE
file1 ATTRIB

El tipo de evento especificado por la opción inotifywait -e

create #文件或目录创建

delete #文件或目录被删除

modify #文件或目录内容被写入

attrib #文件或目录属性改变

close_write #文件或目录关闭,在写入模式打开之后关闭的

close_nowrite #文件或目录关闭,在只读模式打开之后关闭的

close #文件或目录关闭,不管读或是写模式

open #文件或目录被打开

lsdir #浏览目录内容

moved_to #文件或目录被移动到监控的目录中

moved_from #文件或目录从监控的目录中被移动

move #文件或目录不管移动到或是移出监控目录都触发事件

access #文件或目录内容被读取

delete_self #文件或目录被删除,目录本身被删除

unmount #取消挂载

--timefmt formato de hora para inotifywait

%Y #年份信息,包含世纪信息

%y #年份信息,不包括世纪信息

%m #显示月份,范围 01-12

%d #每月的第几天,范围是 01-31

%H #小时信息,使用 24小时制,范围 00-23 

%M #分钟,范围 00-59 

%S      #秒,范例 0-60

--format definición de formato para inotifywait

%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息

%w #事件出现时,监控的文件或目录的名称信息,相当于dirname

%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename

%e #显示发生的事件信息,不同的事件默认用逗号分隔

%Xe #显示发生的事件信息,不同的事件指定用X进行分隔

Por ejemplo: monitorear cambios en el directorio /data/

[root@CentOS8 data]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format="%T %w---%f event: %;e" /data
Setting up watches.
Watches established.
2022-10-24 17:12:57 /data/--- event: OPEN;ISDIR
2022-10-24 17:12:57 /data/--- event: ACCESS;ISDIR
2022-10-24 17:12:57 /data/--- event: CLOSE_NOWRITE;CLOSE;ISDIR
2022-10-24 17:13:06 /data/---file3 event: CREATE
2022-10-24 17:13:06 /data/---file3 event: OPEN
2022-10-24 17:13:06 /data/---file3 event: ATTRIB
2022-10-24 17:13:06 /data/---file3 event: CLOSE_WRITE;CLOSE


rsynctools

rsync funciona de tres maneras:

  • Modo local: la sincronización se realiza en el sistema de archivos local. El formato de sintaxis de la línea de comando es el formato de la sección "Local" anterior

  • Basado en el protocolo ssh tradicional, el host local usa el shell remoto para comunicarse con el host remoto

  • Como servicio independiente, el host local se conecta al demonio rsync en el host remoto a través de un socket de red.

la diferencia:

  La esencia de los dos primeros es usar un shell local o remoto, mientras que el tercer método es permitir que el servicio rsyncd se ejecute en el host remoto, hacer que escuche en un puerto y esperar la conexión del cliente.

modo local:

rsync [OPTION...] SRC... [DEST]

Por ejemplo:

[root@LAP1 data]# rsync file1  file111

[root@LAP1 data]# ls
file1  file11  file111  file2

Basado en el formato de uso del protocolo ssh tradicional:

Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]

Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST

Por ejemplo:

rsync -av --delete /data/  10.0.0.12:/back
#不写用户名默认使用的就是当前主机使用的用户

Como un servicio independiente:

Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] #协议的形式访问,效果等同于上面

Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

Opciones comunes para rsync:

-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。

-a --archive :归档模式,表示递归传输并保持文件属性。

-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新,检查出mtime不同从而导致增量传输无效

--delete   :以SRC为主,对DEST进行同步。多则删之,少则补之

paquete rsync:

Sitio oficial:  rsync

Paquetes: rsync, rsync-daemon (CentOS 8)

Archivo de servicio: /usr/lib/systemd/system/rsyncd.service

Archivo de configuración: /etc/rsyncd.conf

Puerto: 873/tcp

Dos formas de implementar el servidor rsync

  rsync se puede utilizar como servidor o como programa cliente.

Método 1: Realice el servicio rsync a través del proceso del demonio rsync

#在备份服务器启动 rsync 进程
[root@bakup_server ~]# rsync --daemon #--daemon选项表示启动为守护进程
Failed to parse config file: /etc/rsyncd.conf #必须要有这个配置文件才能启动成功

[root@bakup_server ~]# touch /etc/rsyncd.conf #需要创建这个配置文件才能正常启动

[root@bakup_server ~]# rsync --daemon  #启动rsync守护进程

[root@bakup_server ~]# ss -ntl  #守护进程启动后会监听873端口
State                Recv-Q               Send-Q                              Local Address:Port                               Peer Address:Port               
LISTEN               0                    5                                         0.0.0.0:873                                     0.0.0.0:*                  


#设置rsync服务器的共享信息
[root@bakup_server ~]# cat /etc/rsyncd.conf #等号之间可以有空格
[backup]          #定义存放数据共享的名字
path = /bakup     #真实的路径,存放共享文件的路径 (利用rsync将这个目录共享出去,共享出去的名字叫做bakup)
read only = no    #指定可读写,默认只读

[root@bakup_server ~]# rsync --daemon #更改问配置文件以后需要重新开启守护进程才会生效

[root@bakup_server ~]# setfacl -m u:nobody:rwx /bakup/ #指定目录给nobody权限,默认用户以nobody访问此目录


使用客户端连接rsync备份服务器:
#格式 rsync rsync://host 或者 rsync host::

客户端查看服务器的情况:
[root@data_server ~]# rsync rsync://10.0.0.12  #以协议的形式访问
backup  #共享出来的名字

[root@data_server ~]# rsync 10.0.0.12::  #以服务的形式访问
backup

#实现客户端将文件拷贝到rsync共享的目录中
注意:传输的时候不管以谁的身份,都会映射为nobody,所以不用写用户名都行
[root@data_server ~]# rsync /root/anaconda-ks.cfg [email protected]::backup


[root@bakup_server bakup]# ll
total 8
-rw------- 1 nobody nobody 1526 Oct 24 17:48 anaconda-ks.cfg
-rw-r--r-- 1 nobody nobody  658 Oct 24 17:49 fstab

Ejecute rsync como un servicio independiente e implemente la función de verificación

  rsync-daemon: después de instalar este paquete, se proporcionará un servicio de servicio, que escuchará su propio puerto independiente

[root@bakup_server ~]# yum install rsync-daemon
Installed:
  rsync-daemon-3.1.3-9.el8.noarch

[root@bakup_server ~]# systemctl enable rsyncd.service 
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.

ilustrar:

  rsync no requiere verificación al transferir archivos de forma predeterminada

Cómo habilitar la función de verificación de rsync:

[root@backup-centos8 ~]#dnf -y install rsync-daemon

#安装服务的时候自动创建rsync服务器的配置文件
[root@centos8 ~]#vi /etc/rsyncd.conf
uid = root             #远程用户映射到本机的用户,默认为nobody
gid = root             #默认为nobody
#port = 874            #可指定非标准端口,默认873/tcp
#use chroot = no
max connections = 0    #不限制最大连接数
ignore errors          #如果有些错误,就跳过这些错误
exclude = lost+found/  #跳过指定的目录,不去复制
log file = /var/log/rsyncd.log      # 日志所在位置
pid file = /var/run/rsyncd.pid      # 存放进程的pid文件
lock file = /var/run/rsyncd.lock    # 存放锁文件
reverse lookup = no                 # 拒绝反向解析,不把ip解析为主机名
#hosts allow = 10.0.0.0/24          # 允许连接的主机
[backup]                #每个模块名对应一个不同的path目录,如果同名后面模块生效  共享名
path = /data/backup/    #共享的真实路径
comment = backup dir    #描述信息
read only = no          #默认是yes,即只读
auth users = rsyncuser  #默认anonymous可以访问rsync服务器  用于验证的账号,只有这个账号才能去访问
secrets file = /etc/rsync.pas  #存放密码的文件 格式:  用户名: 密码

Ejemplo: implementar la autenticación de contraseña

[root@CentOS8 ~]# yum install rsync-daemon

[root@CentOS8 ~]# systemctl enable rsyncd --now

[root@CentOS8 ~]# cat /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no

[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = tom
secrets file = /etc/rsync.pas

[root@CentOS8 ~]# systemctl restart rsyncd.service

[root@CentOS8 ~]# mkdir /data/backup/ -p

[root@CentOS8 ~]# echo "tom:redhat" > /etc/rsync.pas

[root@CentOS8 ~]# chmod 600 /etc/rsync.pas
#必须要修改密码文件权限,不然客户端访问的时候会提示密码错误


客户端访问:
[root@CentOS8 ~]# rsync /etc/fstab   [email protected]::backup
Password:  #交互输入tom的密码

或者: 
[root@CentOS8 ~]# rsync /root/anaconda-ks.cfg  rsync://[email protected]/backup
Password:

注意:不指定用户名默认就是当前系统的用户

Puede crear un archivo por adelantado y poner la contraseña en el archivo

#非交互式查看共享目录
[root@CentOS8 ~]# echo "redhat" >/etc/rsync.pas #客户端存放rsync的密码信息

[root@CentOS8 ~]# chmod 600 /etc/rsync.pas #密码文件权限修改(必须,不然会报错)

测试:
[root@CentOS8 ~]# rsync --password-file=/etc/rsync.pas /root/file111  rsync://[email protected]/backup

El script inotify+rsync+shell realiza la sincronización de datos en tiempo real

principio de funcionamiento:

  • Use el servicio de monitoreo (inotify) para monitorear los cambios en la información en el directorio del servidor de datos de sincronización
  • Cuando se encuentre que los datos en el directorio cambian, use el servicio rsync para enviarlos al servidor de respaldo

Ejemplo: inotify+rsync+shell script para lograr la sincronización de datos en tiempo real

数据服务器:存放数据信息的服务器 10.0.0.11

备份服务器:存放备份信息的服务器 10.0.0.12

Idea: use inotidy para monitorear si el evento cambia,

[root@CentOS8 ~]# cat inotify_rsync.sh 
#!/bin/bash
SRC='/data/www/'  #需要同步的目录文件 #注意最后的/

DEST='[email protected]::backup' #同步到备份数据器的指定位置

rpm -q rsync &> /dev/null || yum -y install rsync #如果不存在rsync这个工具就安装它

inotifywait -mrq  --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE; do
          FILEPATH=${DIR}${FILE} #需要同步的文件
	  rsync -az --delete --password-file=/etc/rsync.pas  $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >>  /var/log/changelist.log
done

#通过DATE  TIME DIR FILE 这四个变量记录发生的变化 日期 事件 目录 文件 

Supongo que te gusta

Origin blog.csdn.net/weixin_47367099/article/details/127546432
Recomendado
Clasificación