实战案例(用rsync+inotify+shell脚本实现/www目录实时同步)

人生必须的知识就是引人向光明方面的明灯。这篇文章主要讲述实战案例:用rsync+inotify+shell脚本实现/www目录实时同步相关的知识,希望能为你提供帮助。
?用rsync+inotify+脚本实现/www目录实时同步?
【实战案例(用rsync+inotify+shell脚本实现/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 --nowchronyd.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 --nowchronyd.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
StateRecv-QSend-QLocal Address:PortPeer Address:PortProcess
LISTEN05[::]:873[::]:*

3.2生产服务器端配置 并验证数据同步
# 查看远端备份服务器 rsync 模块信息
[root@DataServer-IP08 ]#rsync 192.168.250.18::
backupbackup 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
#!/bin/bash
#
#********************************************************************************< 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=https://www.songbingjia.com/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


    推荐阅读