一、准备rsyncd服务环境
backup服务器(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 = chaoge 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机器)
1、内核检查
[nfs-31 root ~] # uname -r
3.10.0-1160.71.1.el7.x86_64
本质上是linux支持inotify机制
在性能还可以优化,支持更高的文件并发数
#检测多少个文件 ,文件内容大量的发生变化,inotify机制能同时检测多少文件
这个参数的优化,就是调整linux的几个文件
[nfs-31 root ~] # ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jan 6 15:32 max_queued_events
-rw-r--r-- 1 root root 0 Jan 6 15:32 max_user_instances
-rw-r--r-- 1 root root 0 Jan 6 15:32 max_user_watches
系统文件解释
max_user_watches: 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认只能监控8192个文件
max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认每个用户可以开启inotify服务128个进程
max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量
默认监控事件队列长度为16384
2、安装innotifty-tools工具
需要配置好epel源,才可以安装
[nfs-31 root ~] # ls /etc/yum.repos.d/
Centos-7.repo epel-7.repo repo_bak
[nfs-31 root ~] #
[nfs-31 root ~] # yum install inotify-tools -y
[nfs-31 root ~] # rpm -qa|grep inotify-tools
inotify-tools-3.14-9.el7.x86_64
检查生成的软件命令
[nfs-31 root ~] # rpm -ql inotify-tools |head -2
/usr/bin/inotifywait
/usr/bin/inotifywatch
3、inotifywait详解和使用
3.1 inotifywait作用
inotifywait:在被监控的目录等待特定文件系统事件(open、close、delete等事件),执行后处于阻塞状态,适合在Shell脚本中使用,是实现监控的关键
Inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)
3.2 inotifywait实践
所有事件,任意的Linux命令,只要对该目录的数据
对文件发生了修改动作,都会被检测到
[nfs-31 root ~] # ls /nfs-data/
test1 test2 test3
开两个终端,一个终端执行命令,另一个终端对/nfs-data目录下文件进行修改或者创建新的文件
[nfs-31 root ~] # inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" /nfs-data
10:14:33----/nfs-data/------ 捕获到的事件是:OPEN,ISDIR
10:14:33----/nfs-data/------ 捕获到的事件是:CLOSE_NOWRITE,CLOSE,ISDIR
10:14:35----/nfs-data/------ 捕获到的事件是:OPEN,ISDIR
10:14:35----/nfs-data/------ 捕获到的事件是:CLOSE_NOWRITE,CLOSE,ISDIR
......
10:14:37----/nfs-data/------test3 捕获到的事件是:OPEN
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:CREATE
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:OPEN
10:14:37----/nfs-data/------.test3.swpx 捕获到的事件是:CREATE
10:14:37----/nfs-data/------.test3.swpx 捕获到的事件是:OPEN
10:14:37----/nfs-data/------.test3.swpx 捕获到的事件是:CLOSE_WRITE,CLOSE
10:14:37----/nfs-data/------.test3.swpx 捕获到的事件是:DELETE
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:CLOSE_WRITE,CLOSE
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:DELETE
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:CREATE
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:OPEN
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:MODIFY
10:14:37----/nfs-data/------.test3.swp 捕获到的事件是:ATTRIB
10:14:37----/nfs-data/------test3 捕获到的事件是:CLOSE_NOWRITE,CLOSE
10:14:37----/nfs-data/------test3 捕获到的事件是:OPEN
10:14:37----/nfs-data/------test3 捕获到的事件是:CLOSE_NOWRITE,CLOSE
10:14:37----/nfs-data/------ 捕获到的事件是:OPEN,ISDIR
10:14:37----/nfs-data/------ 捕获到的事件是:CLOSE_NOWRITE,CLOSE,ISDIR
10:14:39----/nfs-data/------.test3.swp 捕获到的事件是:MODIFY
10:14:41----/nfs-data/------4913 捕获到的事件是:CREATE
10:14:41----/nfs-data/------4913 捕获到的事件是:OPEN
10:14:41----/nfs-data/------4913 捕获到的事件是:ATTRIB
10:14:41----/nfs-data/------4913 捕获到的事件是:CLOSE_WRITE,CLOSE
10:14:41----/nfs-data/------4913 捕获到的事件是:DELETE
10:14:41----/nfs-data/------test3 捕获到的事件是:MOVED_FROM
10:14:41----/nfs-data/------test3~ 捕获到的事件是:MOVED_TO
10:14:41----/nfs-data/------test3 捕获到的事件是:CREATE
10:14:41----/nfs-data/------test3 捕获到的事件是:OPEN
10:14:41----/nfs-data/------test3 捕获到的事件是:MODIFY
10:14:41----/nfs-data/------test3 捕获到的事件是:CLOSE_WRITE,CLOSE
10:14:41----/nfs-data/------test3 捕获到的事件是:ATTRIB
10:14:41----/nfs-data/------.test3.swp 捕获到的事件是:MODIFY
10:14:41----/nfs-data/------test3~ 捕获到的事件是:DELETE
10:14:41----/nfs-data/------.test3.swp 捕获到的事件是:CLOSE_WRITE,CLOSE
10:14:41----/nfs-data/------.test3.swp 捕获到的事件是:DELETE
需要指定检测事件的名字
Events 含义
access 文件或目录被读取
modify 文件或目录内容被修改
attrib 文件或目录属性被改变
close 文件或目录封闭,无论读/写模式
open 文件或目录被打开moved_to 文件或目录被移动至另外一个目录
move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载
create、delete事件
检测,创建和删除两个时间,只有执行了对应的Linux命令,才会生成日志
[nfs-31 root ~] # inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e delete,create /nfs-data
10:29:35----/nfs-data/------test222 捕获到的事件是:CREATE
10:30:47----/nfs-data/------1.png 捕获到的事件是:CREATE
10:31:04----/nfs-data/------test2 捕获到的事件是:DELETE
10:31:10----/nfs-data/------test1 捕获到的事件是:DELETE
move事件
[nfs-31 root ~] # inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e move /nfs-data
10:38:26----/nfs-data/------test222 捕获到的事件是:MOVED_FROM
10:40:39----/nfs-data/------test1.txt 捕获到的事件是:MOVED_TO
三、inotify结合rsync实时同步
1、编写一个shell脚本实现
[nfs-31 root ~] # cat rsy_inotify.sh
#!/bin/bash
# 源目录和目标目录
nfsdata_dir="/nfs-data"
backup_dir="backup"
hostname="rsync_backup@rsync-41"
# inotifywait 监控源目录的变化
inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" "$nfsdata_dir" | while read file
do
echo "文件变化检测到: $file"
sleep 3 # 延迟3秒钟
# 使用 rsync 同步变化的文件或目录
rsync -avzP --delete "$nfsdata_dir" "$hostname"::"$backup_dir"
done
执行脚本之后就会自动检测/nfs-data目录下数据有更改或者添加都会进行同步
[nfs-31 root ~] # bash rsy_inotify.sh
文件变化检测到: 13:38:51----/nfs-data/------1.txt 捕获到的事件是:CREATE
sending incremental file list
nfs-data/
nfs-data/1.png
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=7/9)
nfs-data/1.txt
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=6/9)
nfs-data/2.png
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=5/9)
nfs-data/2.txt
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=4/9)
nfs-data/3.png
0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=3/9)
nfs-data/3.txt
0 100% 0.00kB/s 0:00:00 (xfr#6, to-chk=2/9)
nfs-data/4.png
0 100% 0.00kB/s 0:00:00 (xfr#7, to-chk=1/9)
nfs-data/5.png
0 100% 0.00kB/s 0:00:00 (xfr#8, to-chk=0/9)
sent 533 bytes received 180 bytes 475.33 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------1.txt 捕获到的事件是:OPEN
sending incremental file list
sent 242 bytes received 25 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------1.txt 捕获到的事件是:ATTRIB
sending incremental file list
sent 242 bytes received 25 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------1.txt 捕获到的事件是:CLOSE_WRITE,CLOSE
sending incremental file list
sent 242 bytes received 25 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------2.txt 捕获到的事件是:CREATE
sending incremental file list
sent 242 bytes received 25 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------2.txt 捕获到的事件是:OPEN
sending incremental file list
sent 242 bytes received 25 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00
文件变化检测到: 13:38:51----/nfs-data/------2.txt 捕获到的事件是:ATTRIB
sending incremental file list
nfs-31机器上对应目录
rsync-41机器上面同步的目标目录
四、lsyncd工具(扩展)
https://github.com/lsyncd/lsyncd
Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。
1、下载安装
[nfs-31 root ~] # yum -y install lsyncd
2、修改配置文件(只检测一个目录)
先备份一下配置源文件
[nfs-31 root ~] # cp /etc/lsyncd.conf /etc/lsyncd.conf.bak
[nfs-31 root ~] # vim /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@rsync-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"}
}
}
3、启动服务
[nfs-31 root ~] # systemctl restart lsyncd
[nfs-31 root ~] # systemctl status lsyncd
● lsyncd.service - Live Syncing (Mirror) Daemon
Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2025-01-07 14:12:37 CST; 1s ago
Main PID: 4015 (lsyncd)
CGroup: /system.slice/lsyncd.service
├─4015 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
└─4017 /usr/bin/rsync --exclude-from=- --delete --ignore-errors -gvzsolptD --bwlimit=200 ...
Jan 07 14:12:37 nfs-31 lsyncd[4004]: 14:12:37 Error: Temporary or permanent failure on startup o...set.
Jan 07 14:12:37 nfs-31 lsyncd[4004]: 14:12:17 Normal: --- Startup ---
Jan 07 14:12:37 nfs-31 lsyncd[4004]: 14:12:17 Normal: recursive startup rsync: /nfs-data/ -> rsy...ding
Jan 07 14:12:37 nfs-31 lsyncd[4004]: .*
Jan 07 14:12:37 nfs-31 lsyncd[4004]: 14:12:37 Normal: --- TERM signal, fading ---
Jan 07 14:12:37 nfs-31 lsyncd[4004]: 14:12:37 Normal: waiting for 1 more child processes.
Jan 07 14:12:37 nfs-31 systemd[1]: Stopped Live Syncing (Mirror) Daemon.
Jan 07 14:12:37 nfs-31 systemd[1]: Unit lsyncd.service entered failed state.
Jan 07 14:12:37 nfs-31 systemd[1]: lsyncd.service failed.
Jan 07 14:12:37 nfs-31 systemd[1]: Started Live Syncing (Mirror) Daemon.
Hint: Some lines were ellipsized, use -l to show in full.