最近做的一个项目,项目上线 ,代码部署在,做了LVS负载均衡的两台web服务器,那么问题来了,怎么样保证两台服务器的代码文件和资源文件实时同步呢?

在liux下做文件同步,通常有如下几种方式:

1、nfs实现web数据共享

nfs能实现数据同步是通过NAS(网络附加存储),在服务器上共享一个文件,且服务器需要设置文件系统的权限和配置文件设置的权限,权限两者之间取交集,然后客户端把共享的文件挂载到本地,客户端对文件有读写权限,则实现数据的同步,nfs-utils提供nfs服务.

2、rsync +inotify实现web数据同步

可以镜像保存整个目录树和文件系统
可以同步增量同步数据,文件传输效率高,因而同步时间很短
可以保持原有文件的权限、时间等属性
加密传输数据,保证了数据的安全性
支持匿名传输
rsync也能实现同步,但是需要自己手动的去同步数据,当数据量非常的频繁时,无疑是加大了运维人员的工作,inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,inotify-tools工具的出现,解决了这种工作,安装inotify软件的主机会监听服务器端的主机是否数据和本机不一样,(因为在上传数据时,运维人员先上传到安装inotify主机上),不一样就用rsync命令直接把数据传输过去。客户端安装rsync软件是为了调用rsync的命令,安装inotify软件是监听和数据是否发生改变,服务器端安装rsync软件时为了提供rsync服务。

3、rsync+sersync更快更节约资源实现web数据同步

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。
sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
sersync自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

4、unison+inotify实现web数据双向同步

Unison是一款跨平台的文件同步对象,不仅支撑本地对本地同步,也支撑经由过程SSH、RSH和Socket等收集和谈进行同步。Unison支撑双向同步操纵,你既可以从A同步到B,也可以从B同步到A,这些都不须要额外的设定

只有第四种方案支持双向实时同步,且当其中一台服务器宕机,也不会影响web的访问。

环境部署,有如下两台服务器需要做双向同步:

192.168.10.1是server1
192.168.10.2是server2

第一步,配置ssh key信任,保证两台服务器之间可以通过ssh无密码访问

在server1上创建key并配置server2的信任


ssh-keygen -t rsa

在提示保存私钥(key)和公钥(public key)的位置时,使用默认值;
在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。
之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/root/.ssh/目录下

cd ~/.ssh

ssh "-p 22" 192.168.10.1 cat /root/.ssh/id_rsa.pub >> authorized_keys

ssh "-p 22" 192.168.10.2 cat /root/.ssh/id_rsa.pub >> authorized_keys

scp  -P 22 authorized_keys 192.168.10.2:/root/.ssh/

#分别在server1和server2上操作.

chmod 600 /root/.ssh/authorized_keys
#重启sshd服务
service sshd restart   #server1
service sshd restart   #server2

分别在两台机器上执行如下测试

ssh -p 22 192.168.10.1 date
ssh -p 22 192.168.10.2 date

第一次验证需要输入登陆用户官,如果接着看到直接输出系统时间,至此用户授权完成.

第二两个服务器都编译安装这三个源码包

安装ocaml,版本至少为3.07或更高 下载地址:http://caml.inria.fr/pub/distrib/ocaml-3.10/

tar xf ocaml-3.10.2.tar.gz
cd ocaml-3.10.2
./configure
make world opt
make install
cd ..

安装unison

下载地址:http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.13.16/

tar xvf unison-2.13.16.tar.gz
cd unison-2.13.16
make UISTYLE=text THREADS=true STATIC=true
cp unison /usr/local/bin
cd ..
#UISTYLE=text THREADS=true STATIC=true表示使用命令行方式,加入线程支持以静态模式编译

如果出现类似/usr/bin/ld: cannot find -lxxx  报错提示. 你得先安装扩展:


yum install glibc-static

安装inotify 下载地址:http://inotify-tools.sourceforge.net


tar xvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
cd ..

到此所需的软件都已安装完毕,可以在server1服务器上执行这个命令,来查看两台服务器之间是否可以同步文件,unison -batch /home/server1/ ssh://192.168.10.2//home/server2

touch a.log /home/server1/

第三步,创建.sh脚本来执行同步

1)server1上创建脚本/root/inotify.sh(chmod a+x /root/inotify.sh):

#/bin/bash

ip2="192.168.10.2"

src2="/home/server1/"

dst2="/home/server2/"

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

/usr/local/bin/unison -batch $src2 ssh://$ip2/$dst2

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

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

done

1)server2上创建脚本/root/inotify.sh(chmod a+x /root/inotify.sh):

#/bin/bash

ip1="192.168.10.1"

src1="/home/server2/"

dst1="/home/server1/"

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

/usr/local/bin/unison -batch $src1 ssh://$ip1/$dst1

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

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

done

分别在后台进行监听执行,进行实时同步处理.

nohup /root/inotify.sh &
ps -ef | grep inofity

如果能打印到inotify进程. 至此,双向实时同步工作完成.

相关注解如下:

force表示会以本地所指定文件夹为标准,将该目录同步到远端。这里需要注意,如果指定了force参数,那么Unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步,类似与rsync。

Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。

Unison双向同步的一个缺点是,对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。

ignore = Path表示忽略指定目录,即同步时不同步它。

batch = true,表示全自动模式,接受缺省动作,并执行。

-fastcheck true 表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。

log = true 表示在终端输出运行信息。

logfile 指定输出的log文件。

另外,Unison有很多参数,这里仅介绍常用的几个,详细的请参看Unison手册。

-auto //接受缺省的动作,然后等待用户确认是否执行。

-batch //batch mode, 全自动模式,接受缺省动作,并执行。

-ignore xxx //增加 xxx 到忽略列表中

-ignorecase [true|false|default] //是否忽略文件名大小写

-follow xxx //是否支持对符号连接指向内容的同步

owner = true //保持同步过来的文件属主

group = true //保持同步过来的文件组信息

perms = -1 //保持同步过来的文件读写权限

repeat = 1 //间隔1秒后,开始新的一次同步检查

retry = 3 //失败重试

sshargs = -C //使用ssh的压缩传输方式

xferbycopying = true”

-immutable xxx //不变目录,扫描时可以忽略

-silent //安静模式

-times //同步修改时间

-path xxx 参数 //只同步 -path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。

PS:unison配置文件默认位于当前用户下的.unison目录,默认的配置文件名是default.prf。

最 近做的一个项目,项目上线 ,代码部署在,做了LVS负载均衡的两台web服务器,那么问题来了,怎么样保证两台服务器的代码文件和资源文件实时同步呢?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


*