Nfs主从同步rsync+inotify
主节点:192.168.1.10
从节点:192.168.1.20
同步目录 /data
安装 NFS
安装服务
创建共享目录
mkdir /data
chmod -R 777 /data
- 添加配置文件
echo "/data 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)" >> /etc/exports
- 启动
systemctl start rpcbind
systemctl start nfs
systemctl enable rpcbind
systemctl enable nfs
- 查看
showmount -e 127.0.0.1
安装 rsync
- 临时关闭立即生效,重启后恢复
setenforce 0
- 永久关闭
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
Centos
yum install rsync -y
Ubuntu
apt install rsync -y
配置 rsync
Centos系统配置文件所在位置:/etc/rsyncd.conf
Ubuntu系统配置文件所在位置:/usr/share/doc/rsync/examples/rsyncd.conf
从节点执行
编辑配置文件
vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
max connections = 200
log file=/var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
exclude = lost+found/
transfer logging = yes
timeout = 600
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[data]
path = /data
auth users = rsync
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.1.10 # 主节点IP
read only = no
配置认证文件
echo 'rsync:password' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass
echo "password" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
目录授权
chown -R root:root /data
启动服务
从节点执行
其他启动方法 rsync --daemon --config=/etc/rsyncd.conf
但是重新启动的时候遇到了问题,当我 kill 掉原进程后报错
failed to create pid file /var/run/rsyncd.pid: File exists
解决方案:rm -rf /var/run/rsyncd.pid
所以尽量选择 systemctl 管理 rsyncd
systemctl enable rsyncd.service
systemctl start rsyncd.service
同步测试
rsync -arv /data/ rsync@192.168.1.20::data --password-file=/etc/rsync.pass
如果想在目标目录中删除那些在源目录中不存在的文件可使用
rsync -avz --progress --delete /data/ rsync@192.168.1.20::data --password-file=/etc/rsync.pass
-avz
:这是一组选项,分别代表:
-a
:表示"归档"模式,用于保留文件的所有属性,包括权限、所有者、组、时间戳等等。
-v
:表示"详细"模式,用于在执行时显示更多详细信息。
-z
:表示启用压缩传输,将文件在传输过程中进行压缩,以减少网络带宽的使用。
--progress
:这个选项表示在执行同步操作时显示进度信息。
--delete
:这个选项表示在目标目录中删除那些在源目录中不存在的文件。这意味着目标目录将与源目录保持同步,不会有多余的文件留在目标目录中。
安装 inotify
Centos
yum install epel-release -y
yum install inotify-tools -y
Ubuntu
apt install inotify-tools
配置 inotify
编辑同步脚本
cat > /opt/rsync_inotify.sh << EOF
#!/bin/bash
HOST=192.168.1.20 # 从节点IP
USER=rsync
PASSWORD=/etc/rsync.pass
SRC=/data/
Module=data
inotifywait=/usr/bin/inotifywait
\$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib,move,close_write \$SRC \\
| while read files ;do
rsync -avzP --delete --password-file=\${PASSWORD} \$SRC \$USER@\$HOST::\$Module
done
EOF
modify
:文件内容被修改。
create
:文件或目录被创建。
delete
:文件或目录被删除。
attrib
:文件或目录的属性被修改。
close_write
:文件被关闭(通常在写入完成后触发)。
move
:文件或目录被移动。
启动
我觉得网上的 nohup sh /opt/rsync_inotify.sh &
的启动方式肯定是没有 system 管理合适的
- 将 inotify 纳入 system 管理
cat > /etc/systemd/system/inotify.service << EOF
[Unit]
Description=Inotify Service
After=network.target
[Service]
RemainAfterExit=yes
ExecStart=/opt/rsync_inotify.sh
ExecStop=pkill -f "rsync_inotify.sh"
ExecReload=/opt/rsync_inotify.sh && pkill -f "rsync_inotify.sh"
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
EOF
- 启动 inotify
systemctl daemon-reload
systemctl enable inotify
systemctl start inotify