#最终使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#/opt/web
SITE= "正式web地址"
USER= "root"
read  -p  "please input password:"   PASSWORD
RSYNC_OPTS= "-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -lprRztWavzopg --log-file=/var/log/rsync.log"
SDIR= "/opt/ued"
DDIR= "/opt/ued"
filelist= "/home/tongbu/filelist"
auto_rsync() {
    expect -c " eval  spawn -noecho  rsync  --exclude .git $RSYNC_OPTS $1 $2
       expect \"*?assword:*\"
       send -- \"$PASSWORD\r\"
       expect eof"
}
sync () {
    SRC=$1
    DEST=$2 
    auto_rsync   $SRC  $USER@$SITE:$DEST 
}
cd  $SDIR
for  in  ` cat  $filelist`
do
src=` echo  $i| sed  's%^\/%%g' `
sync  $src $DDIR
done


高并发的rsync服务器

尝试着脱离xinetd的托管模式,直接以daemon的形式启动rsync服务

rsync --daemon -4 --config=/etc/rsyncd.conf --log-file /var/log/rsyncd.log



A server端配置

cat /etc/rsyncd.conf 

uid = root

gid = root

user chroot = no

max connections = 200

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/run/rsyncd.log

[mysql]

path = /opt/xmysqlbak/

ignore errors

read only = no

list = no

hosts allow = x.0/255.255.255.0

auth users = xmysqlbak

secrets file = /etc/rsyncd.password


cat /etc/rsyncd.password

mysqlbak:mysqlbak


B client

使用命令同步即可
/usr/bin/rsync -avz --delete --progress /opt/mysqlbak/ mysqlbak@x::mysql --password-file=/etc/rsyncd.password


/usr/bin/rsync -vzrtopg --delete --progress

--delete参数  主删除,备份不会删除

rsync --exclude .git -azuvrtopg --log-file=/var/log/rsync.log src root@ip:dst

rsync --exclude .git -vzrtopg --delete --progress --log-file=/var/log/rsync.log src root@ip:dst

上面-azuvrtopg和-vzrtopg --delete --progress 使用对比

实际应用中,注意上面的参数

参考

http://www.ilanni.com/?p=8499

http://ilanni.blog.51cto.com/526870/1605200


rsync认证方式

rsync有两种常用的认证方式,一种是rsync-daemon方式,另外一种是ssh方式。在平时使用过程,我们使用最多的是rsync-daemon方式

注意:在使用rsync时,服务器和客户端都必须安装rsync程序

rsync-daemon认证

rsync在rsync-daemon认证方式下,默认监听TCP的873端口。

rsync-daemon认证方式是rsync的主要认证方式,这个也是我们经常使用的认证方式。并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。

注意:rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。客户端启动不启动rsync服务,都不影响同步的正常进行。

rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.199.248:/root/

配置 

server端

在启动xinetd服务之前,我们还需要配置文件/etc/xinetd.d/rsync,如下:

vi /etc/xinetd.d/rsync

service rsync

{

disable = no

flags = IPv6

socket_type = stream

wait = no

user = root

server = /usr/bin/rsync

server_args = –daemon –config=/etc/rsyncd.conf

log_on_failure += USERID

}

cat << EOF >/etc/rsyncd.conf

EOF

vi /etc/rsyncd.conf

uid = root

gid = root

user chroot = no

max connections = 200

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/run/rsyncd.log

[backup]

path = /home/backup/

ignore errors

read only = no

list = no

hosts allow = 192.168.12.0/255.255.255.0

auth users = test

secrets file = /etc/rsyncd.password

[www]

path = /home/www/

ignore errors

read only = no

list = no

hosts allow = 192.168.12.0/255.255.255.0

auth users = apache

secrets file = /etc/rsyncd.password


vi /etc/rsyncd.password

test:test

apache:apache


配置完毕后,我们还需要安装xinetd软件包,否则无法启动xinetd服务。如下:

yum -y install xinetd

/etc/init.d/xinetd start

chkconfig xinetd on

netstat -tunlp |grep 873

参数

-v, –verbose详细模式输出。

-a, –archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。

-z, –compress对备份的文件在传输时进行压缩处理。

–delete:删除那些DST中存在而在SRC中没有的文件。

3)rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST

rsync -avz /data test@192.168.199.247::backup –password-file=/etc/rsyncd.password

推送就是在客户端上执行rsync命令,目的是把客户端需要同步的文件推送到服务器上。

拉取也是在客户端上执行rsync命令,目的是把服务器上的文件拉取到本地。

注意:无论是推送和拉取,rsync命令都是在客户端执行,只是命令的格式不同而已


如果是源码方式安装的rsync,我们可以使用rsync –daemon来启动rsync。如下:

echo PATH=$PATH:/usr/local/bin/>>/etc/profile

source /etc/profile

rsync –daemon

ps aux |grep rsync

netstat -tunlp |grep 873

注意:上述命令行中,只有rsync –daemon才是启动rsync的命令。并且该命令启动时,会默认加载/etc/rsyncd.conf文件。


客户端

vi /etc/rsyncd.password

apache

rsync -avz /home/back/* apache@xx::www --password-file=/etc/rsyncd.password xx代表server ip


另外ssh rsync

rsync.sh

#!/bin/bash

ROOT="/data/www/wwwroot/bbs.linuxtone.org/"

SITE="xx"

USER="root"

#PASSWORD="xxx"

read -p "please input password:"  PASSWORD

RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -azuv --bwlimit=150 --timeout=1200"


auto_rsync() {

   expect -c "eval spawn -noecho rsync --exclude .git $RSYNC_OPTS $1 $2

      expect \"*?assword:*\"

      send -- \"$PASSWORD\r\"

      expect eof"

}


sync() {

   FILE=$(basename $1)

   DEST=$(dirname $1)

   SRC=$1

   # download remote site file to current location

   #auto_rsync $USER@$SITE:$ROOT$FILE $DEST

   auto_rsync   $SRC  $USER@$SITE:$DEST 

   # update remote site file if newer than backup

   #auto_rsync $1 $USER@$SITE:$ROOT

}


# Remote file Directory

sync "/opt/cdn"

实际操作中发现,此脚本,不能同步空目录,如果备份机器没有目录,它只会同步成一个文件。结果就是文件夹变成文件了。需要修改


注意

chmod 600 /etc/rsyncd.password

yum -y install inotify-tools

vim /etc/xinetd.d/rsync


# default: off

# description: The rsync server is a good addition to an ftp server, as it \

#       allows crc checksumming etc.

service rsync

{

        disable = no

        flags           = IPv6

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon –config=/etc/rsyncd.conf

        log_on_failure  += USERID

}


最终的脚本

#!/bin/bash

#使用,往filelist添加目录或者文件,比如/opt

VR=$1

#read -p "please input branch:"  VR

rm -rf /opt/fabu/cdn

cd /opt/fabu/

git clone http://xx -b $VR

[ ! -d /opt/fabu/xx ] && exit 1

chown -R nginx.nginx /opt/fabu/

SITE="ip"

USER="root"

#PASSWORD="xx"

read -p "please input password:"  PASSWORD

#RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -azuvr --bwlimit=150 --timeout=1200 --log-file=/var/log/rsync.log"

#RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -azuvrtopg --bwlimit=150 --timeout=1200 --log-file=/var/log/rsync.log"

RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -vzrtopg --delete --progress  --log-file=/var/log/rsync.log"

#og format = %t %a %m %f %b %t: time %f: file %b: transfered bytes


auto_rsync() {

   expect -c "eval spawn -noecho rsync --exclude .git $RSYNC_OPTS $1 $2

      expect \"*?assword:*\"

      send -- \"$PASSWORD\r\"

      expect eof"

}


sync() {

   FILE=$(basename $1)

   #DEST=$(dirname $1)

   SRC=$1

   DEST=$2

   # download remote site file to current location

   #auto_rsync $USER@$SITE:$ROOT$FILE $DEST

   auto_rsync   $SRC  $USER@$SITE:$DEST 

   # update remote site file if newer than backup

   #auto_rsync $1 $USER@$SITE:$ROOT

}

# Remote file Directory

sync "/opt/fabu/xx/" "/opt/xx/xx"


基于分支的手动同步

#!/bin/bash

#使用,往filelist添加目录或者文件,比如/opt

ROOT="/data/www/wwwroot/bbs.linuxtone.org/"

VR=$1

Date=`date +"%Y-%m-%d %H:%M:%S"`

#read -p "please input branch:"  VR

rm -rf /opt/fabu/cdn

cd /opt/fabu/

git clone url -b $VR

[ ! -d /opt/fabu/cdn ] && exit 1

echo "$Date,版本$VR" >> /var/log/VR.log

chown -R nginx.nginx /opt/fabu/

SITE="xx"

USER="root"

#PASSWORD="xx"

read -p "please input password:"  PASSWORD

#RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -azuvr --bwlimit=150 --timeout=1200 --log-file=/var/log/rsync.log"

#RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -azuvrtopg --bwlimit=150 --timeout=1200 --log-file=/var/log/rsync.log"

RSYNC_OPTS="-e \\\"ssh -p22 -o StrictHostKeyChecking=no\\\" -vzrtopg --delete --progress  --log-file=/var/log/rsync.log"

#og format = %t %a %m %f %b %t: time %f: file %b: transfered bytes


auto_rsync() {

   expect -c "eval spawn -noecho rsync --exclude .git $RSYNC_OPTS $1 $2

      expect \"*?assword:*\"

      send -- \"$PASSWORD\r\"

      expect eof"

}


sync() {

   FILE=$(basename $1)

   #DEST=$(dirname $1)

   SRC=$1

   DEST=$2

   # download remote site file to current location

   #auto_rsync $USER@$SITE:$ROOT$FILE $DEST

   auto_rsync   $SRC  $USER@$SITE:$DEST 

   # update remote site file if newer than backup

   #auto_rsync $1 $USER@$SITE:$ROOT

}


# Remote file Directory

sync "/opt/fabu/cdn/" "/opt/ued/cdn"


#使用方法 sh  rsync.sh git分支

rsync -vzrtopg  --delete --progress "-e ssh -p $PARTS"  resin@$REMOTE_IP:$2   $3


更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rsync +inotify或者sersync或者svn+puppet 300s
rsync -vzrtopgl --progress --delete --exclude=.svn  /data/web/a . test .cn /test @172.31.0.15::a. test .cn --password- file = /shell/rsync-passwd/rsync . passwd
rsync  -az --delete --exclude  "file10"  /null/  /xx/
将dirA的所有文件同步到dirB内,并保留文件的属主,属组,文件权限等信息
rsync  -avz dirA/ dirB/
将dirA的所有文件同步到dirB内,并删除dirB内多余的文件
rsync  -avz --delete  /dirA  dirB/
将dirA的所有文件同步到dirB,但是在dirB内除了fileB3.txt这个文件不删之外,其他的都删除
rsync  -avz --delete --exclude  "fileB3.txt"   dirA/  dirB/
将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内
rsync  -avz --exclude= "fileA1.txt"  --exclude= "fileA2.txt"  dirA/ dirB/
将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内,并且在dirB目录内删除多余的文件
rsync  -avz --exclude= "fileA1.txt"  --exclude= "fileA2.txt"  --delete  dirA/ dirB/
将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内,并且在dirB目录内删除多余的文件,同时,如果dirB内有fileA2.txt和fileA1.txt这两个被排除同步的文件,仍然将其删除
rsync  -avz --exclude= "fileA1.txt"  --exclude= "fileA2.txt"   --delete-excluded  dirA/ dirB/