天天看点

实现web数据同步的四种方式

实现web数据同步的四种方式

=======================================

nfs实现web数据共享

rsync +inotify实现web数据同步

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

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

一、nfs实现web数据共享

<a target="_blank" href="http://blog.51cto.com/attachment/201309/100546182.png"></a>

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

nfs+web:服务器端的配置:

1)、安装相关软件,httpd提供web服务,nfs-utils提供nfs服务

1

<code>[root@jie1 ~]</code><code># yum -y install httpd nfs-utils</code>

2)、设置web的相关配置,使得web能够提供web服务

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>[root@jie1 ~]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>########################################</code>

<code>ServerName 172.16.22.1:80</code>

<code>#DocumentRoot "/var/www/html"   #提供虚拟主机,注释默认存放网页文件的路径</code>

<code>&lt;VirtualHost *:80&gt;</code>

<code>   </code><code>ServerName www.jie.com</code>

<code>   </code><code>DocumentRoot  </code><code>/web/htdocs</code>

<code>&lt;</code><code>/VirtualHost</code><code>&gt;</code>

<code>#######################################</code>

<code>[root@jie1 ~]</code><code># mkdir -pv /web/htdocs   #创建存放网页的目录</code>

<code>[root@jie1 ~]</code><code># cd /web/htdocs/</code>

<code>[root@jie1 htdocs]</code><code># touch index.html test.html test.php</code>

<code>[root@jie1 htdocs]</code><code># ls</code>

<code>index.html  </code><code>test</code><code>.html  </code><code>test</code><code>.php</code>

<code>[root@jie1 htdocs]</code><code># echo "This is Jie1 Web+nfs Server" &gt;index.html</code>

<code>[root@jie1 htdocs]</code><code># httpd -t         #检查web的配置文件是否有语法错误</code>

<code>Syntax OK</code>

<code>[root@jie1 htdocs]</code><code># service httpd start  #开启web服务</code>

<code>Starting httpd:                                            [  OK  ]</code>

3)、设置nfs的相关配置,共享网页文件

20

21

22

<code>[root@jie1 htdocs]</code><code># id apache #安装httpd软件后,系统会创建apache用户,查看apache的id号</code>

<code>uid=48(apache) gid=48(apache) </code><code>groups</code><code>=48(apache)</code>

<code>[root@jie1 htdocs]</code><code># vim /etc/exports</code>

<code>######################################</code>

<code>/web/htdocs</code>  <code>172.16.22.3(rw,</code><code>sync</code><code>,root_squash,anonuid=48,anongid=48)</code>

<code>#nfs是以id号来确定是否能访问共享的文件的,因为两个服务器都安装了httpd软件,都会有apache用户,所以apache用户的id号能访问共享的文件</code>

<code>#/web/htdocs 共享的目录</code>

<code>#172.16.22.3 指定客户端能共享此文件,多个客户端用逗号隔开</code>

<code>#rw,读写权限</code>

<code>#sync,同步方式</code>

<code>#root_squash,压缩root用户的权限</code>

<code>#anonuid=48,指定此用户的id能访问共享文件</code>

<code>#anongid=48指定此组的id能访问共享文件</code>

<code>[root@jie1 htdocs]</code><code># service nfs start  #开启nfs服务</code>

<code>Starting NFS services:                                     [  OK  ]</code>

<code>Starting NFS quotas:                                       [  OK  ]</code>

<code>Starting NFS mountd:                                       [  OK  ]</code>

<code>Stopping RPC idmapd:                                       [  OK  ]</code>

<code>Starting RPC idmapd:                                       [  OK  ]</code>

<code>Starting NFS daemon:                                       [  OK  ]</code>

<code>[root@jie1 htdocs]</code><code>#</code>

web:客户端的配置

1)、安装httpd的软件

<code>[root@jie3 /]</code><code># yum -y install httpd</code>

<code>[root@jie3 /]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>ServerName 172.16.22.3:80</code>

<code>#DocumentRoot "/var/www/html"</code>

<code>   </code><code>DocumentRoot  </code><code>/website</code>   <code>#存放网页文件的路径</code>

<code>[root@jie3 /]</code><code># mkdir /website</code>

<code>[root@jie3 /]</code><code># httpd -t</code>

<code>[root@jie3 /]</code><code># service httpd start</code>

<code>[root@jie3 ~]</code><code># cd /website/</code>

<code>[root@jie3 website]</code><code># ls   #现在查看是没有任何文件</code>

<code>[root@jie3 website]</code><code>#</code>

实现同步:

1)服务器端设置apache用户对共享的文件有读写权限

<code>[root@jie1 htdocs]</code><code>#setfacl -R -m u:apache:rwx /web/ #设置apache用户对此中所有文件有读写可执行权限</code>

2)客户端挂载服务器的共享文件,查看客户端是否已经同步服务器端的文件

<code>[root@jie3 website]</code><code>#cd /root</code>

<code>[root@jie3 ~]</code><code># mount -t nfs 172.16.22.1:/web/htdocs /website/ #通过nfs挂载服务器端的文件</code>

<code>[root@jie3 /]</code><code>#echo "172.16.22.1:/web/htdocs  /website       nfs    defaults,_netdev 0 0" &gt;&gt;/etc/fstab  #实现开机挂载</code>

<code>[root@jie3 website]</code><code># ls  #查看文件已经同步过来</code>

3)客户端在共享的文件中新增文件,查看服务器端是否同步文件

<code>[root@jie3 website]</code><code># ls</code>

<code>[root@jie3 website]</code><code># touch website.html  #在客户端创建此文件</code>

<code>index.html  </code><code>test</code><code>.html  </code><code>test</code><code>.php  website.html</code>

<code>[root@jie1 htdocs]</code><code># ls  #服务器端,可以查看来着客户端上传的文件</code>

     所有的数据其实都保存到了nfs服务器,不论用户访问哪台Web服务器,都要来nfs服务器获取数据,这样势必照成nfs服务器的性能下降,而且客户端对nfs服务器的依赖性较大,如果nfs服务器down掉之后,客户端的web服务器就无法工作了。(动态的那种数据,而且数据量很大的数据,就不要用nfs服务器来实现数据共享了,一般适应于,静态页面和数据较小的文件)

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

<a target="_blank" href="http://blog.51cto.com/attachment/201309/114946392.png"></a>

rsync(remote sync)的特性:

   可以镜像保存整个目录树和文件系统

   可以同步增量同步数据,文件传输效率高,因而同步时间很短

   可以保持原有文件的权限、时间等属性

   加密传输数据,保证了数据的安全性

   支持匿名传输

         rsync也能实现同步,但是需要自己手动的去同步数据,当数据量非常的频繁时,无疑是加大了运维人员的工作,inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,inotify-tools工具的出现,解决了这种工作,安装inotify软件的主机会监听服务器端的主机是否数据和本机不一样,(因为在上传数据时,运维人员先上传到安装inotify主机上),不一样就用rsync命令直接把数据传输过去。客户端安装rsync软件是为了调用rsync的命令,安装inotify软件是监听和数据是否发生改变,服务器端安装rsync软件时为了提供rsync服务。

rsync+web服务端的配置:

1)、安装相关软件

<code>[root@jie1 ~]</code><code># yum -y install rsync xinetd httpd</code>

<code>#rsync服务通常基于超级守护进程xinetd管理的方式来实现,因此需要事先安装rysnc和xinetd</code>

2)、web的相关配置,使得web能够提供服务

<code>[root@jie1 ~]</code><code># mkdir -pv /web/htdocs</code>

<code>[root@jie1 ~]</code><code># cd /web/htdocs   #服务器端,没有任何的网页文件</code>

<code>[root@jie1 ~]</code><code># ls</code>

<code>[root@jie1 ~]</code><code>#</code>

3)、rsync服务的相关配置

*****建立rsync的配置文件和密码文件************

       touch /etc/rsyncd.conf(rsync的配置文件)

       touch /etc/rsyncd.pwd(用户的密码文件)  

       chmod 600 /etc/rsyncd.pwd(权限要设置为600,否则无法备份成功)

23

24

25

26

27

28

29

30

31

32

<code>[root@jie1 ~]</code><code># vim /etc/rsyncd.conf</code>

<code>############vim /etc/rsyncd.conf########################################</code>

<code>uid = nobody                    </code><code>#备份以什么身份进行,用户ID</code>

<code>gid = nobody                    </code><code>#备份以什么身份进行,组ID</code>

<code>use chroot = no                 </code><code>#禁锢在源目录</code>

<code>max connections = 3             </code><code>#最大连接数,0代表没有限制</code>

<code>strict modes = </code><code>yes</code>              <code>#是否检查口令文件的权限</code>

<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid  </code><code>#运行进程的pid文件</code>

<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log  </code><code>#日志记录文件</code>

<code>[htdocs]                        </code><code>#指定认证的备份模块名</code>

<code>path = </code><code>/web/htdocs</code>              <code>#需要备份的目录的路径</code>

<code>ignore errors = </code><code>yes</code>             <code>#忽略一些无关的IO错误</code>

<code>read</code> <code>only = no                  </code><code>#设置为no,即可以传至服务器的相应目录。</code>

<code>write only = no                 </code><code>#设置为no,表示客户端可以下载文件</code>

<code>hosts allow = 172.16.22.3       </code><code>#可以连接rsync服务器的主机的IP地址</code>

<code>hosts deny = *                  </code><code>#设置禁止连接rsync服务器的主机地址,*表示  拒绝所有除了hosts allow定义的</code>

<code>uid = root</code>

<code>gid = root</code>

<code>auth </code><code>users</code> <code>= backuper            </code><code>#连接模块的用户名</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.</code><code>pwd</code>   <code>#连接模块用户名的密码文件存放路径</code>

<code>#####################################################################</code>

<code>[root@jie1 ~]</code><code>#vim  /etc/rsyncd.pwd  #用户的密码文件</code>

<code>backuper:pwd123        </code><code>#用户名:密码</code>

<code>[root@jie1 ~]</code><code># chmod 600  /etc/rsyncd.pwd   #权限给600</code>

<code>[root@jie1 ~]</code><code># chkconfig rsync on</code>

<code>[root@jie1 ~]</code><code># chkconfig xinetd on</code>

<code>[root@jie1 ~]</code><code># service  xinetd start</code>

<code>Starting xinetd:                                           [  OK  ]</code>

<code>[root@jie1 ~]</code><code># netstat -pant | grep 873</code>

<code>tcp        0      0 :::873                      :::*                        LISTEN      19876</code><code>/xinetd</code>

rsync+inotify+web客户端的配置:

1)、inotify-tools软件的安装及设置

<code>[root@jie3 ~]</code><code>#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz             #下载inotify-tools软件</code>

<code>[root@jie3 ~]</code><code># ls</code>

<code>anaconda-ks.cfg            </code><code>install</code><code>.log   </code>

<code>inotify-tools-3.14.</code><code>tar</code><code>.gz  </code><code>install</code><code>.log.syslog</code>

<code>[root@jie3 ~]</code><code># tar xf inotify-tools-3.14.tar.gz          #解压软件</code>

<code>[root@jie3 ~]</code><code># cd inotify-tools-3.14</code>

<code>[root@jie3 inotify-tools-3.14]</code><code># ./configure --prefix=/usr/local/inotify &amp;&amp; make &amp;&amp; make install                 #编译安装软件</code>

<code>[root@jie3 ~]</code><code>#cd /usr/local/inotify/</code>

<code>[root@jie3 inotify]</code><code># echo "PATH=/usr/local/inotify/bin:$PATH" &gt;&gt;/etc/profile.d/inotify.sh             #设置能与系统关联的path路径</code>

<code>[root@jie3 inotify]</code><code># source /etc/profile.d/inotify.sh</code>

<code>[root@jie3 inotify]</code><code># echo "/usr/local/inotify/lib" &gt;/etc/ld.so.conf.d/inotify.conf         #设置系统能识别软件的库文件</code>

<code>[root@jie3 inotify]</code><code># ldconfig -v | grep inotify</code>

<code>/usr/local/inotify/lib</code><code>:</code>

<code>    </code><code>libinotifytools.so.0 -&gt; libinotifytools.so.0.4.1</code>

<code>[root@jie3 inotify]</code><code># ln -sv /usr/local/inotify/include/ /usr/include/inotify                      #链接头文件到系统能识别的路径下</code>

<code>`</code><code>/usr/include/inotify</code><code>' -&gt; `/usr/local/inotify/include/'</code>

<code>[root@jie3 inotify]</code><code>#</code>

<code>   </code><code>DocumentRoot  </code><code>/website</code>

<code>[root@jie3 website]</code><code>#  ls</code>

<code>[root@jie3 ~]</code><code>#</code>

3)、配置能连接rsync的密码文件和传输数据的脚本

<code>[root@jie3 ~]</code><code># vim /etc/rsyncd.pwd</code>

<code>#############################################</code>

<code>pwd123  </code><code>#密码与rsync服务器的密码相同</code>

<code>###############################################</code>

<code>[root@jie3 ~]</code><code># chmod 600 /etc/rsyncd.pwd</code>

<code>[root@jie3 ~]</code><code># vim  rsync.sh</code>

<code>#!/bin/bash</code>

<code>host=172.16.22.1</code>

<code>src=</code><code>/website</code>

<code>des=htdocs</code>

<code>inotifywait -mrq --timefmt </code><code>'%d/%m/%y %H:%M'</code> <code>--</code><code>format</code> <code>'%T %w%f%e'</code> <code>-e modify,delete,create,attrib $src \</code>

<code>| </code><code>while</code> <code>read</code> <code>files</code>

<code>  </code><code>do</code>

<code>/usr/bin/rsync</code> <code>-vzrtopg  --progress --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.secrets $src backuper@$host::$des</code>

<code>echo</code> <code>"${files} was rsynced"</code> <code>&gt;&gt;</code><code>/tmp/rsync</code><code>.log 2&gt;&amp;1</code>

<code>done</code>

<code>####################################################################</code>

验证实现同步:

<code>##1、先开启监控的脚本(inotify主机上)</code>

<code>[root@jie3 ~]</code><code># bash -x rsync.sh &amp;</code>

<code>#不放在后台可以查看同步的详细过程,生成环境中,建议把此脚本放到后台执行,此脚本会监控客户端数据是否方式变化,如果变化脚本就运行,数据不变化,脚本就会等待着用户的输入</code>

<code>##2、在开一个终端,在此目录创建文件(inotify主机上)</code>

<code>[root@jie3 website]</code><code># touch index.html test.php testdb.php  inotify.php</code>

<code>index.html  testdb.php  </code><code>test</code><code>.php inotify.php</code>

<code>##3、看服务器端,数据是否已经同步过去</code>

<code>index.html  testdb.php  </code><code>test</code><code>.php inotify.php  </code><code>#数据已经被同步过来</code>

    rsync +inotify这种能实现数据的同步,但是当网络很繁忙,且文件变化比较频繁时,而且需要同步的rsync服务器端比较多时,rsync+inotify肯定是满足不了需求的,于是rsync+sersync这种更快更节约资源实现web数据同步可以弥补rsync+inotify带来的不足,rsync+inotify还有一个重大的缺点就是数据传输只是单向的,当运维人员由于“粗心”把数据直接传输rsync服务器端时,inotify主机是得不到rsync服务器端的数据,于是unison+inotify实现web数据双向同步,解决了rsync+inotify的这一缺点。

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

<a target="_blank" href="http://blog.51cto.com/attachment/201309/184041577.png"></a>

 sersync与inotify相比有以下优点:

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

   sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。

   sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。

   sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。

    sersync自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

rsync+web服务器端的配置:

<code>ServerName www.jie.com</code>

<code>DocumentRoot  </code><code>/web/htdocs</code>

<code>###====此配置文件的解释,在rsync+inotify中已经解释了=====####</code>

<code>############vim /etc/rsyncd.conf###############</code>

<code>uid = nobody</code>

<code>gid = nobody</code>

<code>use chroot = no</code>

<code>max connections = 3</code>

<code>strict modes = </code><code>yes</code>

<code>pid </code><code>file</code><code>= </code><code>/var/run/rsyncd</code><code>.pid</code>

<code>log </code><code>file</code><code>= </code><code>/var/log/rsyncd</code><code>.log</code>

<code>[htdocs]</code>

<code>path = </code><code>/web/htdocs</code>

<code>ignore errors = </code><code>yes</code>

<code>readonly</code> <code>= no</code>

<code>write only = no</code>

<code>hosts allow = 172.16.22.3</code>

<code>hosts deny = *</code>

<code>list = </code><code>false</code>

<code>auth </code><code>users</code><code>= backuper</code>

<code>secrets </code><code>file</code><code>= </code><code>/etc/rsyncd</code><code>.</code><code>pwd</code>

<code>##############################################</code>

<code>[root@jie1 ~]</code><code>#vim /etc/rsyncd.pwd</code>

<code>backuper:pwd123</code>

<code>[root@jie1 ~]</code><code># chmod 600 /etc/rsyncd.pwd</code>

sersync+web客户端的配置:

1)、先下载安装sersync软件,做初始设置

<code>[root@jie3 ~]</code><code>#wget --no-check-certificate https://sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz</code>

<code>anaconda-ks.cfg  </code><code>install</code><code>.log.syslog</code>

<code>install</code><code>.log      sersync2.5_64bit_binary_stable_final.</code><code>tar</code><code>.gz</code>

<code> </code><code>mkdir</code> <code>/usr/local/sersync</code>

<code>[root@jie3 ~]</code><code>#mkdir -pv /usr/local/sersync/{conf,bin,log}</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/conf</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/bin</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/log</code><code>'</code>

<code>[root@jie3 ~]</code><code># tar xf sersync2.5_64bit_binary_stable_final.tar.gz</code>

<code>[root@jie3 ~]</code><code># cd GNU-Linux-x86/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># ls</code>

<code>confxml.xml  sersync2</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># mv confxml.xml /usr/local/sersync/conf/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># mv sersync2  /usr/local/sersync/bin/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># cd /usr/local/sersync/</code>

<code>[root@jie3 sersync]</code><code># echo "PATH=/usr/local/sersync/bin:$PATH" &gt;&gt;/etc/profile.d/sersync.sh</code>

<code>[root@jie3 sersync]</code><code># source /etc/profile.d/sersync.sh</code>

<code>[root@jie3 sersync]</code><code># echo "pwd123" &gt;/usr/local/sersync/sersync.pwd</code>

<code>[root@jie3 sersync]</code><code># chmod 600 /usr/local/sersync/sersync.pwd</code>

2)、修改sersync的配置文件

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

<code>[root@jie3 sersync]</code><code># vim /usr/local/sersync/conf/confxml.xml</code>

<code>#########################################################################&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</code>

<code>&lt;</code><code>head</code> <code>version=</code><code>"2.5"</code><code>&gt;</code>

<code>  </code><code>#设置本地的ip地址和监听的端口</code>

<code>    </code><code>&lt;host hostip=</code><code>"172.16.22.3"</code> <code>port=</code><code>"8008"</code><code>&gt;&lt;</code><code>/host</code><code>&gt;</code>

<code>  </code><code>#debug模式是否开启</code>

<code>    </code><code>&lt;debug start=</code><code>"false"</code><code>/&gt;</code>

<code>  </code><code>#xfs文件系统是否开启</code>

<code>    </code><code>&lt;fileSystem xfs=</code><code>"false"</code><code>/&gt;</code>

<code>  </code><code>#同步时,是否支持正则表达式,默认关闭</code>

<code>    </code><code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"(.*)\.svn"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"(.*)\.gz"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"^info/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"^static/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/filter</code><code>&gt;</code>

<code>  </code><code># 设置要监控的事件</code>

<code>    </code><code>&lt;inotify&gt;</code>

<code>    </code><code>&lt;delete start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;createFolder start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;createFile start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;closeWrite start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;moveFrom start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;moveTo start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;attrib start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;modify start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/inotify</code><code>&gt;</code>

<code>  </code><code>#同步的设置</code>

<code>    </code><code>&lt;sersync&gt;</code>

<code>  </code><code>#同步的路径,本地的目录</code>

<code>    </code><code>&lt;localpath </code><code>watch</code><code>=</code><code>"/website"</code><code>&gt;</code>

<code>  </code><code>#rsync服务器的ip地址和rsync配置文件里面定义的模块</code>

<code>        </code><code>&lt;remote ip=</code><code>"172.16.22.1"</code> <code>name=</code><code>"htdocs"</code><code>/&gt;</code>

<code>  </code><code>#&lt;!-- --&gt;括起来表示注释</code>

<code>        </code><code>&lt;!--&lt;remote ip=</code><code>"192.168.8.39"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>        </code><code>&lt;!--&lt;remote ip=</code><code>"192.168.8.40"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>    </code><code>&lt;</code><code>/localpath</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>rsync</code><code>&gt;</code>

<code>  </code><code>#rsync指令参数</code>

<code>        </code><code>&lt;commonParams params=</code><code>"-artuz"</code><code>/&gt;</code>

<code>  </code><code>#rsync同步认证设置的内容,user指定用户名,password指定存放密码的文件路径</code>

<code>        </code><code>&lt;auth start=</code><code>"true"</code> <code>users</code><code>=</code><code>"backuper"</code> <code>passwordfile=</code><code>"/usr/local/sersync/sersync.pwd"</code><code>/&gt;</code>

<code>  </code><code>#设置rsync远程服务端口</code>

<code>        </code><code>&lt;userDefinedPort start=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/&gt;&lt;!-- port=874 --&gt;</code>

<code>  </code><code>#设置超时时间</code>

<code>       </code><code>&lt;timeout start=</code><code>"true"</code> <code>time</code><code>=</code><code>"100"</code><code>/&gt;&lt;!-- timeout=100 --&gt;</code>

<code>  </code><code>#设置ssh加密传输模式,默认关闭</code>

<code>        </code><code>&lt;</code><code>ssh</code> <code>start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/rsync</code><code>&gt;</code>

<code>  </code><code>#设置sersync传输失败日志脚本路径</code>

<code>    </code><code>&lt;failLog path=</code><code>"/tmp/rsync_fail_log.sh"</code> <code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--default every 60mins execute once--&gt;</code>

<code>  </code><code>#设置rsync+crontab定时传输,默认关闭</code>

<code>    </code><code>&lt;</code><code>crontab</code> <code>start=</code><code>"false"</code> <code>schedule=</code><code>"600"</code><code>&gt;&lt;!--600mins--&gt;</code>

<code>        </code><code>&lt;crontabfilter start=</code><code>"false"</code><code>&gt;</code>

<code>        </code><code>&lt;exclude expression=</code><code>"*.php"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>        </code><code>&lt;exclude expression=</code><code>"info/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>/crontabfilter</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/crontab</code><code>&gt;</code>

<code>  </code><code>#设置sersync传输后调用name指定的插件脚本,默认关闭</code>

<code>    </code><code>&lt;plugin start=</code><code>"false"</code> <code>name=</code><code>"command"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/sersync</code><code>&gt;</code>

<code>  </code><code>#插件脚本范例</code>

<code>    </code><code>&lt;plugin name=</code><code>"command"</code><code>&gt;</code>

<code>    </code><code>&lt;param prefix=</code><code>"/bin/sh"</code> <code>suffix=</code><code>""</code> <code>ignoreError=</code><code>"true"</code><code>/&gt;    &lt;!--prefix </code><code>/opt/tongbu/mmm</code><code>.sh suffix--&gt;</code>

<code>        </code><code>&lt;include expression=</code><code>"(.*)\.php"</code><code>/&gt;</code>

<code>        </code><code>&lt;include expression=</code><code>"(.*)\.sh"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/plugin</code><code>&gt;</code>

<code>&lt;</code><code>/head</code><code>&gt;</code>

<code>#######################################################################</code>

<code>###sersync客户端的,开启同步机制,进行监控,然后创建文件</code>

<code>[root@jie3 website]</code><code># sersync2 -r -d &amp;</code>

<code>[root@jie3 website]</code><code># touch index.html  testdb.php  test.html  test.php</code>

<code>###rsync服务器端,查看可以来着sersync客户端的同步文件</code>

<code>index.html  testdb.php  </code><code>test</code><code>.html  </code><code>test</code><code>.php</code>

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

Unison是一款跨平台的文件同步对象,不仅支撑本地对本地同步,也支撑经由过程SSH、RSH和Socket等收集和谈进行同步。

 Unison支撑双向同步操纵,你既可以从A同步到B,也可以从B同步到A,这些都不须要额外的设定。

1)、两个服务器都编译安装这三个源码包:(在此我只写一台服务器的编译安装过程)

<code>[root@jie1 ~]</code><code>#wget ftp://distro.ibiblio.org/slitaz/sources/packages-2.0/o/ocaml-3.10.2.tar.gz</code>

<code>[root@jie1~]</code><code>#wget  http://freebsd.ntu.edu.tw/FreeBSD/ports/distfiles/unison-2.32.52/unison-2.32.52.tar.gz</code>

<code>[root@jie1~]</code><code>#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz</code>

<code>anaconda-ks.cfg            </code><code>install</code><code>.log         ocaml-3.10.2.</code><code>tar</code><code>.gz</code>

<code>inotify-tools-3.14.</code><code>tar</code><code>.gz  </code><code>install</code><code>.log.syslog  unison-2.32.52.</code><code>tar</code><code>.gz</code>

<code>[root@jie1 ~]</code><code># tar xf inotify-tools-3.14.tar.gz</code>

<code>[root@jie1 ~]</code><code># tar xf ocaml-3.10.2.tar.gz</code>

<code>[root@jie1 ~]</code><code># tar xf unison-2.32.52.tar.gz</code>

<code>##编译安装inotify</code>

<code>[root@jie1 ~]</code><code># cd inotify-tools-3.14</code>

<code>[root@jie1 inotify-tools-3.14]</code><code># ./configure --prefix=/usr/local/inotify &amp;&amp; make &amp;&amp; make install</code>

<code>[root@jie1 inotify-tools-3.14]</code><code># cd /usr/local/inotify/</code>

<code>##修改PATH环境变量</code>

<code>[root@jie1 inotify]</code><code># echo "PATH=/usr/local/inotify/bin:$PATH" &gt;/etc/profile.d/inotify.sh</code>

<code>[root@jie1 inotify]</code><code># source /etc/profile.d/inotify.sh</code>

<code>##添加库文件到系统识别的路径</code>

<code>[root@jie1 inotify]</code><code># echo "/usr/local/inotify/lib" &gt;/etc/ld.so.conf.d/inotify.conf</code>

<code>[root@jie1 inotify]</code><code># ldconfig -v | grep inotify</code>

<code>##链接库文件到系统识别的路径</code>

<code>[root@jie1 inotify]</code><code># ln -sv /usr/local/inotify/include/ /usr/include/inotify</code>

<code>##编译安装ocaml,unison依赖于ocaml</code>

<code>[root@jie1 inotify]</code><code>#cd /root/ocaml-3.10.2</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#./configure</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#make world opt</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#make install</code>

<code>##编译安装unison</code>

<code>[root@jie1 ocaml-3.10.2]</code><code># cd /root/unison-2.32.52</code>

<code>##安装依赖性包</code>

<code>[root@jie1 unison-2.32.52]</code><code>#yum -y install ctags-etags</code>

<code>[root@jie1 unison-2.32.52]</code><code># make UISTYLE=text</code>

<code>##make install会提示错误,此错误就是要你cp unison /usr/local/bin,复制即可</code>

<code>[root@jie1 unison-2.32.52]</code><code># make install</code>

<code>[root@jie1 unison-2.32.52]</code><code># cp unison /usr/local/bin</code>

2)、服务器A生成的公钥传到服务器B上:

<code>##把服务器A生成的公钥传到服务器B上####</code>

<code>[root@jie1 ~]</code><code># ssh-keygen -t rsa   #生成ssh的密钥对</code>

<code>[root@jie1 ~]</code><code># scp ~/.ssh/id_rsa.pub  172.16.22.3:/root  #生成的密钥在家目录的ssh文件中,ssh文件为隐藏文件,通过scp复制到服务器B上</code>

<code>[root@jie3 ~]</code><code># mv id_rsa.pub .ssh/authorized_keys  #在服务器B上把服务器A传来的公钥文件改名并存放到ssh目录下</code>

<code>[root@jie3 ~]</code><code># chmod 600 .ssh/authorized_keys  #给公钥文件改权限为600</code>

<code>[root@jie1 ~]</code><code># service sshd restart  #重启sshd服务</code>

<code>Stopping sshd:                                             [  OK  ]</code>

<code>Starting sshd:                                             [  OK  ]</code>

3)、服务器B生成的公钥传到服务器A上:

<code>##把服务器B生成的公钥传到服务器A上####</code>

<code>[root@jie3 ~]</code><code># ssh-keygen -t rsa   #生成ssh的密钥对</code>

<code>[root@jie3 ~]</code><code># scp ~/.ssh/id_rsa.pub  172.16.22.1:/root  #生成的密钥在家目录的ssh文件中,ssh文件为隐藏文件,通过scp复制到服务器B上</code>

<code>[root@jie1 ~]</code><code># mv id_rsa.pub .ssh/authorized_keys  #在服务器A上把服务器B传来的公钥文件改名并存放到ssh目录下</code>

<code>[root@jie1 ~]</code><code># chmod 600 .ssh/authorized_keys  #给公钥文件改权限为600</code>

<code>[root@jie3 ~]</code><code># service sshd restart  #重启sshd服务</code>

4)、分别搭建web服务,服务器A的网页文件存放路径为/web/htdocs,服务器B的网页存放路径为/website

<code>##服务器A搭建web的配置</code>

<code>[root@jie1 /]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>##服务器B搭建web的配置</code>

5)、编unison同步的脚本进行测试

<code>##服务器A的脚本</code>

<code>[root@jie1 ~]</code><code># vim serA.sh</code>

<code>######################################################################</code>

<code>#/bin/bash</code>

<code>ipB=</code><code>"172.16.22.3"</code>

<code>srcA=</code><code>"/web/htdocs"</code>

<code>dstB=</code><code>"/website"</code>

<code>/usr/local/inotify/bin/inotifywait</code> <code>-mrq -e create,delete,modify,move $srcA | </code><code>while</code> <code>read</code> <code>line; </code><code>do</code>

<code>/usr/local/bin/unison</code> <code>-batch $srcA </code><code>ssh</code><code>:</code><code>//</code><code>$ipB/$dstB</code>

<code>echo</code> <code>-n </code><code>"$line "</code> <code>&gt;&gt; </code><code>/var/log/inotify</code><code>.log</code>

<code>echo</code> <code>`</code><code>date</code> <code>| </code><code>cut</code> <code>-d </code><code>" "</code> <code>-f1-4` &gt;&gt; </code><code>/var/log/inotify</code><code>.log</code>

<code>##服务器B的脚本</code>

<code>[root@jie3 ~]</code><code># vim serB.sh</code>

<code>ipA=</code><code>"172.16.22.1"</code>

<code>srcB=</code><code>"/website"</code>

<code>dstA=</code><code>"/web/htdocs"</code>

<code>/usr/local/inotify/bin/inotifywait</code> <code>-mrq -e create,delete,modify,move $srcB | </code><code>while</code> <code>read</code> <code>line; </code><code>do</code>

<code>/usr/local/bin/unison</code> <code>-batch $srcB </code><code>ssh</code><code>:</code><code>//</code><code>$ipA/$dstA</code>

<code>##服务器A的测试</code>

<code>[root@jie1 ~]</code><code># sh -x serA.sh  #先运行unison同步脚本,查看过程</code>

<code>[root@jie1 htdocs]</code><code># touch serA.txt SerA.html SerA.php  #然后创建文件</code>

<code>SerA.html  SerA.php  serA.txt  SerB.html  SerB.php  SerB.txt</code>

<code>##服务器B的测试</code>

<code>[root@jie3 ~]</code><code># sh -x serB.sh</code>

<code>[root@jie3 website]</code><code># touch SerB.txt SerB.html SerB.php</code>

<code>###=====可以把脚本设置开机自启,放到rc.local文件中,且放在后台运行</code>

本文转自 jie783213507 51CTO博客,原文链接:http://blog.51cto.com/litaotao/1286871,如需转载请自行联系原作者