1.说明
将主服务器(源服务器)的文件备份到从服务器(目标服务器)上。通过inotify监听源服务器上 /var/www 目录下文件的新增、修改、删除等事件,当触发事件时,调用 rsync 实现将文件同步到目标服务器相同的目录下。
源服务器:10.1.5.43 简称43
目标服务器:10.1.5.44 简称44
2.同步实现
2.1目标服务器(44)与源服务器(43)都需要安装rsync
安装rsync
yum -y install rsync
2.2在目标服务器(44)执行以下操作
修改/etc/rsyncd.conf,配置如下内容
vim /etc/rsyncd.conf
rsyncd.conf 添加以下配置信息
uid = root
gid = root
use chroot = yes
#最大连接数
max connections = 10
#日志文件
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
motd file = /etc/rsyncd.motd
#保留发送日志
transfer logging = yes
#超时时间
timeout = 900
[vsftpd]
#路径,若修改同步目录,需要修改此处,需要和源服务器脚本(inotify.sh)中的 src 一致
path = /var/www
#忽略错误
ignore errors
#如果为true,则不能上传文件到该模块的目录下,推数据使用.
read only = false
#指定密码文件
secrets file = /etc/rsync.password
可以看到,/etc/rsyncd.motd、/var/log/rsyncd.log与/etc/rsync.password默认是没有的,需要我们自己touch。touch好后,在/etc/rsync.password里面需要写上用户名与对应的密码,密码随意,这里以vsftpd为例。在/etc/rsyncd.motd中写上一些登录提醒信息,内容随意。
vim /etc/rsyncd.motd
rsyncd.motd 添加以下提醒信息
Welcome!
创建 rsyncd.log 文件
touch /var/log/rsyncd.log
创建 rsync.password 文件
touch /etc/rsync.password
rsync.password 添加以下信息
文件格式是 用户名:密码
vsftpd:123456
设置文件权限,只设置文件所有者具有读取、写入权限即可
chmod 600 /etc/rsync.password
2.3在源服务器(43)执行以下操作
创建认证密码文件,只需要密码,不需要用户
vim /etc/rsyncp.password
rsyncp.password 添加目标服务器 rsync.password 文件中配置的用户对应的密码
只需要密码,不需要用户
123456
设置文件权限,只设置文件所有者具有读取、写入权限即可
chmod 600 /etc/rsyncp.password
2.4在源服务器(43)安装inotify-tools工具
yum -y install inotify-tools
2.5在源服务器(43)创建同步脚本
创建脚本存放目录
mkdir /opt/product/scripts
创建脚本
touch /opt/product/scripts/inotify.sh
编写脚本
vim /opt/aspire/product/scripts/inotify.sh
inotify.sh 添加以下内容
#!/bin/bash
# 需要同步的路径,若修改同步目录,需要修改此处,需要和目标服务器中rsyncd.conf 的 path 一致
src=/var/www
# 目标服务器上 rsync --daemon 发布名称
des=vsftpd
# rsync验证的密码文件
rsync_passwd_file=/etc/rsyncp.password
# 目标(备份)服务器,注意要更换为自己的目标服务器 ip
ip=10.1.5.44
# rsync --daemon定义的验证用户名
user=vsftpd
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e create,delete,attrib,close_write,move ./ $src |while read file
do
# 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_EVENT=$(echo $file |awk '{print $1}')
# 把inotify输出切割 把文件路径部分赋值给INO_FILE
INO_FILE=$(echo $file |awk '{print $2}')
echo "--------------------$(date)---------------------"
echo ${INO_FILE}
# 判断事件类型
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
then
echo 'CREATE or CLOSE_WRITE or MOVED_TO'
echo $(dirname ${INO_FILE})
rsync -avzcR --exclude *.swp --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
fi
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
echo $(dirname ${INO_FILE})
rsync -avzR --exclude *.swp --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
fi
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
then
rsync -avzcR --exclude *.swp --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
fi
fi
done
当对目录修改用户权限时,只有其目录下的文件发生修改后才可以修改成功!
移动文件时,移动文件的目录必须是 /var/www目录及其子目录下,否则目标服务器上的文件会丢失!
修改脚本权限
chmod 755 /opt/aspire/product/scripts/inotify.sh
2.6 在源服务器(43)启动脚本
cd /opt/product/scripts
bash -s /opt/product/scripts/inotify.sh
nohup bash /opt/product/scripts/inotify.sh &
/opt/product/scripts/nohup.out文件中有传输日志
文件同步开始
3.更换同步目录
将inotify.sh脚本任务关闭,修改目标服务器的/etc/rsyncd.conf配置文件的
path
和源服务器的inotify.sh同步脚本中的
src
, 将这两处修改为需同步目录,然后重启脚本。例:若同步目录为 /home/test,将 /var/www 修改为 /home/test
4. 源服务器(43)异常处理
4.1 说明
当源服务器(43)有异常时,把目标服务器(44)作为新的源服务器,源服务器(43)作为目标服务器,两台服务器主从互换。
4.2 准备工作
在源服务器(43)执行
2.2
操作
在目标服务器(44)执行
2.3
操作
在目标服务器(44)执行
2.4
操作
在目标服务器(44)执行
2.5
操作,注意将同步脚本中的
ip
修改为10.1.5.43
4.3 操作
将源服务器(43)的同步脚本关闭
ps -ef | grep inotify.sh
共有三个进程(/opt/aspire/product/scripts/inotify.sh),全部杀掉
Kill -9 进程id
在目标服务器(44)执行
2.6
操作
此时服务器以44为主,43为从服务器,对44文件进行操作,会同步到43服务器。