`
stephen830
  • 浏览: 3010168 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Unison+inotify-tools实现Ubuntu主机间的多机触发式双向同步

 
阅读更多

概述

 

 

最近在做一个web项目,要求做成群集形式。方案是nginx+tomcat+memcached_session_manager,部署环境是Ubuntu 10.04 Server LTS。项目快完成时发现自己忽略了文件同步问题,于是立即开动google,满世界寻找解决方案。

 

这个项目有很多需要用户上传的文件,比如用户的形象照片,视频文件等。在群集中,用户上传的文件往往被某个节点的服务器保存在该物理服务器的某个目录下。那么其它节点的服务器如何访问这些文件呢?一般来说,有两种解决方案,一是NFS,即设立专门的网络文件服务器;二是同步远程服务器的文件目录,使其保持一致。

 

NFS方案比较简单,但访问速度会相对比较慢,而且所有的文件通过网络来存取,个人感觉效率太低下。另外,为了保证单台NFS失效时网站的正常运行,我们还需要将NFS配置成多台群集的模式,增加了成本和复杂性。

 

第二种方案可以很好地兼顾成本和效率,是可以接受的方式。但笔者以前没有在Ubuntu上实现过远程文件同步的经验,因此查找资料和摸索配置,寻找最优方案的工作整整进行了两天。郁闷啊!

 

 

 

最后选定的方案如下:

 

Unison               实现双向同步

 

Inotify tools              监控文件系统

 

OpenSSH           远程主机间的文件传输

 

软件介绍

 

OpenSSH

 

OpenSSH SSH Secure SHell 协议的免费开源实现。

 

它用安全、加密的网络连接工具代替了 telnetftp rloginrsh rcp 工具。OpenSSH 支持 SSH 协议的版本 1.31.5、和 2。自从 OpenSSH 的版本2.9以来,默认的协议是版本2,该协议默认使用 RSA 钥匙。

 

OpenSSH的项目地址如下:http://www.openssh.com/

 

 

 

Unison

 

Unison是一款跨平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSHRSHSocket等网络协议进行同步。更棒的是,Unison支持双向同步操作,你既可以从A同步到B,也可以从B同步到A,这些都不需要额外的设定。

 

Unison的项目地址:http://www.cis.upenn.edu/~bcpierce/unison/

 

 

 

Inotify tools

 

Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSDMac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化。近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。

 

inotify-tools 是为linuxinotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。

 

Inotify-tools的项目地址:http://sourceforge.net/projects/inotify-tools/

 

 

 

软件安装

 

准备工作

 

       安装操作系统Ubuntu 10.04 Server LTS32位或者64位。假设我们有3台安装了Ubuntu 10.04 Server LTSWeb服务器,分别为:

 

       server1           192.168.0.101

 

       server2           192.168.0.102

 

       server3           192.168.0.103

 

       server4           192.168.0.104

 

       其默认用户名分别为user1user2user3user4

 

 

 

       需要同步的目录均为:/var/www/html

 

安装OpenSSH

 

       在各台服务器上安装OpenSSH,使用如下命令:

 

       sudo apt-get install openssh

 

       该命令在你的机器上同时安装了SSH ServerSSH Client

 

安装Unison

 

       在各个需要同步的服务器上执行以下命令安装unison

 

sudo apt-get install unison

 

安装Inotify tools

 

在各个需要同步的服务器上执行以下命令安装inotify-tools

 

       apt-get install inotify-tools

 

 

 

配置

 

多机同步的拓扑结构

 

       web群集中,同步在多机之间进行,而unison的同步功能仅支持双机。因此我们设计了一个星型的拓扑结构,来实现多机的同步。其设计思想就是利用unison的双向同步功能,指定一台服务器为星型结构的主服务器(server1),剩余服务器与其进行双向同步。这样,任何一台服务器上的文件变化都可以通过这个结构扩散,从而达到多机同步的目的。



这一结构的缺点是一旦server1当机失效,同步就会失败。因此,有必要的话,可以组成双主服务器的星型结构来弥补。

配置双机信任(ssh key)

 

Unison通过SSH来进行文件同步时,需要用户手工输入远程主机的登录密码。而我们试图通过开机自启动的脚本来实现自动的同步功能。因此,我们需要为SSH配置双机信任,使双方在使用ssh时不需要再输入密码。

 

使用 ssh-keygen和ssh-copy-id配置一下就可以无需输入密码直接登录服务器了。

ssh-keygen 创建公钥和密钥。
ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。
ssh-copy-id 也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限

生成秘钥对

 

server2server3server4上分别生成一对公钥/私钥:

 

 

ssh-keygen -t rsa

 

 

 

命令执行完毕后,密钥对就生成了,公钥是~/.ssh/id_rsa.pub,私钥是~/.ssh/id_rsa

 

将公钥复制到服务器

 

       server2server3server4上分别使用OpenSSHssh-copy-id工具将公钥写入server1上的~/.ssh/authorized_keys。命令如下:

 

      

ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.101

 

 

 

反向配置

 

       server1上按照上述方法生成秘钥对,然后将公钥分别复制到server2server3Server4

 

SSH登录测试

 

       server2上用SSH登录到server1上测试一下:

 

       ssh user1@192.168.0.101

 

       如果系统不再提示你输入密码而直接登录到了server1,说明我们的配置成功了。

 

 

 

创建.sh脚本来实现同步

 

从服务器脚本

 

分别在server2server3server4上创建同步脚本:

 

       vi unisonsync.sh

 

       vi编辑器中将下列代码复制粘贴到新建的脚本中:

 

#!/bin/bash

export HOME=/root

echo $HOME

ip="root@192.168.0.101"

src="/var/www/html/"

dst="/var/www/html/"



/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do

/usr/bin/unison -batch -sshargs "-i /root/.ssh/id_rsa" $src ssh://$ip/$dst

echo -n "$line " >> /data/log/inotify.log

echo `date | cut -d " " -f1-4` >> /data/log/inotify.log

done

 

 

 

注意:

 

其中userX是指该服务器上的默认用户名。

 

授权脚本的可执行权限

 

chmod 777 ~/unisonsync.sh

 

改变需要同步的文件的访问权限:

 

sudo chmod 777 /var/www/html

 

改变对日志目录的访问权限:

 

sudo chmod 777 /var/log

 

 

 

主服务器上的反向设置

 

       在主服务器上也创建unisonsync.sh脚本,内容如下:

 

#!/bin/bash

export HOME=/root

echo $HOME

ip2="root@192.168.0.102"
ip3="root@192.168.0.103"
ip4="root@192.168.0.104"


src="/var/www/html/"

dst="/var/www/html/"



/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do

/usr/bin/unison -batch -sshargs "-i /root/.ssh/id_rsa" $src ssh://$ip2/$dst
/usr/bin/unison -batch -sshargs "-i /root/.ssh/id_rsa" $src ssh://$ip3/$dst
/usr/bin/unison -batch -sshargs "-i /root/.ssh/id_rsa" $src ssh://$ip4/$dst

echo -n "$line " >> /data/log/inotify.log

echo `date | cut -d " " -f1-4` >> /data/log/inotify.log

done

 

 

 

 

其它配置与从服务器一致。

 

测试脚本

 

       server2上键入命令:

 

       ./unisonsync.sh&

 

       然后随便复制一个文件到同步目录/var/www/html,再查看server1上的同步目录,看看该文件是否也被增加了。

 

 

 

       在在server1上键入命令:

 

       ./unisonsync.sh&

 

       然后随便复制一个文件到同步目录/var/www/html,再查看各台从服务器上的同步目录,看看该文件是否也被增加了。

 

 

 

将同步脚本设置为Ubuntu的开机启动脚本

 

       每次在服务器启动上都需要键入一遍执行脚本的命令是比较愚蠢的做法,会遭到系统维护人员的极度鄙视。明智的做法是将该启动脚本加入到Ubuntu的开机启动脚本中去,或者使其作为ubuntu的服务在开机时被启动。

 

 

 

       我们选择比较简洁的方式,即将该脚本添加到Ubuntu的开机启动脚本rc.local中。/etc/rc.localUbuntu开机后启动的最后一个脚本。打开编辑该脚本:

 

       sudo vi /etc/rc.local

 

       在文件末尾(exit 0)之前添加如下代码:

 

       /home/userX/unisonsync.sh&

 

       这里userX是指该服务器上的默认用户名。

 

 

 

       保存文件并重启服务器。在任意一台服务器上复制一个文件到同步目录下,看看其它服务器是否也会同步新增该文件。

 

 

       OK,至此,大功告成。

 

 

 

 

 

 

 

 

 

 

  • 大小: 10.7 KB
分享到:
评论

相关推荐

    Linux unison+inotify 文件实时双向同步

    为了实现文件的实时双向同步,我们可以利用`unison`的命令行接口和`inotify`事件。首先,我们需要在两个系统上安装`unison`。然后,编写一个脚本(如`unison.sh`),在其中配置`unison`的参数,指定需要同步的目录和...

    inotify-tools软件包

    1. **实时备份**:结合`rsync`或`unison`,`inotify-tools`可以实现文件或目录的实时备份,确保数据安全。 2. **自动化构建**:在源代码更改后立即触发编译或构建过程,提高开发效率。 3. **日志监控**:监控日志...

    inotify-tools-3.14.zip

    《使用inotify-tools实现多服务器文件实时同步详解》 在IT运维领域,高效的数据同步是保障服务稳定性和数据一致性的关键。inotify-tools是一个强大的Linux工具集,它提供了对文件系统事件的监控,如文件创建、修改...

    inotify-tools.zip

    inotify压缩包里面也包含unison,rsync+inotify可以实现实时同步,inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。要使用 inotify,...

    inotify+unison双向同步环境部署.md

    在liux下做文件同步有几种方式,采用inotify+unison实现双向同步,且当其中一台服务器宕机,也不会影响web的访问,环境部署文档

    unison实现双系统文件实时同步

    Unison是一款强大的文件同步工具,可在多个操作系统之间,如Windows、Linux之间实现文件的双向同步。Unison的独特之处在于它的跨平台性、低系统要求、双向同步功能以及对冲突处理的智能策略。本文将详细介绍如何在双...

    inotify+unison rpm安装包,包含所有依赖包

    它使用了Inotify技术来检测本地文件系统的更改,并通过网络与远程主机上的Unison实例进行通信,实现双向同步,确保数据的一致性。Unison提供了图形用户界面(GTK版本)和文本界面(Text版本),用户可以根据自己的...

    Unison配置

    可以通过执行`.unison.sh`来启动同步任务,或通过计划任务等方式实现定时同步。 #### 三、总结 本文详细介绍了如何使用Unison进行文件同步的完整流程,包括所需工具的安装配置以及Unison的具体使用方法。通过上述...

    PyPI 官网下载 | unison_gitignore-1.0.1-py3-none-any.whl

    例如,这个库可能包含了一些自动化处理`.gitignore`文件的规则,以更好地与Unison的配置集成,帮助用户在多个设备之间同步项目时避免不必要的文件冲突。 标签“Python库”进一步确认了这是一个用于Python开发的...

    unison双向同步文件工具可在linux下和window系统下

    Unison的独特之处在于它的双向同步功能,这意味着两个同步端的数据改动都可以被检测到,并且可以智能地解决冲突,确保数据的一致性。 1. **Unison的基本原理**: Unison采用增量同步的方式,只传输自上次同步以来...

    Linux文件同步工具Unison

    在“的是两台Linux服务器上的文件的实时同步.txt”文件中,可能会介绍如何设置Unison实现实时同步,例如通过定时任务(如cron)定期运行Unison,或者利用inotify机制监控文件系统变动并自动触发同步。 总之,Unison...

    e6的nfs+unison+rpc

    在IT行业中,文件同步和分布式存储是至关重要的任务,特别是在多服务器环境或远程协作的场景下。`e6`可能是某种环境或者项目代号,它需要通过`NFS`(Network File System)、`Unison`和`RPC`(Remote Procedure Call...

    zabbix高可用.zip

    本资料包包含了实现Zabbix高可用所需的所有组件,包括Zabbix 4.0.0、libiconv、OCaml、Unison、inotify-tools以及keepalived,下面将详细解析这些组件在构建Zabbix HA中的作用。 1. **Zabbix 4.0.0**:这是Zabbix的...

    双向同步软件unision

    Unison是一款强大的文件同步工具,主要功能是实现在两个不同的存储位置之间进行数据的双向同步。这意味着,无论你在哪个位置对文件或文件夹进行了修改,这些更改都会被传播到另一个位置,确保两个位置的数据始终保持...

    unison-2.27.57.tar.gz

    它允许用户在两台或多台计算机之间进行双向同步,确保数据的一致性和完整性。标题中的"unison-2.27.57.tar.gz"表示的是Unison的特定版本2.27.57的源代码包,采用的是常见的GNU/Linux软件分发格式——tar归档并经过...

    Unison使用手册

    ##### 4.7 使用 Unison 同步多台机器(Using Unison to Synchronize More Than Two Machines) - **多点同步**: 可以同时同步三个或更多主机之间的文件。 - **网络拓扑**: 需要考虑网络连接的拓扑结构。 ##### 4.8 ...

    unison文件同步for windows-part2

    更棒的是,Unison支持双向同步操作,你既可以从A同步到B,也可以从B同步到A,这些都不需要额外的设定。 整个教程是我本人花一天时间查找撰写的,windows中文版的教程在网络上很难找,本人查看英文文档,自己在服务器...

    unison文件同步for windows-part1

    更棒的是,Unison支持双向同步操作,你既可以从A同步到B,也可以从B同步到A,这些都不需要额外的设定。 整个教程是我本人花一天时间查找撰写的,windows中文版的教程在网络上很难找,本人查看英文文档,自己在服务器...

Global site tag (gtag.js) - Google Analytics