阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用rsync进行主机间数据同步

137次阅读
没有评论

共计 5009 个字符,预计需要花费 13 分钟才能阅读完成。

前言

首先,还是先提一下我使用数据同步的一个背景:

公司的电脑是 windows 7 系统,一般程序开发在本地机器进行,代码开发完之后,需要同步到远程 linux 编译机上编译。

之前使用 eclipse 时的同步方案:通过 samba 将 linux 主机的项目目录映射到 windows 主机的一个系统盘 J 上,然后通过一个 eclipse 的数据同步插件将本地项目目录同步到系统盘 J 上。

后面通过 Babun(《在 Windows 上使用 Babun 进行 Linux 开发工作》)用上 vim 之后,没有找到数据同步的 vim 插件,于是需要寻找其他数据同步的方案。

为什么不直接在 samba 映射的目录下进行开发呢?

  • 开发目录的读写、变动比较大,直接在该目录下开发的话,由于网络原因,速度非常慢,经常出现卡死的情况。
  • 映射过来的目录是编译机上的目录,存在许多编译产生的中间文件,这些文件对开发目录来说是一个很大的负担。

总结以上,我需要的是以下的一个同步机制:

  • 开发目录与编译目录独立(也就是不能直接在 samba 映射的目录下开发);
  • 开发目录的变动同步到编译目录,而编译目录的变动不会同步带开发目录,即单向同步。

rsync

rsync,remote synchronize。顾名思意,它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync 是用“rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过 ssh 方式来传输文件,这样其保密性也非常好。

rsync 包括如下的一些特性:

  • 能更新整个目录和树和文件系统;
  • 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  • 对于安装来说,无任何特殊权限要求;
  • 对于多个文件来说,内部流水线减少文件等待的延时;
  • 能用 rsh、ssh 或直接端口做为传输入端口;
  • 支持匿名 rsync 同步文件,是理想的镜像工具;

rsync 安装与配置

首先可以先看看你的系统中是否已经安装了 rsync:

$ rsync

如果没有安装的话,可通过包管理器或者源码安装。

安装完毕之后,就是软件的配置了。

下面我们假设:

  • 主服务器端(master),向从服务器端(slave)同步数据;
  • master 端 IP 地址:192.168.1.39(模块名为 node1);
  • slave 端 IP 地址:192.168.1.40 (模块名为 node2)。

master 配置

由于是单向同步,所以 master 不需要做特殊的配置,只要安装 rsync 就可以了。

slave 配置

在 /etc 目录下创建 rsyncd.conf,配置如下:

uid = root 
gid = root 
pid file = /var/run/rsyncd.pid  #pid 文件的存放位置 
lock file = /var/run/rsync.lock # 锁文件的存放位置 
log file = /var/log/rsyncd.log  # 日志记录文件的存放 

[node2]                         # 模块名字,自己命名 
path = /data/node2              # 指定文件目录所在位置,这是必须指定 
read only = no
list = no                       # 是否把 rsync 服务器上提供同步数据的目录显示 
hosts allow = 192.168.1.39      # 允许访问的主机 
hosts deny = *                  # 拒绝访问的主机 

这是比较简单的配置,如果需要认证,则需要指定 rsync.passwd 文件。

测试

启动 rsync:

$ mkdir -p /data/node2 
$ rsync --daemon 
$ ps -ef | grep rsync| grep -v "grep" 
root      1723    1  0 22:17 ?        00:00:00 rsync --daemon 
$ netstat -anpt | grep rsync 
tcp        0      0 0.0.0.0:873                0.0.0.0:*                  LISTEN      1723/rsync          
tcp        0      0 :::873                      :::*                        LISTEN      1723/rsync

在 slave 上创建同步目录:

$ cd /data/node2/ 
$ echo "123456">a.txt 
$ echo "abcd">b.txt  
$ cat a.txt b.txt  
123456 
abcd 

在 master 上创建同步目录,并将 slave 上的 node2 模块同步到 /data/node1/ 目录下:

$ mkdir -p /data/node1 
$ rsync -avzP 192.168.1.40::node2 /data/node1/ 
receiving incremental file list 
./ 
a.txt 
          7 100%    6.84kB/s    0:00:00 (xfer#1, to-check=1/3) 
b.txt 
          5 100%    0.12kB/s    0:00:00 (xfer#2, to-check=0/3) 

sent 68 bytes  received 180 bytes  23.62 bytes/sec
total size is 12  speedup is 0.05 
$ cd /data/node1/ 
$ ls 
a.txt  b.txt 
$ cat a.txt b.txt  
123456 
abcd

以上是将 slave 的 node2 模块对应的目录同步到 master 的目录下,如果要将 master 的目录同步到 slave 的 node2 模块对应的目录下,则使用以下命令:

$ rsync -avzP /data/node1/ 192.168.1.40::node2

以上完成后,我们就可以进行同步了,为了方便,我们可以把同步命令写成一个脚本。rsync 有一些配置参数,可以直接输入命令 rsync 来查看。比如–delete 选项表示,会同步删除的文件,比如源主机没有文件 a,而目标主机有,则文件 a 将会从目标主机上删除。

如果你不需要实时性,则可以在每次需要同步的时候,手动运行一下该脚本。

如果你需要实时性,但不需要特别强,则可以使用 crontab 设置一个定时任务来自动同步。

如果你需要很强的实时性,则需要 inotify 的支持。

inotify

使用 inotify 之后,只要文件有任何变动,就会触发 inotify,因此 inotify 基本可以达到实时的效果。

inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。

inotify 安装完成之后会有两个命令,inotifywait 和 inotifywatch。inotifywait 用于等待文件或者文件集上的一个特定事件,可以监控任何文件或者目录位置,并且可以递归地监控整个目录树;inotifywatch 用于收集被监控的文件系统统计数据,包括每个 inotify 事件发生多少次等信息。

安装

$ cd /tmp  
$ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz --no-check-certificate  
$ tar zxvf inotify-tools-3.14.tar.gz  
$ cd inotify-tools-3.14  
$ ./configure&&make&&make install  


$ ln -sv /usr/local/lib/libinotify* /usr/lib/  
$ ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0  

以上安装的是 linux 版本的,如果你是 windows 系统,可以安装 inotify-win(https://github.com/thekid/inotify-win)。

编写测试脚本

#!/bin/bash  

src=/tmp/test/  # directory to monitor  
/usr/local/bin/inotifywait -rmq -e modify $src |  while read  event  
do  
echo "hello" >> 1.txt  
done  

做成开机启动

$ chmod u+x /tmp/mon.sh  
$ echo "nohup /bin/bash /tmp/mon.sh &" >> /etc/rc.d/rc.local  
$ nohup /bin/bash /tmp/mon.sh &  

这时候只要 /tmp/test/ 一有改动,就会触发 inotifywait,运行 echo 命令。

同步脚本

#!/bin/bash 
host=192.168.1.40 
data_dir=/data/node1/
dst=node2 
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files 
do
  #rsync -avzP $host::$dst $data_dir 
  rsync -avzP --delete --progress $data_dir $host::$dst 
  echo "${files} was rsynced" >> /tmp/rsync.log 2>&1  
done

以上让 inotifywait 监听 /data/node1/ 目录,当监听到有发生 modify,create,delete,attrib 等事件发生时,按 %T %w%f%e 的格式输出。

inotifywait 的输出结果,作为 while read files 的输入。这里的脚本比较粗糙,因为每次有文件改动,inotifywait 就会输出一行,改行表示有改动的文件。之后执行 do 和 done 之间的操作,调用 rsync 进行同步(全目录扫描,而不是只同步单个文件)。因此如果有 10 个文件改动,rsync 将会被调用 10 次,从而造成性能上的损耗。因此对于有兴趣的同学,可以想想如何优化这个脚本,以获得更高的同步性能。

$ chmod u+x inotify_rsync.sh  
$ bash inotify_rsync.sh & 
[1] 4533 
$ ps -ef | grep inoti | grep -v "grep" 
root      4533  1880  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh 
root      4534  4533  0 18:02 pts/1    00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e modify,delete,create,attrib /data/node1/
root      4535  4533  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh

inotifywait 的一些参数可能根据系统有所不同,请通过 inotifywait 命令查阅下相关参数及其意义。

总结

rsync 为我们提供了一个很好的文件同步方案,在不同的应用场景下,我们对实时性的要求不一,因此可以根据自己的需要选择对应的同步方式。在大多数情况下 rsync+inotify 是足够了的,当然,当同步的文件比较大的时候,可以选择 lsyncd 等更合适的方案。

RSync 实现文件备份同步详解   http://www.linuxidc.com/Linux/2014-09/106967.htm

利用 inotifywait 监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用 inotify+rsync 实现 Linux 文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync 实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

rsync 同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

CentOS 6.5 下 Rsync 远程同步 http://www.linuxidc.com/Linux/2014-05/101084.htm

Linux 文件夹对比并提取的差分文件技巧 -rsync 的妙用 http://www.linuxidc.com/Linux/2016-02/128307.htm

Rsync 的详细介绍 :请点这里
Rsync 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/136819.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5009字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中