Linux课程笔记 Rsync数据同步服务

一 Rsync

1. Rsync介绍

Rsync具有可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。

在同步备份时,默认情况下,Rsync通过独特的“quick  check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要指定参数),甚至是只同步一个文件里有变化的内容部分,所以可实现快速的同步数据的功能。

2. Rsync的特性

  • 支持拷贝特殊文件如链接,设备等
  • 可以排除指定文件或目录同步的功能,相当于打包命令tar
  • 可以做到保持原来文件或目录的权限、时间、软硬链接等所有属性均不变
  • 可实现增量同步,既只同步发生变化的数据
  • 可以使用rcp、rsh、ssh等方式来配合传输文件,也可以通过直接的socket连接
  • 支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

3. Rsync的工作方式

Rsync大致使用三种主要的方法来传输数据,分别为

(1) 本地数据传输

(2) 通过rcp、ssh等传输通道

(3) 以守护进程的方式传输数据


Rsync本地传输的语法为:

rsync  [OPTION]  SRC  DEST

语法说明:

1)  Rsync为同步的命令

2)  [OPTION]为同步时的参数选项

3)  SRC为源,即待拷贝的分区、文件或目录等

4)  [DEST]为目的分区、文件或目录等

特别提示:请注意以下命令的差别:

1)  rsync  -avz  /opt/  /tmp

2)  rsync  -avz  /opt   /tmp

1)中/opt/意思是,仅把/opt/目录里的内容同步过来,opt目录本身并不同步;而后者2)中/opt表示把opt本身及其全部内容都同步到/tmp下,仅一个/之差,意义就大不同。


通过远程shell进行数据传输(remote  shell  mode)

通过远程shell(rcp、ssh等)传输可以分为两种情况,其语法分别为

拉取:rsync  [OPTION]  [[email protected]]HOST:SRC  DEST

推送:rsync  [OPTION]  SRC   [[email protected]]HOST:DEST

拉取实例:

rsync   -vzrtopg  --progress  -e  ‘ssh  -p  22’  [email protected]:/opt  /tmp

-vzrtopg相当于上文的-avz,表示同步文件和目录属性不变

--progress显示同步的过程,可以用-P替换

-e  ‘ssh  -p  22’表示通过ssh的通道传输数据,-p  22可以省略


使用守护进程的方式数据传输:

通过守护进程方式传输同样分为两种情况,每种情况又分为两种语法:

拉取:

1)rsync  [OPTION]  [[email protected]]HOST::SRC  DEST

2)  rsync  [OPTION] rsync:// [[email protected]]HOST[:PORT]/SRC  [DEST]

推送:

1)   rsync  [OPTION] SRC  [[email protected]]HOST::DEST

2)   rsync  [OPTION] SRC  rsync://[[email protected]]HOST[:PORT]/DEST

值得注意的是,与远程shell方式的命令不同的是,第1种语法格式,均为双冒号连接。另外,这个SRC或DEST也不再是路径了,而是守护进程中配置的模块名称。

4. Rsync命令同步参数选项

常用参数选项说明:

-v,--verbose详细模式输出,传输时的进度等信息

-z,--compress传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩

-r,--recursive对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r

-t,--times保持文件时间信息

-o,--owner保持未见属主信息

-p,--perms保持文件权限

-g,--group保持文件属组信息

-P,--progress显示同步的过程及传输时的进度等信息

-a,--archive归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl

-e,--rsh=COMMAND使用的信道协议,指定代替rsh的shell程序

--exclude=PATTERN指定排除不需要传输的文件模式

-D,--devices保持设备文件信息

-l,--links保留软链接

5. 开始部署rsync服务--Rsync服务端操作过程:

5.1  配置rsyncd.conf

1)  配置rsyncd.conf

2)  配置文件常用参数选项说明:


rsyncd.conf参数


参数说明


uid = root


rsync使用的用户,缺省uid为-2,通常为nobody


gid = root


rsync使用的组,缺省gid为-2,通常为nobody


use chroot = no


如果为true,daemon会在客户端传输文件前“chroot to the path”。这是rsync安全的一个配置,因为我们大多数都是在内网使用,所以不配也可以


max  connections = 200


设置最大连接数,默认为0,意味无限制,负值为关闭这个模块


timeout = 400


默认为0,意味着no  timeout,建议为300-600(5-10分钟)


pid file =/var/run/rsyncd.pid


rsync  daemon启动后将其进程PID写入此文件,如果这个文件进程不会覆盖该文件,而是会终止


lock file = /var/run/rsyncd.lock


指定lock文件用来支持“max connection”参数,使得总连接数不会超过限制,默认为/var/run/rsyncd.lock


log  file = /var/run/rsyncd.log


不设或者设置错误,rsync会使用syslog输出相关日志信息


ignore  errors


忽略I/O错误


read  only


指定客户端是否可以上传文件,默认对所有模块都为true


list = false


是否允许客户端可以查看可用模块列表,默认可以


hosts  allow = 10.0.0.0/24


指定可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接


host deny = 0.0.0.0/32


指定不可以联系的客户端主机名和ip地址,默认情况没有此参数,即都可以连接


auth  users  = rsync_backup


指定以空格或逗号分隔的用户可以哪些模块,用户不需要在本地系统中存在,默认所有用户无密码的访问(anonymous rsync)


secrets  file = /etc/rsyncd.password


指定用户名和密码存放的文件,格式:用户名:密码,密码不超过8位


[oldboy]


这里就是模块名称,需要用中括号括起来,起名没有特殊要求,但最好是有意义的名称,便于以后维护


path = /oldboy/


在这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一直,否则会遇到读写问题


#exclude = a b c/2


排除的文件或目录,相对路径

特别说明:如果配置中的path = /oldboy/提到的路径不存在,则需要创建,命令为:

mkdir  -p /oldboy/

chmod  -R  root.root  /oldboy  #授权权限可以根据配置文件中的属主来设定。

5.2 配置用于rsync同步的账号、密码及账号文件权限


#auth

echo  “rsync_backup:oldboy”>/etc/rsyncd.password

#注意:其中rsync_backup:oldboy中的rsync_backup为同步传输用到的虚拟账号,这个账号仅为rsync的账号,不需要是系统账号,。后面的oldboy为密码,不超过8位,账号和密码中间用冒号分割。

chmod  600  /etc/rsyncd.password   #必须为600权限

#check

cat  /etc/rsyncd.password

ll  /etc/rsync.password

5.3 启动rsync服务

以守护进程方式来启动rsync服务:


rsync  --daemon  #daemon表示以守护进程的方式启动rsync服务

--address     #绑定指定IP地址提供服务,适用于多网卡的服务器

--config=FILE  #更改配置文件路径,而不是默认的/etc/rsyncd.conf

--port=Port   更改其他端口提供服务,而不是缺省的873端口

提示:以上几个选项为了解内容,生产场景使用的不多

5.4 设置rsync服务开机自启动


echo  “/usr/bin/rsync  --daemon”  >> /etc/rc.local

也可以使用chkconfig  rsync  on命令(适用于设置其他服务为开机自启动服务)


#从Windows系统拷贝到Linux系统的文件需要转换格式:

[[email protected] ~]# dos2unix /etc/init.d/rsyncd

dos2unix: converting file /etc/init.d/rsyncd to UNIX format ...

[[email protected] ~]# cat /etc/init.d/rsyncd

#!/bin/sh

#author oldboy QQ 31333741

#

# rsync       Start/Stop Rsync service

#

# chkconfig: 35 13 91

# description: This is Rsync service management shell script

# processname: rsyncd

# Source function library.

. /etc/rc.d/init.d/functions

start(){

rsync --daemon

if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ];then

action "Starting Rsync:" /bin/true

sleep 1

else

action "Starting Rsync:" /bin/false

sleep 1

fi

}

stop(){

pkill rsync;sleep 1;pkill rsync

#if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -lt 1 ];then

if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then

action "Stopping Rsync: `ps -ef|grep -v grep|grep rsync|wc -l` " /bin/true

sleep 1

else

action "Stopping Rsync: `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` " /bin/false

sleep 1

fi

}

case "$1" in

start)

start;

;;

stop)

stop

;;

restart|reload)

$0 stop;

$0 start;

;;

*)

echo $"Usage: $0 {start|stop|restart|reload}"

;;

esac

#/etc/init.d/rsyncd文件的权限为700,root用户

[[email protected] ~]# chkconfig rsyncd on

[[email protected] ~]# chkconfig --list rsyncd

rsyncd          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

这里之所以可以使用chkconfig设置为开机自启动,是因为老师写的文件比较规范了,要学习这里的格式。


[[email protected] ~]# service rsyncd start

Failed to parse config file: /etc/rsyncd.conf

Starting Rsync:                                            [失败]

[[email protected] ~]# /etc/init.d/rsyncd start

Failed to parse config file: /etc/rsyncd.conf

Starting Rsync:                                            [失败]

这里设置开机自启动失败,是因为我没有配置/etc/rsyncd.conf这个配置文件。

配置文件如下:

[[email protected] ~]# cat /etc/rsyncd.conf

#rsync_config_______________start

#created by oldboy 15:01 2007-6-5

#QQ 31333741 blog:http://oldboy.blog.51cto.com

##rsyncd.conf start##

uid = root

gid = root

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[oldboy]

path = /oldboy/

ignore errors

read only = false

list = false

hosts allow = 10.0.0.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

[[email protected] ~]# service rsyncd start

Starting Rsync:                                            [确定]

[[email protected] ~]#

[[email protected] ~]#

[[email protected] ~]# /etc/init.d/rsyncd stop

已终止

重启rsync的组合命令


pkill  rsync        #关闭rsync服务

rsync  --daemon   #启动rsync服务

ps  -ef  | grep  rsync   #检查rsync服务


[[email protected] ~]# netstat -tupnl |grep 873

tcp      0     0 0.0.0.0:873        0.0.0.0:*                LISTEN      4380/rsync

tcp      0     0 :::873            :::*                     LISTEN      4380/rsync

[[email protected] ~]# ps -ef | grep -v grep | grep rsync

root      4380     1  0 16:56 ?        00:00:00 rsync --daemon

6. 开始部署Rsync服务--Rsync客户端操作过程

6.1 配置rsync账号及账号文件权限

请注意与服务端的配置的区别


echo  “oldboy” > /etc/rsyncd.password  #这里仅配置了密码,不需要账号。这是与服务端的区别。

chmod  600  /etc/rsyncd.password     #必须为600权限

到此rsync服务配置大功告成!

7. 检查部署的Rsync服务:

默认情况下,以下均在客户端rsync客户端执行操作:下面以[ip:192.168.1..4]为例说明:

从客户端推送/etc目录到服务器rsync指定的目录下:


推送方法结论:--delete参数的作用,它可以使本地的目录和rsync服务端指定的目录实现完全同步,即本地有啥远端就有啥,本地没有的,远端也必须删除。确保数据一致。推送时使用--delete命令有使远端rsync服务端的目录数据丢失的风险。

二 Sersync应用指南

2.1 项目简介

Sersync项目利用inotify与rsync技术实现对服务器数据实时同步解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目前广泛使用的本地及异地数据同步工具

2.2 基本架构

(1)       线程组是线程是等待线程队列的守护线程,设计的目的是能够同时处理多个inotify事件,从而提升服务器的并发同步能力

(2)       服务线程的三个作用:

a.  首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件

b.  每隔10个小时执行脚本,同时清空脚本

c.  第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次

(3)       过滤队列的建立是为了过滤短时间内产生的重复inotify信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里的文件与删除文件夹的时间,通过过滤队列,当删除文件夹时间产生的时候,会将之前加入队列的删除文件的时间全部过滤掉,这样只产生一条删除文件夹的事件。

2.3  Sersync逻辑需求

当前版本的sersync依赖于rsync进行数据同步,在同步主服务器(Master)上开启sersync,sersync负责监控配置路径中的文件系统事件变化,然后调用rsync命令把更新的文件同步到目标服务器(Slave),因此,需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意,是rsync服务)

2.4  配置同步服务器

2.4.1  Slave上部署rsync服务

(1) 升级rsync到3.0

(2) 写入配置文件/etc/rsyncd.conf


[[email protected] ~]# /bin/cp /etc/rsyncd.conf /etc/rsyncd.conf.qinbf_$(date +%F)

[[email protected] ~]# echo >/etc/rsyncd.conf<<EOF

> #Rsync server

> #created by oldboy 15:01 2009-6-5

> ##rsyncd.conf start##

> uid = root

> gid = root

> use chroot = no

> max connections = 2000

> timeout = 600

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

> lock file = /var/run/rsync.lock

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

> ignore errors

> read only = false

> list = false

> hosts allow = 10.0.0.0/24

> hosts deny = 0.0.0.0/32

> auth users = rsync_backup

> secrets file = /etc/rsync.password

> #####################################

> [www]

> comment = www by old0boy 14:18 2012-1-13

> path = /data0/www/www/

> #####################################

> [bbs]

> comment = bbs by old0boy 14:18 2012-1-13

> path = /data0/www/bbs/

> #####################################

> [blog]

> comment = blog by old0boy 14:18 2012-1-13

> path = /data0/www/blog/

> EOF

(3)创建待同步目录


mkdir -p /data0/www/www /data0/www/bbs /data0/www/blog

[[email protected] ~]# tree /data0/www

/data0/www

|-- bbs

|-- blog

`-- www

3 directories, 0 files

[[email protected] ~]# tree /data0

/data0

`-- www

|-- bbs

|-- blog

`-- www

4 directories, 0 files

(4)       配置相关权限认证


[[email protected] ~]# echo "rsync_backup:oldboy123" >/etc/rsync.password

[[email protected] ~]# chmod 600 /etc/rsync.password

[[email protected] ~]# cat /etc/rsync.password   #for check

rsync_backup:oldboy123

[[email protected] ~]# ll /etc/rsync.password     #for check

-rw------- 1 root root 23 09-03 12:15 /etc/rsync.password

(5)       开启守护进程


[[email protected] ~]# rsync --daemon    #开启进程

[[email protected] ~]# ps -ef |grep rsync   #查看rsync进程的情况

root     10005     1  0 12:18 ?        00:00:00 rsync --daemon

root     10007  9887  0 12:18 pts/0    00:00:00 grep rsync

[[email protected] ~]# lsof -i :873        #查看端口对应的进程

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   10005 root    3u  IPv6  20111      0t0  TCP *:rsync (LISTEN)

rsync   10005 root    5u  IPv4  20112      0t0  TCP *:rsync (LISTEN)

#pkill rsync 关闭rsync服务

echo  “/usr/local/bin/rsync --daemon”>>/etc/rc.local

2.4.2  在Master上配置rsync客户端

(1) Master上配置rsync权限


[[email protected] ~]# echo "oldboy123" >/etc/rsync.password

[[email protected] ~]# chmod 600 /etc/rsync.password

[[email protected] ~]# cat /etc/rsync.password

oldboy123

[[email protected] ~]# ll /etc/rsync.password

-rw------- 1 root root 10 10-02 11:46 /etc/rsync.password

(2) Master上手工测试rsync同步情况


#分别创建待同步数据

[[email protected] ~]# mkdir -p /data0/www/www /data0/www/bbs /data0/www/blog

[[email protected] ~]# cd /data0/www/

[email protected] www]# pwd

/data0/www

[[email protected] www]# ls

bbs  blog  www

[[email protected] www]# touch www/www.log

[[email protected] www]# touch bbs/bbs.loog

[[email protected] www]# touch blog/blog.log

[[email protected] ~]# tree /data0

/data0

`-- www

|-- bbs

|   `-- bbs.loog

|-- blog

|   `-- blog.log

`-- www

`-- www.log

4 directories, 3 files

#关闭防火墙,执行同步

[[email protected] ~]# rsync -avzP /data0/www/www/ [email protected]::www/ --password-file=/etc/rsync.password

sending incremental file list

./

www.log

0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 77 bytes  received 30 bytes  71.33 bytes/sec

total size is 0  speedup is 0.00

#/data0/www/www/中最后的这一个“/”很关键,直接决定你是同步整个文件夹 ,还是只是同步文件夹里面的文件

……

#然后检查同步的结果

[[email protected] www]# tree /data0

/data0

`-- www

|-- bbs

|   `-- bbs.loog

|-- blog

|   `-- blog.log

`-- www

`-- www.log

4 directories, 3 files

2.5 在Master上部署sersync

(1) 下载sersync


[[email protected] ~]# mkdir tools

[[email protected] ~]# cd tools/

[[email protected]]#wget  https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(由于防火墙的问题在虚拟机上无法直接下载)

(2) 安装sersync


[[email protected] tools]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/

GNU-Linux-x86/

GNU-Linux-x86/sersync2

GNU-Linux-x86/confxml.xml

[[email protected] tools]# cd /usr/local/

[[email protected] local]# mv GNU-Linux-x86 sersync

(3) 规范sersync目录结构


[[email protected] sersync]# mkdir bin conf logs

[[email protected] sersync]# mv  sersync2 bin/sersync

[[email protected] sersync]# mv confxml.xml conf/

[[email protected] sersync]# tree .

.

|-- bin

|   `-- sersync

|-- conf

|   `-- confxml.xml

`-- logs

3 directories, 2 files

(4) 配置sersync


[[email protected] sersync]# /bin/cp conf/confxml.xml conf/confxml.xml_qinbf_$(date +%F)

然后修改24到28行的部分,原内容为:

24         <localpath watch="/opt/tongbu">

25              <remote ip="127.0.0.1" name="tongbu1"/>

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

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

28          </localpath>

修改为:


24         <localpath watch="/data0/www/www">

25             <remote ip="192.168.1.4" name="www"/>

26             <remote ip="192.168.1.5" name="www"/>

27         </localpath>

28         <!--################################-->

29         <localpath watch="/data0/www/bbs">

30         <remote ip="192.168.1.4" name="bbs"/>

31         <remote ip="192.168.1.5" name="bbs"/>

32         </localpath>

33         <!--################################-->

34         <localpath watch="/data0/www/blog">

35         <remote ip="192.168.1.4" name="blog"/>

36         <remote ip="192.168.1.5" name="blog"/>

37         </localpath>

38         <!--################################-->

提示:<localpath watch="/data0/www/www">中watch部分是本地待同步的目录,name是远端服务器的同步模块名

修改29-35行


29          <rsync>

30              <commonParams params="-artuz"/>

31              <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

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

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

34              <ssh start="false"/>

35          </rsync>

为:


39         <rsync>

40           <commonParams params="-aruz"/>

41           <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>

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

43           <timeout start="true" time="100"/><!-- timeout=100 -->

44           <ssh start="false"/>

45         </rsync>

提示:这几行的配置其实是在配置同步的命令参数而已

修改36-37行


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

为:


46  <failLog path="/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

提示:此步修改同步失败之后,日志文件路径

2.6 开启sersync守护进程同步数据

(1) 配置环境变量


[[email protected] sersync]# echo ‘export PATH=$PATH:/usr/local/sersync/bin‘ >>/etc/profile

[[email protected] sersync]# tail -1 /etc/profile

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

[[email protected] sersync]# source /etc/profile

(2)启动命令


[[email protected] sersync]# sersync -d -r -o /usr/local/sersync/conf/confxml.xml

set the system param

execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches

execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events

parse the command param

option: -d      run as a daemon

option: -r      rsync all the local files to the remote servers before the sersync work

#让Master和slave的数据在初始化的时候相同

option: -o      config xml name:  /usr/local/sersync/conf/confxml.xml #指定配置文件

daemon thread num: 10

parse xml config file

host ip : localhost     host port: 8008

daemon start,sersync run behind the console

use rsync password-file :

user is rsync_backup      #用户

passwordfile is         /etc/rsync.password   #密码文件

config xml parse success

please set /etc/rsyncd.conf max connections=0 Manually

sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)

Max threads numbers is: 32 = 12(Thread pool nums) + 20(Sub threads)

please according your cpu ,use -n param to adjust the cpu rate

------------------------------------------

rsync the directory recursivly to the remote servers once

working please wait...

execute command: cd /data0/www/www && rsync -aruz -R --delete ./  --timeout=100 [email protected]::www --password-file=/etc/rsync.password >/dev/null 2>&1

[[email protected] sersync]# run the sersync:

watch path is: /data0/www/www

#现在的问题是,仅能同步第一个模块的目录

于是,配置多实例,每个配置文件仅同步一个目录,仅记录该目录的失败日志


[[email protected] conf]# cp confxml.xml confxml.xml.new

[[email protected] conf]# cp confxml.xml www_confxml.xml

[[email protected] conf]# cp confxml.xml bbs_confxml.xml

[[email protected] conf]# cp confxml.xml blog_confxml.xml

例如bbs的配置:

23     <sersync>

24         <!--################################-->

25         <localpath watch="/data0/www/bbs">

26         <remote ip="192.168.1.4" name="bbs"/>

27         <remote ip="192.168.1.5" name="bbs"/>

28         </localpath>

29         <!--################################-->

30         <rsync>

31             <commonParams params="-aruz"/>

32           <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>

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

34             <timeout start="true" time="100"/><!-- timeout=100 -->

35             <ssh start="false"/>

36         </rsync>

37   <failLog path="/usr/local/sersync/logs/bbs_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

开启多实例:


sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml

设置开机启动:

cat >>/etc/rc.local <<EOF

sersync  -d -o /usr/local/sersync/conf/www_confxml.xml

sersync  -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync  -d -o /usr/local/sersync/conf/blog_confxml.xml

EOF

#在开机启动的时候一般不需要加上-r参数,因为关机之前大部分的数据是已经同步的,如果再同步,就浪费时间。

其实本例可以只监控上一次的目录,这样可以一次监控三个子目录,这样做是为了方便学习

写入10000个文件批量实时同步测试


[[email protected] www]# for i in `seq 10000`;do echo "qinbf">www/$i.txt;done

[[email protected] www]# ps -ef |grep rsync

root      4380     1  0 05:05 ?        00:00:00 rsync --daemon

root      6246     1  0 10:06 ?        00:00:00 sersync -d -r -o /usr/local/sersync/conf/confxml.xml

root      6601     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml

root      6621     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

root      6641     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml

root     12592  6601  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./464.txt" [email protected]::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12593 12592  0 10:54 ?        00:00:00 rsync -aruz -R --timeout=100 ./464.txt [email protected]::www --password-file=/etc/rsync.password

root     12594  6601  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./464.txt" [email protected]::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12599  6246  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./461.txt" [email protected]::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12608  6246  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./463.txt" [email protected]::www --password-file=/etc/rsync.password >/dev/null 2>&1

提示:当我们已经写入10000个文件,发现同步的线程,依然在同步,甚至才同步400多个文件。可见,实时同步也是相对的,如果没有海量文件的写入,同步还是比较快的。

2.7  Sersync参数说明:


Sersync参数


说明


-r


作用是在开启实时监控之前对主服务器目录与远程目标机器目录进行一次整体同步。如果需要将sersync运行前,主服务器目录下已经存在的所有文件或目录全部同步到远端,则要以-r参数运行sersync,将本地与远程整体同步一次

特别说明:如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步


-o


不指定-o参数时,sersync会使用sersync可执行文件目录下的默认配置文件confxml.xml,如果要使用其他的配置文件,则需要使用-o指定


-n


-n参数为指定默认的线程池的线程总数。

例如./sersync -n 5则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n调高默认的线程总数,提升同步效率


-d


-d参数为后台启动服务,在通常情况下,使用-r参数对本地到远程整体同步一遍之后,在后台运行此参数启动守护进程实时同步,在第一次整体同步时,-d和-r参数经常会联合使用


-m


-m参数为不进行同步,只运行插件

./sersync -m pluginName

例如./sersync  -m command,则在监控到事件后,不对远程目标服务器进行同步,而是直接运行command插件


--help


查看帮助的参数,目前还未完善

2.8 sersync配置文件说明


#xml配置文件注释不是”#”,而是<!--中间是注释内容-->

<?xml version="1.0" encoding="ISO-8859-1"?>

<head version="2.5">

<host hostip="localhost" port="8008"></host>

#hostip与port是针对插件的保留字段,对于同步功能没有任何作用,保留默认即可

<debug start="false"/>

#Debug开启开关,设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify时间与rsync同步命令

<fileSystem xfs="false"/>

#对于xfs文件系统的用户,需要将这个选项开启,才能使sersync正常工作(ext3、ext4的用户可以不用开启)

<filter start="false">

<exclude expression="(.*)\.svn"></exclude>

<exclude expression="(.*)\.gz"></exclude>

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

<exclude expression="^static/*"></exclude>

</filter>

#对于sersync监控文件,会默认过滤系统的临时文件(以”.”开头,以”~”结尾),除了这些文件外,可以自定义其他需要过滤的文件。将start设置为true后开启过滤功能,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以”.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info/*),可以根据需要添加,但开启的时候,自己测试一下,正则表达式如果出现错误,控制台会有提示。

<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>

#对于大多数应用,可以尝试把createFile设置为false来提高性能,减少rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事件close_write,同样可实现文件完整同步。

#要使得createFolder保持为true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。

#默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete参数设置为false,则不会对删除事件进行监控。

<sersync>

<localpath watch="/opt/tongbu">

<remote ip="127.0.0.1" name="tongbu1"/>

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

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

</localpath>

#/opt/tongbu目录为sersync主服务器本地待同步的目录,ip=’192.168.18.39,为从服务器的IP地址,如果有多个从服务器,依次列出来即可。name=”tongbu”,这里的tongbu为rsyncd.conf中的模块名字,即中括号的名称

<rsync>

<commonParams params="-artuz"/>

<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

<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-->

#失败日志配置,默认每60分重新同步

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

<crontabfilter start="false">

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

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

</crontabfilter>

</crontab>

#crontab整体同步,每600分同步一次

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

</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>

<plugin name="socket">

<localpath watch="/opt/tongbu">

<deshost ip="192.168.138.20" port="8009"/>

</localpath>

</plugin>

<plugin name="refreshCDN">

<localpath watch="/data0/htdocs/cms.xoyo.com/site/">

<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>

<sendurl base="http://pic.xoyo.com/cms"/>

<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>

</localpath>

</plugin>

</head>

#plugin标签设置为true的时候,在同步文件或路径到远程服务器之后,会调用插件。通过name参数指定需要执行的插件。目前支持的又command  refreshCDN socket  http四种插件。其中http插件目前由于兼容性原因已经去除,以后会重新加入。

#模块可以单独使用(发生文件改变不同步只调用插件),只需要在命令行下使用-m参数即可。

三 inotify+rsync远程实时同步


[[email protected] ~]# ls -l /proc/sys/fs/inotify/*

#如果该目录下有下面三个文件,就表示支持inotify

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_queued_events

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_user_instances

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_user_watches

上传inotify源软件包,解压—编译—-安装

执行脚本如下:

[[email protected] inotify-tools-3.14]# cat inotify.sh

#!/bin/bash

#para

host01=10.0.0.191

src=/data0/www/www/

dst=www

user=rsync_backup

rsync_passfile=/etc/rsync.password

inotify_home=/usr/local/inotify-tools-3.14/

#judge

if [ ! -e "$src" ] \

|| [ ! -e "${rsync_passfile}" ] \

|| [ ! -e "${inotify_home}/bin/inotifywait" ] \

|| [ ! -e "/usr/bin/rsync" ];

then

echo "Check File and Folder"

exit 9

fi

${inotify_home}/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f‘ -e close_write,delete,create,attrib $src \

| while read file

do

#  rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src [email protected]$host01::$dst >/dev/null 2>&1

cd $src && rsync -aruz -R --delete ./  --timeout=100 [email protected]$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1

done

exit 0

#./ inotify.sh &  在后台运行

提示:sersync其实是inotify和rsync的封装

对比sersync和inotify+rsync,sersync支持过滤,但是经过压力测试sersync的实时同步测试效果没有inotify+rsync的效果好。

时间: 2024-10-13 18:05:53

Linux课程笔记 Rsync数据同步服务的相关文章

Linux之rsync数据同步服务

rsync是一个开源.快速的.多动能的.可以实现全量,增量的本地或远程数据同步备份工具,它适用于多种操作系统平台. 1.rsync的特性(功能) (1)支持拷贝特殊文件(如链接文件.设备文件) (2)拷贝时可以排除目录中目录或文件不需要同步的功能 (3)可以保持源文件或目录的属性不发生改变 (4)可以实现全量.增量的同步功能.传输效率比较高 (5)可以使用scp.ssh.rsh等方式配合使用 (6)可以通过socke传输方式来同步数据 (7)支持匿名或认证(无需系统用户)的进和模式来进行传输同步

Rsync数据同步服务

一.srync三种操作方式 1.本地间传输相当于cp命令 例1:将etc/hosts推送到/tmp下 rsync /etc/hosts /tmp [1.1]数据同步 源文件追加内容:echo "'hostname -I' www.yunjisuan.com">> /etc/hosts [1.2]同步数据(只同步目标文件没有得内容)rsync /etc/hosts /tmp 例2:目录推送 [2.1]将根下得bent目录推送到/tmp下 rsync -avz /root/be

Linux课程笔记 Day07 课上内容总结 SSH和rsync

一. SSH 1.1    SSH介绍 SSH是Secure Shell Protocol的简称.在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输.确保了传递的数据安全.SSH是专为远程登录会话和其他网络问题提供安全性的协议. 在默认状态下,SSH协议提供两个服务功能:一个是提供类似telnet远程链接服务器的服务,即上面提到的SSH服务:另一个是类似FTP服务的stp-server,借助SSH协议来传输数据,提供更安全的FTP服务. 特别提醒:SSH客户端

Linux rsync数据同步命令解析

rsync命令 rsync有六种不同的工作模式: 1)拷贝本地文件.当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式. rsync -a /data /backup 2)使用一个远程shell程序(如rsh.ssh)来实现将本地机器的内容拷贝到远程机器.当DST路径地址包含单个冒号":"分隔符时启动该模式. rsync -avz *.c foo:src 3)使用一个远程shell程序(如rsh.ssh)来实现将远程机器的内容拷贝到本地机器.

第十六课----Rsync数据同步工具

1.1.1 什么是Rsync?Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台.1.1.2 Rsync简介? Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以

Rsync数据同步工具应用指南

1.Rsync数据同步工具应用指南 简介Rsync的特性:Rsync的工作方式:Rsync命令同步选项参数:本地主机模式示例远程RPC模式示例 简介     Rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.可使本地和远程两台或多台主机之间的数据快速复制同步镜像.远程备份的功能.这个功能类似ssh自带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝.当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的

linux系统中Rsync文件同步方案

linux服务器下Rsync文件同步配置 Rsync(remote synchronize) 远程数据同步工具,可以使用"Rsync算法"同步本地和远程主机之间的文件.Rsync的好处是只同步两个文件不同的部分,相同的部分不在传递.类似于增量备份,这使的在服务器传递备份文件或者同步文件. crontab配合rsync 使用可达到定时备份同步任务. Rsync部署环境1.服务器准备| Host | IP | ----------|| Server | 192.168.60.110 | -

rsync远程同步服务

rsync远程同步服务,,在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等信息 rsync是xinetd的子服务 配置rsync服务器 rsync服务器主要有三个配置文件(需要自己手动创建) 1.rsyncd.conf 2.rsyncd.secrets 3.rsyncd.motd mkdir /etc/rsyncd         #创建配置目录 cd /etc/rsyncd touch rsyncd.conf               #创建主配置文件 touch rsyncd.s

Linux系统备份还原工具4(rsync/数据同步工具)

rsync即是能备份系统也是数据同步的工具. 在Jenkins上可以使用rsync结合SSH的免密登录做数据同步和分发.这样一来可以达到部署全命令化,不需要依赖任何插件去实现. 命令参考:http://man.linuxde.net/rsync 说明: rsync命令 是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快. rsy