HA触发式同步

来源:互联网 发布:女生多的学校 知乎 编辑:程序博客网 时间:2024/05/06 21:13
unison+inotify-tools实现触发式服务器文件双向同步


一、Unison和inotify简介
Unison是Windows、Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。Unison拥有与其它一些同步工具或文件系统的相同的特性,但也有自身的特点:
1.跨平台使用;
2.对内核和用户权限没有特别要求;
3.Unison是双向的,它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;
4.只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议。
Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化。近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。
inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。
Inotify-tools的项目地址:http://sourceforge.net/projects/inotify-tools/
利用以上两点,我们就可以实现触发式的,细粒度的服务器文件同步。
二、安装Unison
方法一、编译安装
Linux下通过源码包编译安装Unison时,需要用到Objective Caml compiler。
通过以下方式安装
[root@server1 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.0.tar.gz
[root@server1 ~]# tar -xzvf ocaml-3.12.0.tar.gz
[root@server1 ~]# cd ocaml-3.12.0
[root@server1 ocaml-3.12.0]# ./configure
[root@server1 ocaml-3.12.0]# make world opt
[root@server1 ocaml-3.12.0]# make install
编译安装Unison
[root@server1 ~]# wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.40.63.tar.gz
[root@server1 ~]# tar -xzvf unison-2.40.63.tar.gz
[root@server1 ~]# cd unison-2.40.63
[root@server1 unison-2.40.63]# make UISTYLE=text
[root@server1 unison-2.40.63]# make install
在执行make install的过程中,可能会出现以下错误提示:
mv: cannot stat '/root/bin//unison': No such file or directory
make: [doinstall] Error 1 (ignored)
cp unison /root/bin/
cp: cannot create regular file '/root/bin/': Is a directory
make: *** [doinstall] Error 1
出现错误的原因在与Unison默认是将文件Copy到/root/bin目录,但Linux默认是没有该目录的,因此我们需要将生成的可执行文件unison复制到系统的PATH目录。
[root@server1 unison-2.40.63]# cp unison /usr/local/bin
将可执行文件unison上传到远程主机(假设远程主机IP为192.168.10.4)
[root@server1 unison-2.40.63]# scp unison root@92.168.10.4:/root/
通过SSH登陆到远程主机,再将unison复制到server2的PATH目录
[root@server2 ~]#cp unison /usr/local/bin
方法二、通过rpm包安装 (测试时我们使用rpm包进行安装)
#wget  ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el6/en/x86_64/dag/RPMS/unison-2.40.63-1.el6.rf.x86_64.rpm
        #rpm -ivh unison-2.40.63-1.el6.rf.x86_64.rpm
测试一下unison
[root@server1 ~]#unison
Usage: unison [options]
    or unison root1 root2 [options]
    or unison profilename [options]
For a list of options, type "unison -help".
表示安装正常
二、安装配置inotify-tools
     方法一、编译安装
可以在http://inotify-tools.sourceforge.net/下载到inotify-tools,接着编译安装:
[root@server1 ~]# tar zxvf inotify-tools-3.14.tar.gz
 [root@server1 ~]# cd inotify-tools-3.14
[root@server1 inotify-tools-3.14]# ./configure
[root@server1 inotify-tools-3.14]#make
[root@server1 inotify-tools-3.14]#make install
完成后,在系统下执行man inotify 、 man inotifywait、man inotifywatch即可得到相应的帮助信息。表示安装成功。
使用inotify功能
可以通过如下命令查看系统是否支持inotify
[root@server1 ~]# uname -a
Linux bogon 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linu
 [root@server1 ~]# ll /proc/sys/fs/inotify
总计 0 -rw-r--r-- 1 root root 0 09-29 03:28 max_queued_events
-rw-r--r-- 1 root root 0 09-29 03:28 max_user_instances
-rw-r--r-- 1 root root 0 09-29 03:28 max_user_watches
如果有输出,表示系统已经内核已经支持inotfy。
inotify 可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
 
 
     方法二、通过yum安装
     略
 
三、配置ssh key信任
     建议通过普通用户进行操作,理由是通过root操作本身就危险,免密码登陆的root就更危险了。
在两台服务器上创建unison用户
[root@server1 ~]# useradd -m unison
[root@server1 ~]# passwd unison
[root@server2 ~]# useradd -m unison
[root@server2 ~]# passwd unison
在server1上创建key并配置server2的信任
[root@server1 ~]# su – unison
[unison@server1 ~]$ ssh-keygen -t rsa
在提示保存私钥(key)和公钥(public key)的位置时,使用默认值;
在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。
之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/home/unison/.ssh/目录下。
将公钥添加到server2的 authorized_keys 文件中
将文件上传到server2(假设server2主机IP为192.168.10.4)
[unison@server1 ~]$ scp ~/.ssh/id_rsa.pub unison@192.168.10.4:/home/unison/
使用rsync用户SSH到登陆到远程主机,并将公钥添加到 authorized_keys 文件中
[unison@server2 ~]$ mkdir .ssh
[unison@server2 ~]$ chmod 700 .ssh
[unison@server2 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
同理,执行以下步骤在server2上创建key并配置server1的信任
[root@server2 ~]# su – unison
[unison@server2 ~]$ ssh-keygen -t rsa
将文件上传到server1(假设server1主机IP为192.168.10.3)
[unison@server2 ~]$ scp ~/.ssh/id_rsa.pub unison@192.168.10.3:/home/unison/
使用rsync用户SSH到登陆到server1,并将公钥添加到 authorized_keys 文件中
[unison@server1 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
重启SSH服务
[root@server1 ~]# /etc/init.d/sshd restart
[root@server2 ~]# /etc/init.d/sshd restart
 四、编辑脚本 同步目标目录
编辑一个脚本文件,比如unison.sh 如下
 
#!/bin/bash
export HOME=/home/appuser
echo $HOME
ip="appuser@app_acq_1"
src="/home/v3/data"
dst="/home/v3/data"
 
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/bin/unison -logfile "/home/v3/logs/unisoninotify_data_log/unison.log" -batch -sshargs "-i /home/appuser/.ssh/id_rsa" $src ssh://$ip/$dst
echo -n "$line " >> /home/v3/logs/unisoninotify_data_log/inotify.log
echo `date | cut -d " " -f1-4` >> /home/v3/logs/unisoninotify_data_log/inotify.log
done
 
之后在两个server上的命令行执行:
[unison@server2 ~]$ ./unison.sh > /dev/null 2>&1 &
 
 最后在两个server的目标目录上建立文件检查同步情况,应能正确触发更新。
0 0
原创粉丝点击