实现实时同步(也就是源一变化,它就会触发同步)
inotify+rsync
源服务器:172.16.12.167
同步服务器:172.16.12.169
先操作同步服务器
1设置SELINUX
vi /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存,退出
setenforce 0 #立即生效
2、开启防火墙tcp 873端口(Rsync默认端口)
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
:wq! #保存,退出
/etc/init.d/iptables restart #最后重启防火墙使配置生效
3安装Rsync服务端
yum -y install rsync
4安装xinetd ,把服务托管给xinetd
yum install rsync xinetd #安装
vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync
disable = no #修改为no
:wq! #保存退出
service xinetd start 启动xinetd
创建rsyncd.conf配置文件
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass
motd file = /etc/rsyncd.Motd
[web]
path = /data/backup
comment = web
uid = root
gid = root
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = jerry
:wq! #保存退出
配置项说明
vi /etc/rsyncd.conf #创建配置文件,添加以下代码
log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
secrets file = /etc/rsync.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
motd file = /etc/rsyncd.Motd #rsync启动时欢迎信息页面文件位置(文件内容自定义)
[web] #自定义名称
path =/data/backup#rsync服务端数据目录路径 此路径必须要在同步服务器中存在,不然会报
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]comment = web #模块名称与[web]自定义名称相同
uid = root #设置rsync运行权限为root
gid = root #设置rsync运行权限为root
port=873 #默认端口
use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份
read only = no #设置rsync服务端文件为读写权限
list = no #不显示rsync服务端资源列表
max connections = 200 #最大连接数
timeout = 600 #设置超时时间
auth users =jerry#执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.21.129 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开 可以不写
hosts deny = 192.168.21.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开 可以不写
5.创建用户认证文件
vi /etc/rsync.pass #配置文件,添加以下内容
jerry:123456 #格式,用户名:密码,可以设置多个,每行一个用户名:密码
:wq! #保存,退出
chmod 600 /etc/rsyncd.conf #设置文件所有者读取、写入权限
chmod 600 /etc/rsync.pass #设置文件所有者读取、写入权限
service xinetd restart #重启xinetd
在源服务器上操作:172.16.12.167
1设置SELINUX
vi /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存,退出
setenforce 0 #立即生效
2、开启防火墙tcp 873端口(Rsync默认端口)
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
:wq! #保存,退出
/etc/init.d/iptables restart #最后重启防火墙使配置生效
3安装Rsync服务端
yum -y install rsync
4安装xinetd ,把服务托管给xinetd
yum install rsync xinetd #安装
vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync
disable = no #修改为no
:wq! #保存退出
service xinetd start 启动xinetd
5、创建认证密码文件
vi /etc/passwd.txt #编辑文件,添加以下内容
123456 #密码
:wq! #保存退出
测试下RSYNC是否能同步
试源服务器172.16.12.167到同步服务器172.16.12.169之间的数据同步
mkdir /home/test/cheshi #在源服务器上创建测试文件夹,然后在源服务器运行下面命令
rsync -avH --port=873 --progress --delete /home/test jerry@172.16.12.169::web --password-file=/etc/passwd.txt 注意空隔,如果多一个空隔可能会报错。,本人在测试中,因为用户名和前面的目录有两个空隔,结果报用户名没有授权
安装Inotify-tools工具,实时触发rsync进行同步
是监控源服务器,所有在源服务器上安装inotify-tools
1、查看服务器内核是否支持inotify
ll /proc/sys/fs/inotify #列出文件目录,出现下面的内容,说明服务器内核支持inotify
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches
备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核
CentOS 5.X 内核为2.6.18,默认已经支持inotify
2、安装inotify-tools
yum install make gcc gcc-c++ #安装编译工具
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz -C /usr/local/src #解压
cd /usr/local/src inotify-tools-3.14 #进入解压目录
./configure --prefix=/usr/local/inotify #配置
make #编译
make install #安装
--安装完后,就会产生下面两个命令
/usr/local/bin/inotifywait
/usr/local/bin/inotifywatch
# /usr/local/bin/inotifywait --help
/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory
如果报错,找不到那个库,这个库实际上是在/usr/local/lib下的
解决方法
# echo /usr/local/lib/ > /etc/ld.so.conf.d/abc.conf
# ldconfig
3、设置系统环境变量,添加软连接
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh #使设置立即生效
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify
4、修改inotify默认参数(inotify默认内核参数值太小)
查看系统默认参数值
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances = 128
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vi /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
:wq! #保存退出
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)
max_user_instances:
每个用户创建inotify实例最大值
5创建脚本,实时触发rsync进行同步 .
vi /usr/local/inotify/rsync.sh
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /home/test |while read events
do
rsync -avH --port=873 --progress --delete /home/test jerry@172.16.12.169::web --password-file=/etc/passwd.txt
echo "`date +'%F %T'`出现事件events" >> /var/log/rsync.log 2>&1
done
chmod +x /usr/local/inotify/rsync.sh #添加脚本执行权限
脚本参数说明:
srcdir=/home/test #源服务器同步目录
dstdir=web #目标服务器rsync同步目录模块名称
rsyncuser=jerry #目标服务器rsync同步用户名
rsyncpassdir=/etc/passwd.txt #目标服务器rsync同步用户的密码在源服务器的存放路径
dstip="172.16.12.169" #目标服务器ip,多个ip用空格分开
/tmp/rsync.log #脚本运行日志记录
可以运行下rsync.sh执行下,看是否能成功执行
6、设置脚本开机自动执行
vi /etc/rc.d/rc.local #编辑,在最后添加一行
nohup /usr/local/inotify/rsync.sh & #设置开机自动在后台运行脚本
:wq! #保存退出
--使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭
7、测试inotify实时触发rsync同步脚本是否正常运行
在源服务器172.16.12.167上创建文件
mkdir /home/test
重新启动源服务器:172.16.12.167
等系统启动之后,查看两台目标服务器172.16.12.169的/data/backup下是否有test文件夹
至此,Linux下Rsync+Inotify-tools实现数据实时同步完成。