实战案例:用rsync+inotify+shell脚本实现/www目录实时同步
Posted njsummer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战案例:用rsync+inotify+shell脚本实现/www目录实时同步相关的知识,希望对你有一定的参考价值。
用rsync+inotify+脚本实现/www目录实时同步
实际生产中,数据的备份非常重要,市场上提供很多商用软件的解决方案,功能和性能的优势明显,但是都需要付费,我们在本文中介绍如何利用LInux下自带的rsync软件 + inotify + shell 脚本 实现目录的实时自动同步。
基本思路:在生产服务器和备份服务器的操作系统CentOS8.4内核中都集成了rsync-3.1.3,通过脚本利用 inotify对生产服务器的目录进行监控,再结合 rsync自身的同步功能实现数据实时同步。
1. 架构及主机
两台服务器
1 生产服务器 :
主机名:DataServer-IP08
CentOS 8.4
IP: 192.168.250.8
rsync-3.1.3-12.el8.src.rpm
inotify-tools-3.14
2 备份服务器 :
主机名: BackupServer-IP18
CentOS 8.4
IP: 192.168.250.18
rsync-3.1.3-12.el8.src.rpm
inotify-tools-3.14
2. 服务器环境准备
基本任务及过程:在生产服务器上建好WWW目录;再在备份服务器上准备好备份目录/data/www-backup;验证 rsync + inotify 的安装 。
2.1 生产服务器 DataServer-IP08
# 服务器关闭防火墙和SELinux、时间同步、服务器改名
[root@CentOS84 ]#hostnamectl set-hostname DataServer-IP08
[root@CentOS84 ]#exit
[root@DataServer-IP08 ]#systemctl enable --now chronyd.service
# 验证inotify 和 rsync 的安装
[root@DataServer-IP08 ]#grep -i inotify /boot/config-4.18.0-305.3.1.el8.x86_64
CONFIG_INOTIFY_USER=y
[root@DataServer-IP08 ]#yum -y install rsync
[root@DataServer-IP08 ]#rpm -qi rsync
Name : rsync
Version : 3.1.3
# inotify是内核中集成的功能,安装好inotify-tools工具包
[root@DataServer-IP08 ]#yum -y install inotify-tools
# 准备www目录及目录下的文件,便于后面的同步演示
[root@DataServer-IP08 ]#mkdir /data/www
[root@DataServer-IP08 ]#tree /data/
/data/
└── www
2.2 备份服务器 BackupServer-IP18
# 服务器关闭防火墙和SELinux、时间同步、服务器改名
[root@CentOS84 ]#hostnamectl set-hostname BackupServer-IP18
[root@CentOS84 ]#exit
logout
[root@BackupServer-IP18 ]#systemctl enable --now chronyd.service
# 验证 rsync 的安装
[root@BackupServer-IP18 ]#yum -y install rsync
[root@BackupServer-IP18 ]#rpm -qi rsync
Name : rsync
Version : 3.1.3
# 查看并创建备份目录
[root@BackupServer-IP18 ]#mkdir /data/www-backup
[root@BackupServer-IP18 ]#ll /data/
total 0
drwxr-xr-x 2 root root 6 Mar 20 09:04 www-backup
3. 以独立服务方式运行rsync并验证实现的同步功能
3.1 备份服务器端配置 BackupServer-IP18
# 安装 rsync-daemon
[root@BackupServer-IP18 ]#dnf -y install rsync-daemon
# 查看安装包的信息
[root@BackupServer-IP18 ]#rpm -ql rsync-daemon
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/lib/systemd/system/rsyncd.service
/usr/lib/systemd/system/rsyncd.socket
/usr/lib/systemd/system/rsyncd@.service
/usr/share/man/man5/rsyncd.conf.5.gz
# 服务文件内容
[root@BackupServer-IP18 ]#cat /usr/lib/systemd/system/rsyncd.service
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
Wants=network-online.target
After=network-online.target
[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --daemon --no-detach "$OPTIONS"
[Install]
WantedBy=multi-user.target
# 查看rsyncd.conf,都是注释语句,默认为空。但是注释语句应该基本了解,在rsync默认无需密码使用都是这些默认配置在生效
[root@BackupServer-IP18 ]#cat /etc/rsyncd.conf
[root@BackUp-Server-IP18 ]#cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
# path = /home/ftp
# comment = ftp export area
[root@BackUp-Server-IP18 ]#
# 配置rsyncd.conf
[root@BackupServer-IP18 ]#vim /etc/rsyncd.conf
[root@BackupServer-IP18 ]#cat /etc/rsyncd.conf
uid = root #默认为nobody,修改成root
gid = root
#port = 873 #默认端口是TCP873,可以自定义
#use chroot = no
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
hosts allow = 192.168.250.0/24
[backup]
path = /data/www-backup/
comment = backup dir
read only = no #默认是yes,即只读
auth users = rsyncuser #默认anonymous可以访问rsync服务器,修改成自定义
secrets file = /etc/rsync.passwd #账号密码文件及路劲
# 备份服务器端的账号和密码文件
[root@BackupServer-IP18 ]#echo "rsyncuser:shone8888" > /etc/rsync.passwd
[root@BackupServer-IP18 ]#cat /etc/rsync.passwd
rsyncuser:shone8888
# 密码文件缩小权限,root可读写
[root@BackupServer-IP18 ]#chmod 600 /etc/rsync.passwd
[root@BackupServer-IP18 ]#ll /etc/rsync.passwd
-rw------- 1 root root 20 Mar 20 12:33 /etc/rsync.passwd
# 启动并设定开启启动 rsyncd
[root@BackupServer-IP18 ]#systemctl enable --now rsyncd
# 验证监听端口
[root@BackupServer-IP18 ]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 5 [::]:873 [::]:*
3.2 生产服务器端配置 并验证数据同步
# 查看远端备份服务器 rsync 模块信息
[root@DataServer-IP08 ]#rsync 192.168.250.18::
backup backup dir
# 手工输入同步命令行,默认rsync可以不需要密码,生产中不安全,经过上面的配置后需要密码才能同步复制数据
[root@DataServer-IP08 ]#rsync /etc/group rsyncuser@192.168.250.18::backup
Password: #输入前面定义好的密码 shone8888
# 在备份服务器上可以看到 /etc/group文件被成功复制到备份目录www-backup下
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
└── group
## 下面来实现非交互式的数据同步
# 定义密码文件并缩小权限,特别提醒注意生产端的密码文件和备份端不一样,只需要密码不需要账号,否则会报错
[root@DataServer-IP08 ]#echo "shone8888" > /etc/rsync.passwd
[root@DataServer-IP08 ]#chmod 600 /etc/rsync.passwd
[root@DataServer-IP08 ]#rsync --password-file=/etc/rsync.passwd rsyncuser@192.168.250.18::backup
# 会从列出备份服务器上备份目录下的所有文件,不需要输入密码
[root@DataServer-IP08 ]#
# 下面命令成功运行,即实现了非交互式的数据同步复制;
[root@DataServer-IP08 ]#rsync --password-file=/etc/rsync.passwd /etc/sestatus.conf rsyncuser@192.168.250.18::backup
# 在备份服务器上可以看到 /etc/sestatus.conf文件被成功复制到备份目录www-backup下
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
├── group
└── sestatus.conf
# 至此已经完成了rsync安全验证条件下的,非交互式的数据复制和同步,这样为下面实现自动同步奠定了基础。
4. 运用shell 脚本 + rsync实现实时数据同步
内容和过程:前面已经实现了rsync安全验证(密码文件)条件下的非交互式的数据复制和同步,这样编写一个脚本调用inotify监控指定的生产服务器上的WWW目录,目录内的文件发生变化就触发实时同步。
## 编写一个脚本调用inotify监控指定的生产服务器上的WWW目录,目录内的文件发生变化就触发实时同步。
[root@DataServer-IP08 ]#vim inotify_rsync.sh
[root@DataServer-IP08 ]#cat inotify_rsync.sh
#
#********************************************************************************<strong>
#Author: WuDongWuXia
#QQ: 1050572574@qq.com
#Date: 2022-03-20
#FileName: inotify_rsync.sh
#URL: www.shoneinfo.cn
#Description: The Test Script
#Copyright (C):2022 All rights reserved
#</strong>********************************************************************************
SRC=/data/www/
DEST=rsyncuser@192.168.250.18::backup
rpm -q rsync &> /dev/null || yum -y install 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.passwd $SRC $DEST && echo "At $TIME on $DATE, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
[root@DataServer-IP08 ]#
[root@DataServer-IP08 ]#bash inotify_rsync.sh
# 一般生产中后台运行 bash inotify_rsync.sh &或者screen下运行,当然为了显示文件同步的效果,我们实验中以前台方式运行脚本。
5. 在终端窗口下验证数据同步
任务内容:在下面的窗口中,我们在生产服务器DataServer-IP08 的/data/www下创建和修改操作文件,在右边的窗口下看备份服务器的备份目录下文件的同步情况。
# 备份服务器上用watch 实时观测备份目录的变化和同步情况
[root@BackupServer-IP18 ]#watch -n0.5 ls -l /data/www-backup/
# tail -f /var/log/changelist.log 查看文件传输日志
[root@DataServer-IP08 ]#tail -f /var/log/changelist.log
At 13:51:01 on 2022-03-20, file /data/www/6.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/7.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/7.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/7.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/8.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/8.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/8.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/9.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/9.txt was backuped up via rsync
At 13:51:01 on 2022-03-20, file /data/www/9.txt was backuped up via rsync
以上是关于实战案例:用rsync+inotify+shell脚本实现/www目录实时同步的主要内容,如果未能解决你的问题,请参考以下文章