rsync同步

rsync

一、介绍

rsync 是一个功能强大的、高效的用于数据镜像(备份)、文件传输和同步的工具。它可以在本地主机和远程主机之间进行快速同步,并且只传输两个机器之间不同的部分。

基本用法

rsync [选项] 源目录 目标目录
  • 源目录:要同步的源文件或目录。
  • 目标目录:同步的目标文件或目录。

常用选项

  • -a:归档模式,保留所有文件属性,包括权限、时间、组、所有者等。等同于 -rlptgoD
  • -r:递归处理目录。
  • -l:保留软链接。
  • -p:保留权限。
  • -t:保留修改时间。
  • -g:保留组。
  • -o:保留所有者。
  • -D:保留设备文件和特殊文件。
  • -v:详细模式,显示详细的传输过程。
  • -z:压缩传输数据,可以加快传输速度,尤其是对于文本文件。
  • -e:指定远程 shell,通常为 ssh
  • --delete:删除目标目录中不存在于源目录的文件。
  • --exclude=PATTERN:排除符合 PATTERN 的文件或目录。
  • --include=PATTERN:仅包含符合 PATTERN 的文件或目录。

二、安装配置

1. 检查是否安装

[root@234-12 ~]# rpm -qa | grep rsync
rsync-3.1.2-12.el7_9.x86_64

如果命令结果为空,可以使用以下命令安装:

yum install -y rsync

2. 配置文件解析

查看 rsync 安装文件情况

[root@234-12 ~]# rpm -ql rsync
/etc/rsyncd.conf          # 配置文件
/etc/sysconfig/rsyncd     # 守护进程配置
/usr/bin/rsync            # 命令所在目录
/usr/lib/systemd/system/rsyncd.service  # systemctl 服务管理
/usr/lib/systemd/system/rsyncd.socket    # 进程生成的套接字文件
/usr/lib/systemd/system/rsyncd@.service
/usr/share/doc/rsync-3.1.2
/usr/share/doc/rsync-3.1.2/COPYING
/usr/share/doc/rsync-3.1.2/NEWS
/usr/share/doc/rsync-3.1.2/OLDNEWS
/usr/share/doc/rsync-3.1.2/README
/usr/share/doc/rsync-3.1.2/support
/usr/share/doc/rsync-3.1.2/support/Makefile
/usr/share/doc/rsync-3.1.2/support/atomic-rsync
/usr/share/doc/rsync-3.1.2/support/cvs2includes
/usr/share/doc/rsync-3.1.2/support/deny-rsync
/usr/share/doc/rsync-3.1.2/support/file-attr-restore
/usr/share/doc/rsync-3.1.2/support/files-to-excludes
/usr/share/doc/rsync-3.1.2/support/git-set-file-times
/usr/share/doc/rsync-3.1.2/support/instant-rsyncd
/usr/share/doc/rsync-3.1.2/support/logfilter
/usr/share/doc/rsync-3.1.2/support/lsh
/usr/share/doc/rsync-3.1.2/support/lsh.sh
/usr/share/doc/rsync-3.1.2/support/mapfrom
/usr/share/doc/rsync-3.1.2/support/mapto
/usr/share/doc/rsync-3.1.2/support/mnt-excl
/usr/share/doc/rsync-3.1.2/support/munge-symlinks
/usr/share/doc/rsync-3.1.2/support/rrsync
/usr/share/doc/rsync-3.1.2/support/rsync-no-vanished
/usr/share/doc/rsync-3.1.2/support/rsync-slash-strip
/usr/share/doc/rsync-3.1.2/support/rsyncstats
/usr/share/doc/rsync-3.1.2/support/savetransfer.c
/usr/share/doc/rsync-3.1.2/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz

rsync 配置文件详解

# rsync 配置文件详解

# uid = nobody  # 指定 rsyncd 运行时的用户
# gid = nobody  # 指定 rsyncd 运行时的组
# use chroot = yes  # 启用 chroot 功能,提高安全性
# max connections = 4  # 限制同时可以连接到 rsyncd 的最大连接数
# pid file = /var/run/rsyncd.pid  # 指定 rsyncd 进程的 PID 文件
# exclude = lost+found/  # 排除 lost+found 目录
# transfer logging = yes  # 启用传输日志记录
# timeout = 900  # 设置连接超时时间
# ignore nonreadable = yes  # 忽略无法读取的文件
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  # 不压缩某些类型的文件

# [ftp]
#       path = /home/ftp  # 指定 "ftp" 模块的同步根目录
#       comment = ftp export area  # 注释,说明 "ftp" 模块的作用

三、本地同步

以下是实现文件监控和自动同步的方案:

1. 安装 inotify-tools

inotify-tools 是一个 Linux 实时文件系统监控工具,可以监控目录的文件变动。首先,你需要在 CentOS 上安装它。

sudo yum install inotify-tools -y

2. 创建监控和同步脚本

编写一个脚本,当 /home/zhangsan/home/lisi/home/wangwu 目录发生变动时自动触发 rsync 同步到 /backup 目录。

脚本示例:rsync_inotify_sync.sh

#!/bin/bash

# 定义要监控的目录
SOURCE_DIRS=("/home/zhangsan" "/home/lisi" "/home/wangwu")
BACKUP_DIR="/backup"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 监控目录并实时同步
for dir in "${SOURCE_DIRS[@]}"; do
    # 获取当前目录的名称
    BASENAME=$(basename "$dir")

    echo "正在监控目录:$dir"

    # 使用 inotifywait 监控创建、修改和删除事件
    inotifywait -mrq -e modify,create,delete "$dir" | while read path action file; do
        echo "检测到 $dir 中的变化,正在同步到 $BACKUP_DIR/$BASENAME"
        # 使用 rsync 同步变化的目录
        rsync -av --delete "$dir/" "$BACKUP_DIR/$BASENAME/"
        echo "[$(date)] $dir 同步到 $BACKUP_DIR/$BASENAME 完成"
    done &
done

赋予脚本执行权限

将脚本保存为 /usr/local/bin/rsync_inotify_sync.sh,并赋予执行权限:

sudo chmod +x /usr/local/bin/rsync_inotify_sync.sh

3. 后台运行脚本

为了让监控和同步脚本长期运行,你可以将其放在后台执行。例如,使用 nohup& 让脚本在后台运行:

nohup /usr/local/bin/rsync_inotify_sync.sh > /var/log/rsync_inotify_sync.log 2>&1 &

这里使用 nohup 确保脚本在你退出终端后仍然运行。日志将记录在 /var/log/rsync_inotify_sync.log 中。

4. 使用 systemd 实现自动启动

如果你希望系统启动时自动开始文件监控,可以创建一个 systemd 服务。

创建 systemd 服务文件

创建一个服务文件 /etc/systemd/system/rsync_inotify.service

[Unit]
Description=Rsync Inotify File Sync
After=network.target

[Service]
ExecStart=/usr/local/bin/rsync_inotify_sync.sh
Restart=always

[Install]
WantedBy=multi-user.target

启用并启动服务

执行以下命令以启用并启动该服务:

sudo systemctl daemon-reload
sudo systemctl enable rsync_inotify.service
sudo systemctl start rsync_inotify.service

5. 日志管理

脚本运行时会产生日志。你可以使用 logrotate 来管理日志文件,以防日志过大。创建 logrotate 配置文件 /etc/logrotate.d/rsync_inotify_sync

/var/log/rsync_inotify_sync.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
    create 640 root root
}

四、远端同步 服务器 A 和服务器 B 配置文档

服务器信息

服务器 IP 地址 角色 安装的软件
服务器 A 192.168.234.11 源服务器:负责监控 /data/nfs_share 目录的变化,并通过 rsync 将变化同步到服务器 B nfs-utils, rsync, sersync
服务器 B 192.168.234.12 目标服务器:接收来自服务器 A 的文件同步,并存储在 /data/backup 目录中 nfs-utils, rsync

服务器 A (192.168.234.11)

角色

  • 源服务器:负责监控 /data/nfs_share 目录的变化,并通过 rsync 将变化同步到服务器 B。

流程

  1. 安装必要的软件

    • nfs-utils:用于设置 NFS 共享。
    • rsync:用于文件同步。
    • sersync:用于实时监控目录变化并触发 rsync 同步。
  2. 设置系统参数

    • 设置 inotify 参数以支持更多的文件系统事件监听。
      • 设置 inotify 参数:
        • fs.inotify.max_user_watches=50000000
        • fs.inotify.max_queued_events=327679
  3. 配置 NFS 共享

    • 创建共享目录 /data/nfs_share
    • 编辑 /etc/exports 文件,允许服务器 B 访问共享目录。
    • 启动 NFS 服务并导出共享目录。
      • 创建共享目录 /data/nfs_share 并设置权限。
      • 编辑 /etc/exports 文件,添加共享目录配置。
      • 启动 NFS 服务并导出共享目录。
      • 查看导出的目录。
  4. 配置 rsync

    • 创建 rsync 密码文件 /etc/rsync.password
      • 创建密码文件并设置权限。
  5. 配置 sersync

    • 解压 sersync 软件包并将其移动到 /app/sersync2
    • 编辑 sersync 配置文件 /app/sersync2/confxml.xml,配置监控目录和远程服务器信息。
    • 启动 sersync 服务并设置开机自启动。
      • 编辑 sersync 配置文件。
      • 启动 sersync 服务。
      • 设置 sersync 开机自启动。

安装的软件

  • nfs-utils
  • rsync
  • sersync

脚本A并执行

#!/bin/bash

# 设置系统参数
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events

# 永久设置系统参数
echo 'fs.inotify.max_user_watches=50000000' | sudo tee -a /etc/sysctl.conf
echo 'fs.inotify.max_queued_events=327679' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 解压 sersync 软件包并设置路径
cd /app
# 确保解压到正确的目录,并命名为 sersync2
tar -xzvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 检查解压后的文件夹
if [ -d "GNU-Linux-x86" ]; then
    mv GNU-Linux-x86 sersync2
else
    echo "sersync 解压失败,检查软件包路径或压缩文件。"
    exit 1
fi

# 添加 sersync2 到 PATH
echo 'export PATH=$PATH:/app/sersync2' | sudo tee -a /etc/profile
source /etc/profile

# 安装和配置 NFS 服务
sudo yum install -y nfs-utils

# 创建共享目录
sudo mkdir -p /data/nfs_share
sudo chown -R nobody:nobody /data/nfs_share
sudo chmod -R 777 /data/nfs_share

# 编辑 NFS 配置文件
echo '/data/nfs_share 192.168.234.12(rw,sync,no_subtree_check)' | sudo tee -a /etc/exports

# 启动和配置 NFS 服务
sudo systemctl start rpcbind
sudo systemctl start nfs-server
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server

# 导出共享目录
sudo exportfs -a

# 查看导出的目录
sudo showmount -e

# 安装 rsync
sudo yum install -y rsync

# 编辑 sersync 配置文件
sudo tee /app/sersync2/confxml.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<head version="2.5">
    <!-- 主机配置,监听本地的 8008 端口 -->
    <host hostip="localhost" port="8008"></host>

    <!-- 调试模式,关闭调试 -->
    <debug start="false"/>

    <!-- 文件系统配置,关闭对 XFS 文件系统的支持 -->
    <fileSystem xfs="false"/>

    <!-- 文件过滤规则,当前关闭文件过滤功能 -->
    <filter start="false">
        <exclude expression="(.*)\.svn"></exclude> <!-- 排除 .svn 目录 -->
        <exclude expression="(.*)\.gz"></exclude> <!-- 排除 .gz 文件 -->
        <exclude expression="^info/*"></exclude> <!-- 排除 info 目录下的文件 -->
        <exclude expression="^static/*"></exclude> <!-- 排除 static 目录下的文件 -->
    </filter>

    <!-- inotify 事件监听配置,启用关键文件事件监听 -->
    <inotify>
        <delete start="true"/> <!-- 监听文件删除事件 -->
        <createFolder start="true"/> <!-- 监听目录创建事件 -->
        <createFile start="true"/> <!-- 监听文件创建事件 -->
        <closeWrite start="true"/> <!-- 监听文件关闭写入事件 -->
        <moveFrom start="true"/> <!-- 监听文件移动前事件 -->
        <moveTo start="true"/> <!-- 监听文件移动后事件 -->
        <attrib start="false"/> <!-- 关闭文件属性变更事件的监听 -->
        <modify start="false"/> <!-- 关闭文件修改事件的监听 -->
    </inotify>

    <!-- sersync 配置 -->
    <sersync>
        <!-- 本地路径监听 -->
        <localpath watch="/data/nfs_share">
            <!-- 远程服务器配置,备份到远程服务器 -->
            <remote ip="192.168.234.12" name="backup"/>
        </localpath>

        <!-- rsync 配置 -->
        <rsync>
            <commonParams params="-avz"/> <!-- rsync 常用参数,压缩并详细输出 -->
            <auth start="true" users="rsync_user" passwordfile="/etc/rsync.password"/> <!-- 启用认证,使用密码文件 -->
            <userDefinedPort start="false" port="874"/> <!-- 自定义端口,未启用 -->
            <timeout start="false" time="100"/> <!-- 超时时间配置,未启用 -->
            <ssh start="false"/> <!-- 不使用 SSH 进行同步 -->
        </rsync>

        <!-- 失败日志配置 -->
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> <!-- 定期执行失败日志处理,每 60 秒执行一次 -->

        <!-- 定时任务配置,当前未启用 -->
        <crontab start="false" schedule="600">
            <crontabfilter start="false">
                <exclude expression="*.php"/> <!-- 排除 .php 文件 -->
                <exclude expression="info/*"/> <!-- 排除 info 目录下的文件 -->
            </crontabfilter>
        </crontab>

        <!-- 插件配置,当前未启用 -->
        <plugin start="false" name="command"/>
    </sersync>
</head>

EOF

# 创建密码文件
echo "123456" | sudo tee /etc/rsync.password
sudo chmod 600 /etc/rsync.password

# 启动 sersync 服务
if [ -f "/app/sersync2/sersync2" ]; then
    /app/sersync2/sersync2 -r -d -o /app/sersync2/confxml.xml
else
    echo "sersync2 程序文件不存在,请检查软件包解压路径。"
    exit 1
fi

# 设置 sersync 开机自启动
sudo tee -a /etc/rc.local <<EOF
#!/bin/bash
/app/sersync2/sersync2 -r -d -o /app/sersync2/confxml.xml
EOF
sudo chmod +x /etc/rc.local

服务器 B (192.168.234.12)

角色

  • 目标服务器:接收来自服务器 A 的文件同步,并存储在 /data/backup 目录中。

流程

  1. 安装必要的软件

    • nfs-utils:用于挂载 NFS 共享。
    • rsync:用于接收文件同步。
  2. 挂载 NFS 共享

    • 创建挂载点 /data/backup
    • 编辑 /etc/fstab 文件,自动挂载 NFS 共享。
    • 挂载 NFS 共享。
  3. 配置 rsync

    • 创建 rsync 密码文件 /etc/rsync.password
      • 创建密码文件并设置权限。
  4. 测试同步

    • 手动运行 rsync 命令测试同步。
    • 确认同步成功后,可以通过 sersync 自动同步。

安装的软件

  • nfs-utils
  • rsync

脚本B并执行

#!/bin/bash

# 设置系统参数
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events

# 永久设置系统参数
echo 'fs.inotify.max_user_watches=50000000' | sudo tee -a /etc/sysctl.conf
echo 'fs.inotify.max_queued_events=327679' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 安装和配置 NFS 客户端
sudo yum install -y nfs-utils

# 创建挂载点
sudo mkdir -p /mnt/nfs_share

# 挂载 NFS 共享目录
sudo mount 192.168.234.11:/data/nfs_share /mnt/nfs_share

# 验证挂载是否成功
df -h

# 安装 rsync
sudo yum install -y rsync

# 编辑 rsync 配置文件
sudo tee /etc/rsyncd.conf <<EOF
uid = root
gid = root
use chroot = no
max connections = 4
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log

[backup]
path = /data/backup
comment = backup data
read only = no
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.234.11
EOF

# 创建密码文件
echo "rsync:123456" | sudo tee /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets

# 创建备份目录
sudo mkdir -p /data/backup
sudo chown -R nobody:nobody /data/backup
sudo chmod -R 777 /data/backup

# 创建 rsync 的 systemd 服务文件
sudo tee /etc/systemd/system/rsync.service <<EOF
[Unit]
Description=rsync daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动并启用 rsync 服务
sudo systemctl start rsync
sudo systemctl enable rsync

# 设置 rsync 开机自启动
sudo tee -a /etc/rc.local <<EOF
#!/bin/bash
systemctl start rsync
EOF
sudo chmod +x /etc/rc.local

在服务器 B 上验证同步结果

# 检查 `/data/backup` 目录中的文件是否与服务器 A 的 `/data/nfs_share` 目录一致
ls -l /data/backup

总结

  1. 安装 rsync 和 inotify-tools:用 yum 安装。
  2. 编写脚本:用 inotifywait 监控文件变化,并用 rsync 实时同步。
  3. 后台运行:使用 nohupsystemd 将脚本作为后台服务运行。
  4. 日志管理:通过 logrotate 管理日志文件,避免日志过大。
  5. 远端同步:配置服务器 A 和服务器 B,实现文件的实时同步。
  6. 测试同步:手动触发同步并验证结果,确保配置正确。

这样,你就可以实现基于文件变化的实时同步了。每当 zhangsanlisiwangwu 目录有文件更改时,会自动同步到备份目录。同时,服务器 A 和服务器 B 之间的文件也可以实现远端同步。