Linux运维 第三阶段 (十四)rsync

  1. 云栖社区>
  2. 博客>
  3. 正文

Linux运维 第三阶段 (十四)rsync

技术小阿哥 2017-11-08 15:06:00 浏览535
展开阅读全文

一、相关概念:

rsyncremote synchronizersync.samba.org):远程数据同步工具,通过网络快速同步多台主机间的文件,也可使用rsync同步本地硬盘中不同目录中的数据,利用其自身算法(rsync算法)只传送两个文件的不同部分,通过ssh方式来传输文件,因此保密性好;与cptar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份的优点,通过rsync可以解决对实时性要求不高的数据备份需求,如定期备份服务器数据到指定的服务器、对本地磁盘定期做数据镜像、集群中负载均衡后端real server的网页数据改动时同步到其它real server等场景

 

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出更高的要求,rsync在高端业务系统中暴露出了很多不足:rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输,若文件数量达到了百万甚至千万量级,这将非常消耗系统性能而且低效,有时变化的数据往往只是很少的一部分;rsync不能实时的去监测、同步数据,虽然可以通过计划任务方式触发同步,但两次触发动作一定有时间差,这将导致服务端和客户端数据可能会不一致,通过inotify可解决此问题

 

inotify(是一种强大的、细粒度的、异步的FS事件监控机制,文件内容发生改变是内核管理的,内核将这种监控文件本身是否发生改变的功能输出给用户空间,用户空间才有可能知道,linux内核从2.6.13起支持inotify机制,通过inotify可以监控FS中添加、删除、修改、移动等各种细微事件,利用这个内核接口,通过第三方软件(inotify-tools)就可监控FS下文件的各种变化)

 

sersync(基于inotify开发,功能类似inotifyC++编写,多线程同步,sersync可以记录下被监听目录中发生变化的具体哪一个文件或哪个目录,然后使用rsync同步的时候,只同步发生变化的)

 

rsync+inotifyrsync-sersync两种架构的区别?

rsync+inotifyinotify监控FS的各种变化,一旦有变动时就触发rsync同步,解决了数据同步实时性的问题,inotify仅记录被监控的目录发生了变化,并没记录哪个目录或哪些文件发生了变化,所以rsync每次都要在被监控的所有目录和其下的文件与目标目录进行比对,再传输有差异的文件(要遍历目录下所有文件找出有差异的才进行同步),若数据量很大这将非常耗时,因此效率很低)

rsync+sersyncsersync可以记录被监控的目录中具体哪个目录哪些文件发生了变化,rsyc在同步时只同步发生变化的目录或文件,因此速度很快(节约时间)、节约带宽、效率很高)

 

注:若数据量不大建议使用rsync+inotify,若数据量很大建议使用rsync+sersync

 

二、操作:

1rsync+inotify的实现

举例:实现两个web服务器的网页文件保持同步(一台为server,另一台为client,仅在server-side更新网页文件,查看client-side是否有同步,数据流向是server-->client

准备软件:

rsync--3.0.9.tar.gzhttps://rsync.samba.org/ftp/rsync/src/rsync-3.0.0.tar.gz

inotify-tools-3.14.tar.gzhttps://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

 

注:server-side安装rsyncinotifyclient-side仅安装rsync

#ll /proc/sys/fs/inotify/(若此目录下有max_queued_eventsmax_user_instancesmax_user_watches这三项则此内核支持inotify机制,内核2.6.13之后才支持此功能)

 

server-side192.168.41.131:

 

#tar xf  rsync-3.0.9.tar.gz

#cd rsync-3.0.9

#./configure  --prefix=/usr/local/rsync

#make

#make install

#vim /etc/profile.d/rsync.sh

export  PATH=$PATH:/usr/local/rsync/bin

#. !$

#vim /etc/man.config

MANPATH  /usr/local/rsync/share/man

#man rsync

#rsync options  SRC  DETrsync命令格式)

options:-vzrtopg

-v--verbose

-z--compress

-r--recursive

-t--times

-o--owner

-p--perms

-g--group

-a--archive

-A--acls

-H--hard-links

-l--links

-D--devices  --specials

--deletedelete extraneousfiles from dest dirs,删除目标位置有而原始位置没有的文件)

--progressshow progress duringtransfer显示传输过程)

--passwd-file=FILEreaddaemon-access password from FILE,指定密钥文件)

 

#echo  "redhat"  >  /usr/local/rsync/rsync.passwd(建立认证文件,密码为redhat,此处不需要用户名

#chmod 600  !$(为安全,将密码文件权限改为600

 

#tar xf  inotify-tools-3.14.tar.gz

#cd inotify-tools-3.14

#./configure  --prefix=/usr/lcoal/inotify

#make

#make install

#vim /etc/profile.d/inotify.sh

export PATH=$PATH:/usr/local/inotify/bin

#. !$

#vim /etc/man.config

MANPATH /usr/local/inotify/share/man

#man inotifywatchgather filesystem access statistics using inotify,用于短期监控,任务完成后再出结果)

#man inotifywaitwait for changes to files using inotify,用于持续监控,实时输出结果)

#inotifywait  -mrq -e  EVENT  --timefmt FMT  --format  FMT FILEinotifywait命令用法)

-m--monitor

-r--recursive

-q--quiet

-e--eventListen forspecific event(s) only

--timefmt

--formatOutput  in a  user-specified  format

EVENT有:

modifyA watched file or afile within a watched directory was written to

deleteA file or directorywithin a watched directory was deleted

createA file or directorywas created within a watched directory

attribThe metadata of awatched file or a file within a watched directory was modified

moveA file or directorywas moved from or to a watched directory

 

#vim /root/rsync.sh

#!/bin/bash

#

host=192.168.41.132

src=/var/www/html/

des=test

user=testuser

/usr/local/inotify/bin/inotifywait  -mrq --timefmt  ‘%d/%m/%y %H:%M’  --format ‘%T %w%f%e’  -e  modify,delete,create,attrib  $src |  while  read files;do

/usr/bin/rsync  -vzrtopg --delete  --progress  --passwd-file=/usr/local/rsync/rsync.passwd  $src $user@$host::$des

echo “${files} was rsynced” >>  /var/log/rsync.log  2>&1

done

 

#chmod 764  /root/rsync.sh

#sh /root/rsync.sh  &(注意!待client-side启动rsync服务后再运行此脚本)

 

 

client-side192.168.41.132:

 

#tar xf  rsync-3.0.9.tar.gz

#cd rsync-3.0.9

#./configure  --prefix=/usr/local/rsync

#make

#make install

#vim /etc/profile.d/rsync.sh

export  PATH=$PATH:/usr/local/rsync/bin

#. !$

#vim /etc/man.config

MANPATH  /usr/local/rsync/share/man

 

#echo  "testuser:redhat"  >  /usr/local/rsync/rsync.passwd(建立认证文件

#chmod 600  !$(为安全,将密码文件权限改为600

 

#vim /usr/local/rsync/rsync.conf

uid = root

gid = root

use chroot = no(默认为true增加对目录文件软链接的备份)

max connections = 10

timeout = 600

strict modes = yes

pid file = /var/run/rsyncd.pid

lock file = /var/log/rsyncd.lock

log file = /var/log/rsyncd.log

motd file = /etc/rsyncd.motd(可在此文件中编辑启动时的欢迎信息)

[test](自定义名称)

path = /var/www/html/(数据同步到本地的目录路径)

comment = test(描述信息)

ignore errors = yes

read only = no(设置rsync服务端文件为读写权限)

hosts allow = 192.168.41.131(允许进行数据同步的主机地址,多个用逗号隔开)

hosts deny = *(禁止数据同步的主机地址)

list = false(不显示rsync服务端资源列表)

uid = root(设置rsync运行权限)

gid = root

port = 873(默认端口)

auth users = testuser(执行数据同步的用户名,可以设置多个用逗号隔开)

secrets file =/user/local/rsync/rsync.passwd(用户认证配置文件,里面包含用户名和密码)

 

#rsync --daemon --config=/usr/local/rsync/rsync.conf(启动rsync

 

测试:

server-side(/var/www/html)

wKiom1ZiMsnS4l-qAABrmV9sixw732.jpg

client-side(/var/www/html)

wKioL1ZiM0XgifzPAAAb2Kb_Lvo556.jpg

 

 

2rsync+sersync的实现:

server-side

参照上例,安装rsync、制作认证文件并改权限为600

#mkdir /usr/local/sersync/

# tar  -xf  sersync_64bit_binary_stable_final.tar.gz

#cd  GNU-Linux-x86

#mv  confxml.xml  sersync2 /usr/local/sersync/

#cd /usr/local/sersync

#cp  confxml.xml confxml.xml.bak

#vim confxml.xml

……

<sersync>

   <localpath watch="/var/www/html">

       <remote ip="192.168.41.132" name="test"/>

       <!--<remote ip="192.168.8.39" name="tongbu"/>-->

       <!--<remote ip="192.168.8.40" name="tongbu"/>-->

   </localpath>

   <rsync>

       <commonParams params="-vzrtopg"/>

       <auth start="true" users="testuser" passwordfile="/usr/local/rsync/rsync.passwd"/>

       <userDefinedPort start="false"port="874"/><!-- port=874 -->

       <timeout start="false" time="100"/><!--timeout=100 -->

       <ssh start="false"/>

   </rsync>

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

   <crontab start="true"schedule="600"><!--600mins-->

       <crontabfilter start="false">

       <exclude expression="*.php"></exclude>

       <exclude expression="info/*"></exclude>

       </crontabfilter>

   </crontab>

   <plugin start="false" name="command"/>

</sersync>

……

#vim /root/check_sersync.sh

#!/bin/bash

#

SERSYNC="/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

 

#crontab -e(为防止sersync2意外中断,每5分钟使用此脚本检测,若sersync2未运行,则会自动开启,进行实时同步)

*/5 * * * *  bash  /root/check_sersync.sh&> /dev/null

#/usr/local/sersync/sersync2  -d -r  -o  /usr/local/sersync/confxml.xml(开启sersync服务)

-drun as a daemon

-rrsync all the localfiles to the remote servers before the sersync work

-oconfig xml name  ./confxml.xml

 

client-side

参照上例,安装rsync,配置rsync.conf文件,配置认证文件,并开启rsync服务

 

测试:

server-side

wKiom1ZiMvyAkYQbAABeKZMPEE4022.jpg

wKioL1ZiM3iA804-AAA3yYJJMzY516.jpg

client-side

wKiom1ZiMyGSuvUTAAAqecFM-T8276.jpg

 

 

 

 

 

以上内容是自找资料整理。



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

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注