Linux上Rsync数据同步三部曲

测试环境介绍 Server:192.168.1.147 Client:192.168.1.190服务器和客户端的对应的同步目录都是 /data/test/ 目标:在客户端上指定目录下操作,数据会及时同步到服务器上对应模块的指定目录下版本1.0:单纯使用rsync实现主机间的数据同步 一:Rsync简介rsync,remotesynchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用“rsync算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。

二:服务器端和客户端都需要安装rsync

1:系统包安装(系统默认已经安装,推荐这种方式,本例采用系统包) yuminstallrsync 2:源码安装 http://rsync.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz tarzxvfrsync-3.0.7.tar.gz cdrsync-3.0.7 ./configure–prefix=/usr/local/rsync &make&&makeinstall

三:服务器端配置(客户端无需配置文件)1:编写配置文件。/etc下没有rsyncd.conf这个文件,不过我们可以新建 Vim/etc/rsyncd.conf

[global] #全局配置

uid=nobody

gid=nobody

usechroot=no

timeout=300

port=873 #默认就是873端口,可不写

maxconnections=30 #最大连接数

pidfile=/var/log/rsyncd.pid #运行进程的ID写在那里,可不要

lockfile=/var/run/rsyncd.lock #这个可以不要 logfile=/var/log/rsyncd.log#日志文件写在那里,这个得要

logformat=%t%a%m%f%b#日志的格式 %t 当前时间%a 远程IP地址%m 模块名%f 文件名%b 实际传输的字节数 %u用户名

[backup] #要同步的模块名

path=/data/test #要同步的目录

comment=test #这个名名称无所谓

readonly=no #no客户端可上传文件,yes只读

writeonly=no #no客户端可下载文件,yes不能下载

list=no #是否提供资源列表

ignoreerrors #忽略一些无关的IO错误hostsallow=192.168.1.0/24 #本模块允许通过的IP地址

hostsdeny=* #禁止主机IP

authusers=www#登陆系统使用的用户名,没有默认为匿名。

secretsfile=/etc//rsyncd.secret #密码文件存放的位置

2、设置rsync服务器端同步密钥和同步目录权限;

vi/etc//rsyncd.secret

www:123456 #用户名www:密码123456)

chmod600/etc/rsyncd.secret #更改权限,否则报错

chmod777/data/test-R #修改同步目录权限,否则报错

3:启动与关闭A:daemon方式启动/usr/bin/rsync–daemon–config=/etc/rsyncd.conf 650) this.width=650;” border=”0″ alt=”” src=”http://cdn.verydemo.com/upload/2013_05_01/13673798293210.png” /> 关闭:killpid或者pkillrsyncB:利用xinetd控制rsync启动vim/etc/xinetd.d/rsync(将yes改为no)

650) this.width=650;” border=”0″ alt=”” src=”http://cdn.verydemo.com/upload/2013_05_01/13673798304031.png” />

/etc/init.d/xinetdstart

四:linux客户端配置和测试1:客户端环境配置A:客户端只需要安装并启动rsync,无需配置文件 /usr/bin/rsync–daemon或者/etc/init.d/xinetdstartB:建一个密码文件,只需要些和服务器一样的密码

echo123456>/etc/rsyncd.secretchmod600/etc/rsyncd.secret

2:客户端同步命令 rsync-vzrtopg–delete/data/test/www@192.168.1.147::backup–password-file=/etc/rsyncd.secret

需要解释的参数: -vzrtopg -v 详细模式输出 -z对文件在传输中压缩 -r 对子目录递归模式处理 -t保持文件时间 -p保留权限 -o保留属主 -g保留属组 –delete 删除服务器上以前存在客户端没有的数据

–exclude-from=文件名 排除文件中指定模式的文件,不传送/data/test/ 客户端上需要同步的目录www 服务器上backup模块定义的用户名backup 指定服务器上要接受同步的模块名称

3:最后不妨编写个脚本,在后台执行

cat /root/rsync.sh

nohup sh/root/rsync.sh &

五:总结1:遇到的问题 在配置rsync时,对客户端和服务器端的角色定位不清晰。到底是客户端把数据同步到服务器端,还是把服务器端的数据同步到客户端。按照我的理解是把客户端提交的内容同步到服务器上,但是我在客户端执行同步命令时却发现把服务器端的数据同步到了客户端。我执行的命令如下 rsync-vzrtopg–deletewww@192.168.1.147::backup/data/test/–password-file=/etc/rsyncd.secret 而我理想中的方式应该是:rsync-vzrtopg–delete/data/test/www@192.168.1.147::backup–password-file=/etc/rsyncd.secret

显而易见。rsync与scp的上传下载方式类似,无所谓客户端,服务器端,一台机器可以把本机数据同步到另一台,也可以把另一台指定目录下的数据同步到本地。为了方便就把配置复杂一点(需要编写配置文件)的哪台机器当做服务器端

2:思考 上面的两种方式,个人认为在不同的场景有不同的应用A:服务器端作为备份使用当服务器端做备份时,需要将多个客户端的数据同步到服务器的对应目录中,这时为了减少工作量,把备份服务器作为服务器端,客户端只需要在本地安装rsync,建立密码文件,写个同步脚本把客户端的/data/test/ 同步到服务器端的backup模块下对应的目录

rsync-vzrtopg–delete/data/test/www@192.168.1.147::backup–password-file=/etc/rsyncd.secretB:服务器端做分发时使用

当有一台服务器(svn服务器)需要把数据分发到不同项目对应的服务器上。此时可以吧svn服务器作为服务器端。客户端从服务器端同步对应的数据。

rsync-vzrtopg–deletewww@192.168.1.147::backup/data/test/–password- file=/etc/rsyncd.secret把服务器端backup模块定义的目录内容同步到客户端的 /data/test/目录下 3:rsync的优缺点(摘自抚琴煮酒《构建高可用linux服务器》) rsync在Linux/Unix下是一个比较重要和实用的服务.rsync具有安全性高,备份迅速,支持增量备份等优点,通过rsync可以解决对实时性不高的数据备份需求。但是随着应用系统规模的不断扩大,对数据的安全性和可靠性提出了更好的要求。rsync在高端业务系统中逐渐暴露出很多不足。首先rsync同步数据时需要扫描所有文件后进行对比,然后差量传输,大于大数据这是非常低效的。其次,rsync不能时时的去检测,同步数据。基于以上原因。基于以上原因考虑采用rsync+inotify解决这些问题版本2.0:rsync+inotify实现主机间的数据同步 一:inotify简介Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种事件

二:服务器端客户端都需要安装rsync,inotifyrsync安装及配置参照版本1.0#cd /usr/local/src/#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz#tar xzvf inotify-tools-3.14.tar.gz#cd inotify-tools-3.14#./configure#make#make install出现这个错误“/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0”可以采用以下办法解决:ln -sv /usr/local/lib/libinotify* /usr/lib/ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

三:在客户端编写同步脚本vim /root/rsync.sh #!/bin/bash src=/data/test/ des=backup ip=192.168.1.147 /usr/local/bin/inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f’ -e modify,delete,create,attrib $src | while read file do rsync -vzrtopg –delete –progress $src www@$ip::$des –password-file=/etc/rsyncd.secret && echo "$src was rsyncd"done nohup sh/root/rsync.sh&版本3.0:Sersync实现主机间的数据同步一:Sersync简介Sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:·sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;·安装方便、配置简单;·使用多线程进行同步,能够保证多个服务器实时保持同步状态;·自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;·自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;·自带socket与http协议扩展,你可以方便的进行二次开发;

二:Sersync的安装配置(只需在客户端安装Sersync,) 1:客户端和服务器端分别安装rsync,服务器端(1.147)编辑配置文件,参照版本1.0 2:在客户端安装配置Sersyns wgethttp://sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz tarxzvfsersync2.5_64bit_binary_stable_final.tar.gz mvGNU-Linux-x86/usr/local/sersync 3: 配置文件分析 vim /usr/local/sersync/confxml.xml<?xml version="1.0" encoding="ISO-8859-1"?><head version="2.5"> <hosthostip="localhost" port="8008"></host> #针对插件的保留字段,保留默认即可。 <debugstart="true"/> #在sersync正在运行的控制台,打印inotify,rsync同步命令。 <fileSystemxfs="false"/> #对于xfs文件系统用户,需要将这个选项开启才正常工作. <filterstart="false"> #过滤系统的临时文件,被过滤的文件不会被监控提高 <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify>#inotify监控文件模块, <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/>

<moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> <sersync>#进行数据同步的模块 <localpath watch="/data/test">#监控本地的目录 <remote ip="192.168.1.147" name="backup"/> #远程接受同步的IP和rsync模块名 <!–<remote ip="192.168.8.39" name="tongbu"/>–> <!–<remote ip="192.168.8.40" name="tongbu"/>–> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="true" users="www" passwordfile="/etc/rsyncd.secret"/> #开启用户认证,定义用户名密码 <userDefinedPort start="false" port="874"/><!– port=874 –> <timeout start="false" time="100"/><!– timeout=100 –> <ssh start="false"/> </rsync> <failLogpath="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!–default every 60mins execute once–> <crontabstart="true" schedule="600"><!–600mins–> #每隔600s会做一次完全同步 <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <pluginstart="false" name="command"/>#调用name参数指定的插件。 </sersync> <plugin name="command"> ##插件 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!–prefix /opt/tongbu/mmm.sh suffix–> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin></head>

4:Sersync的应用 A:启动服务 /usr/local/sersync/sersync2 -d -r -n 8 -o /usr/local/sersync/confxml.xml-d 后台启动 -r同步前将已存在的文件全部同步过去 -n开启的线程总数默认10 -o指定配置文件 B:监控Sersync运行状态的脚本,如果服务停止了就重启服务 vim /root/tool/sersync.sh#!/bin/bashSERSYNC="/usr/local/sersync/sersync2"

CONF_FILE="/usr/local/sersync/confxml.xml"

STATUS=$(ps aux |grep ‘sersync2’|grep -v’grep’|wc -l)

if [ $STATUS -eq 0 ];

then

$SERSYNC -d -r -o $CONF_FILE

else

exit 0;

fi

三:测试 在客户端监控的目录/data/test创建文件,然后查看服务器端backup模块对应的目录是否同步更新

参考资料http://book.51cto.com/art/201111/300937.htm 煮酒抚琴http://blog.johntechinfo.com/technology/96 Sersync开发者周洋博客

站在巨人的肩上

别为荒漠的艰难而哭泣,只为奔流入海功成名就那一天,

Linux上Rsync数据同步三部曲

相关文章:

你感兴趣的文章:

标签云: