目录
Rsync(Remote Sync)简介:
Rsync 主要特点:
Rsync 常用命令选项:
Inotify 简介:
Inotify 的主要功能:
结合 Rsync 和 Inotify 实现实时同步:
操作步骤:
配置备份服务器rsync
配置应用服务器inotify
注意事项:
Rsync(Remote Sync)简介:
rsync
是一个用于文件同步和备份的命令行工具,可以在本地和远程系统之间高效地同步文件和目录。- 它能够快速地复制和同步大量数据,只传输那些发生变化的部分,节省了带宽和时间。
- 支持完整备份、差量备份和增量备份等多种备份方式,可以根据需求选择不同的备份策略。
Rsync 主要特点:
- 增量传输:仅传输变化的部分,节省带宽和时间。
- 文件权限保留:可以保留文件权限、时间戳等元数据。
- 删除文件同步:支持在目标目录中删除源目录不存在的文件。
- 压缩传输:支持传输时压缩数据,减少传输量。
- 远程同步:可以在本地和远程系统之间同步文件。
Rsync 常用命令选项:
-a
:归档模式,保留所有文件属性,相当于-rlptgoD
。-v
:详细输出,显示每个文件传输的详细信息。-z
:传输时压缩数据,减少传输量。--delete
:删除目标目录中不存在于源目录中的文件。--exclude
:排除指定文件或目录。--progress
:显示传输进度。--backup
:在覆盖目标文件时备份已存在的文件。
Inotify 简介:
inotify
是 Linux 内核提供的机制,用于监视文件系统事件。- 可以监视文件或目录的各种事件,如文件创建、删除、修改、移动等。
- 可以通过命令行工具
inotifywait
使用这个机制,实现对文件系统的实时监控。
Inotify 的主要功能:
- 实时监控:可以实时监听文件系统的变化,并触发相应的动作。
- 文件系统事件:监控文件和目录的各种事件,如创建、删除、修改等。
- 可编程性:可以通过脚本或程序使用
inotify
进行文件系统监控和处理。
结合 Rsync 和 Inotify 实现实时同步:
- 使用
inotifywait
监听源目录的变化。 - 当源目录发生变化时,触发
rsync
命令进行同步。 rsync
将变化的文件或目录同步到目标位置。
这样,当文件系统的变化发生时,就可以立即将变化同步到目标位置,实现了文件的实时备份和同步。常见应用场景包括实时数据备份、网站文件同步等。
操作步骤:
应用服务器ip为192.168.1.33,备份服务器ip为192.168.1.22。需要将应用服务器的/var/www/html/ 实时同步给备份服务器的/var/www/html/
配置备份服务器rsync
vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
address = 192.168.1.22
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[web_bak]
path = /var/www/html
comment = Document Root of www.myweb.com
read only = no
auth users = backuper
secrets file = /etc/rsyncd_users.db
-
uid = root
:指定守护进程运行时所使用的用户的 UID。在这里是root
,表示守护进程会以root
用户的身份运行。 -
gid = root
:指定守护进程运行时所使用的用户组的 GID。与上面类似,这里也是root
,表示守护进程会以root
用户组的身份运行。 -
use chroot = yes
:表示在运行守护进程前,将其 chroot(切换根目录)到指定的路径。在这里是yes
,表示守护进程会以/var/www/html/
作为其根目录。 -
address = 192.168.1.22
:指定rsync
守护进程监听的 IP 地址。 -
port 873
:指定rsync
守护进程监听的端口号。默认rsync
服务的端口号是873
。 -
log file = /var/log/rsyncd.log
:指定rsync
守护进程的日志文件路径。 -
pid file = /var/run/rsyncd.pid
:指定rsync
守护进程的 PID 文件路径,用于记录守护进程的进程 ID。 -
hosts allow = 192.168.1.0/24
:指定允许访问rsync
守护进程的主机或 IP 地址范围。在这里是允许192.168.1.0/24
网段的主机访问。 -
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
:指定不压缩的文件类型,这些文件类型不会被rsync
守护进程压缩传输。 -
[web_bak]
:定义一个模块,客户端在访问rsync
时可以使用这个名称。-
path = /var/www/html
:指定这个模块的路径,客户端可以访问的目录路径。在这里是/var/www/html
,表示客户端可以访问和同步的是这个目录。 -
comment = Document Root of www.myweb.com
:对这个模块的描述注释。 -
read only = no
:表示这个模块是可写的,客户端可以向这个模块写入文件。 -
auth users = backuper
:指定允许访问这个模块的授权用户,这里是backuper
。 -
secrets file = /etc/rsyncd_users.db
:指定包含授权用户密码的文件路径。
-
rsync --daemon
chmod 777 /var/www/html/
rsync --daemon
是用于启动 rsync
守护进程的命令。通过这个命令,可以在服务器上启动 rsync
守护进程,使得其他客户端可以通过 rsync
协议访问服务器上的共享目录。
配置应用服务器inotify
先调整inotify内核参数
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
sysctl -p
示例中的设置如下:
-
这三个参数分别控制着 Linux 系统中 inotify 子系统的行为。下面对每个参数进行解释:
-
fs.inotify.max_queued_events
:- 这个参数定义了每个 inotify 实例中允许排队的事件数量的最大限制。
- 默认值通常是 16384。
- 适当增加这个值可以确保即使在高负载时系统也不会丢失任何事件。
-
fs.inotify.max_user_instances
:- 这个参数定义了单个用户可以创建的 inotify 实例的最大数量。
- 默认值通常是 128。
- 如果系统需要大量的 inotify 实例,比如同时监视大量文件或目录,可能需要增加这个值。
-
fs.inotify.max_user_watches
:- 这个参数定义了单个用户在所有 inotify 实例中能够监视的文件或目录的最大数量。
- 默认值通常是 8192。
- 如果应用程序需要监视大量文件或目录,可能需要增加这个值。
fs.inotify.max_queued_events = 16384
:允许每个 inotify 实例中排队的事件数量的最大限制为 16384。fs.inotify.max_user_instances = 1024
:单个用户可以创建的 inotify 实例的最大数量为 1024。fs.inotify.max_user_watches = 1048576
:单个用户在所有 inotify 实例中能够监视的文件或目录的最大数量为 1048576。
安装 inotify-tools
tar zxvf inotify-tools-3.14.tar.gz -C /opt/
cd /opt/inotify-tools-3.14
./configure
make -j4 && make install
编写脚本触发同步
vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.1.22::web_bak/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
使用 inotifywait
监听 /var/www/html/
目录的文件变化,一旦有变化就触发 rsync
命令同步到备份服务器上。
-
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
:- 定义了一个变量
INOTIFY_CMD
,存储了使用inotifywait
监听/var/www/html/
目录的命令。 -mrq
选项分别表示递归监听、静默模式、以原始格式输出。-e modify,create,attrib,move,delete
选项指定了需要监听的事件类型,包括文件修改、创建、属性变化、移动和删除。
- 定义了一个变量
-
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.1.22::web_bak/"
:- 定义了一个变量
RSYNC_CMD
,存储了用于同步的rsync
命令。 -azH
选项分别表示压缩传输、保持文件权限、保持硬链接。--delete
选项表示删除目标端(备份服务器)上不存在于源端(本地服务器)的文件。--password-file=/etc/server.pass
指定了密码文件的路径,这样rsync
就可以使用其中的密码进行认证。/var/www/html/
是本地源目录。backuper@192.168.1.22::web_bak/
是备份服务器上的目标模块名。
- 定义了一个变量
-
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
:- 使用
read DIRECTORY EVENT FILE
将inotifywait
的输出分别赋值给DIRECTORY
、EVENT
和FILE
,提高了灵活性和可读性。 - 在每次文件变化时都会输出当前的目录、事件和文件名,方便调试和监控。
- 如果只需要简单地监听文件变化并进行同步也可以使用"$INOTIFY_CMD | while read AA" 这样简化了
read
命令的使用,只需要一个变量AA
就可以处理inotifywait
的输出。
- 使用
-
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
:- 检查当前是否已经有
rsync
进程在运行,如果没有则执行同步操作。 pgrep rsync | wc -l
是用来统计rsync
进程的数量。-le 0
表示小于等于 0,即当前没有rsync
进程在运行时执行后续操作。
- 检查当前是否已经有
-
$RSYNC_CMD
:- 执行前面定义的
RSYNC_CMD
命令,即执行rsync
同步操作到备份服务器。
- 执行前面定义的
通过这个脚本,当 /var/www/html/
目录下的文件发生变化时(修改、创建、属性变化、移动、删除),就会触发 rsync
命令将这些变化同步到备份服务器的 web_bak
模块中。
注意事项:
- 确保
inotify-tools
包已经安装,以便使用inotifywait
命令。 - 确保
/etc/server.pass
文件存在且包含正确的密码。
chmod +x /opt/inotify.sh
chmod 777 /var/www/html/
chmod +x /etc/rc.d/rc.local
echo '/opt/inotify.sh' >> /etc/rc.d/rc.local
echo "123456" > /etc/server.pass
chmod 600 /etc/server.pass
cd /opt
./inotify.sh
运行脚本后应用服务器的/var/www/html/ 将实时同步给备份服务器