龚哥哥 爱生活、做自己!
rsync+inotify搭建多台服务器之间文件实时同步
发表于 2016-8-31 | 服务器

一、准备

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。

1、服务器

操作系统		CentOS-6.5-x86_64 6.5
Linux内核	2.6.32

master		192.168.0.200	客户端(数据服务器)
slave1		192.168.0.110	数据同步服务器(备份服务器1)
slave2		192.168.0.111	数据同步服务器(备份服务器2)

2、基础命令安装(所有服务器都需要安装,已经安装可跳过)

yum install -y gcc gcc-c++ make wget

二、数据同步服务端配置(备份服务器)

1、检查是否已安装rsync

rpm -qa | grep rsync

2、安装rsync和xinetd超级守护进程

yum -y install xinetd rsync

3、创建rsync用户及模块目录并更改其用户组(用户运行rsync的用户,不建议使用root)

useradd rsync -s /sbin/nologin  -M
grep rsync /etc/passwd
mkdir -p /data/www
chown -R rsync:rsync /data

4、配置rsync认证文件 /etc/rsync.password(格式 用户:密码)

echo "rsync:rsync" > /etc/rsync.password

4.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

5、为rsync服务提供配置文件,vim  /etc/rsyncd.conf 文件默认不存在,手动创建即可

# 工作中指定用户(需要指定用户)
uid = rsync
gid = rsync

# 相当于黑洞.出错定位
use chroot = no

# 有多少个客户端同时传文件
max connections = 200

# 超时时间
timeout = 600

# 进程号文件
pid file = /var/run/rsyncd.pid

# 锁文件
lock file = /var/run/rsync.lock

# 日志文件
log file = /var/log/rsyncd.log

# 模块配置
# 这个模块对应的是推送目录,模块名称随便起
[rsync]

# 需要同步的目录
path = /data/www/

# 表示出现错误忽略错误
ignore errors

# 表示网络权限可写(本地控制真正可写)
read only = false

# 这里设置IP或让不让同步
list = false

# 白名单,可以访问此模块的主机
hosts allow = 192.168.0.200

# 黑名单,*表示任何主机
hosts deny = *

# 认证此模块的用户名,虚拟用户
auth users = rsync

# 虚拟用户的密码文件
secrets file = /etc/rsync.password

6、配置rsync操作脚本

A、启动脚本

echo "rsync --daemon --config=/etc/rsyncd.conf" > /etc/init.d/rsync-start
chmod +x /etc/init.d/rsync-start

B、停止脚本

echo "killall -9 rsync > /dev/null 2>&1; rm -rf /var/run/rsyncd.pid" > /etc/init.d/rsync-stop
chmod +x /etc/init.d/rsync-stop

C、重启脚本

echo "/etc/init.d/rsync-stop; /etc/init.d/rsync-start" > /etc/init.d/rsync-restart
chmod +x /etc/init.d/rsync-restart

6.1、以后服务器启动后,手动启动rsync脚本即可

/etc/init.d/rsync-start 		启动
/etc/init.d/rsync-stop 			停止
/etc/init.d/rsync-restart 		重启

7、启动xinetd超级守护进程服务

service xinetd start

8、配置防火墙允许873端口通信  vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

9、查看rsync服务是否成功开启

ps -ef | grep rsync

10、检查873端口是否成功监听

netstat -ntlp | grep 873

三、客户端配置

1、检查是否已安装rsync

rpm -qa | grep rsync

1.1、安装rsync服务

yum -y install rsync

2、创建本地监控的目录

mkdir -p /data/www

3、配置rsync认证文件 /etc/rsync.password(这里只要写密码即可,切记)

echo "rsync" > /etc/rsync.password

3.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

4、测试一下,进入 /data/www

cd /data/www
touch test.txt
rsync -avz test.txt rsync@192.168.0.110::rsync --password-file=/etc/rsync.password

5、inotify-tools实现实时同步

mkdir /data/soft
cd /data/soft
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make && make install

6、编写rsync脚本,添加一下内容  vim /etc/rsync.sh

#!/bin/bash

# 数据同步监控脚本
# @author	Devil
# @version	0.0.1

# inotify-slave的ip地址(多个ip空格分割)
host="192.168.0.110 192.168.0.111"

# 本地监控的目录
src=/data/www/

# inotify-slave的rsync服务的模块名
dst=rsync

# inotify-slave的rsync服务的虚拟用户
user=rsync

# 本地调用rsync服务的密码文件
rsync_passfile=/etc/rsync.password

# inotify的安装目录
inotify_home=/usr/local/inotify

# 参数校验
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
	echo "Check File and Folder"
	exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
	cd $src
	for tmp_host in $host
	do
		rsync -aruz -R --delete ./  --timeout=100 $user@$tmp_host::$dst --password-file=${rsync_passfile} > /dev/null 2>&1
	done
done
exit 0

6.1、给rsync.sh执行权限

chmod +x /etc/rsync.sh

6.2、配置操作rsync脚本文件,添加以下内容  vim /etc/init.d/rsync

# 脚本名称
name="rsync"

# 拉取正在运行的脚本进程号
PROCESS=`ps -ef | grep $name | grep -v grep | grep -v PPID | awk '{ print $2}'`

# 输出正在停止脚本的提示
if [ -n "$PROCESS" ]
then
	echo "正在停止"
fi

# 停止脚本
for i in $PROCESS
do
	kill -9 $i > /dev/null 2>&1
done

# 是否停止成功
if [ $? != 0 ]
then
	echo "停止失败"
	exit 0
fi

# 启动脚本
/etc/rsync.sh &

# 等待2秒
sleep 2

# 判断脚本是否启动成功
is_rsync=$(ps -ef | grep "$name" | grep -v grep | wc -l)
if [ $is_rsync != 0 ]
then
	echo "启动成功"
else
	echo "启动失败"
fi

6.3、给rsync服务脚本执行权限

chmod +x /etc/init.d/rsync

7、以后每次只需运行rsync脚本即可,停止启动合并

/etc/init.d/rsync

8、进入监控目录操作文件试试看效果

cd /data/www
touch test.txt
echo "hello" > test.txt
touch world.txt

9、查看备份服务器 192.168.0.100,192.168.0.110

cd /data/www
ls
文件都同步过来了

发表评论:

TOP