首页 > 代码库 > Rsync服务实时同步目录

Rsync服务实时同步目录

--

sync 同步
async 异步
rsync 远程同步

    rsync     remote sync    远程同步  

拷贝和同步的区别?


rsync  - faster, flexible replacement for rcp

rsync  — a fast, versatile, remote (and local)
       file-copying tool


  Wget - The non-interactive network down-loader.

wget http://10.1.1.10/linux_basic01.txt        --直接接url  uniform  resource locate(统一资源定位)

wget http://10.1.1.10/linux_basic01.txt -O /test/123    

wget -m -k -np http://10.1.1.10/png/

wget -m  http://www.xxx.com    --下载整个网站



题目:如何下载一个epel的扩展yum源?

做法:
1,先在本地yum配置里写上你要下载的yum源的路径,如
# vim /etc/yum.repos.d/rhel-source.repo

[epel]
server=epel
baseurl=http://xxx.xxx.xxx/
gpgcheck=0
enabled=1

3 # yum repolist    --列出你现在所有配置的repo的名字

2,# reposync --repoid=epel    --把epel路径的所有软件包下载到本地当前目录


        rsync   特点:

    1,可以镜像保存整个目录树和文件系统
    2,容易做到保存原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件attributes等
    3,传输效率高,使用同步算法,只比较变化的
    4,支持匿名传输,方便网站镜像


rsync 参数介绍
    -v    verbo
    -a    归档模式,递归的方式传输文件,并保持文件的属性
    -l       保留软链接
    -R    保留相对路径
    -H     保留硬链接
    -p ,-o,-g,-A  分别保留权限,属主,属组,acl等,但如果加了-a,这些就都包括了
    -D    等于--devices  --specials    表示支持b,c,s,p类型的文件


普通应用:
     rsync -av  /home/    /backup/     --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件)
    
     rsync -av /home/ 10.1.1.218:/backup/    --把本地的/home目录内容,同步到远端218的/backup目录下,需要远程的10.1.1.218的密码

     rsync -av 10.1.1.218:/backup/ /backup/    --把远端218的/backup目录下的内容同步到本地的/backup目录,需要远程的10.1.1.218的密码


# rsync  -a /test/ ‘-e ssh -p 2222‘ 10.1.1.218:/test1/
--如果远程机10.1.1.218的ssh端口不为默认的22,比如改成了2222,那么需要这样写


注意的问题:
1。 同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容

--原目录后面加不加/也影响你的同步

下面这三个有区别:
rsync -av /home/ /backup/        
--/home下的内容直接同步到/backup下

rsync -av  /home    /backup/
rsync -aRv  /home/    /backup/
--这两上是/home被同步成/backup/home/*

# rsync -av /share/120214 /backup/
--被同步成/backup/120214/*

# rsync -aRv /share/120214/  /backup/
--被同步成/backup/share/120214/*


2。如果源目录有文件被删除了,那同步的目录是删除还是不删除,是否可以用参数来控制?
--delete


# rsync  -aHAX --delete /test/ /test1/        --比较完整的一个写法


思考:能否把上面的rsync做成服务(daemon)的形式,并加上一些控制功能或日志记录功能呢?


主要两个知识点:
1,xinetd
2,man rsyncd.conf    
--这两个一起共存,共同控制rsync


xinetd介绍

# yum install xinetd rsync

xinetd 就类似于一个拖管服务,可以拖管一些其它的小服务。拖管后的好处就是可以使用xinetd强大的参数来控制这些服务。(比如一个小服务没有一些控制功能,但支持xinetd拖管,你就可以拖管并使用xinetd的参数来控制它)

/etc/xinetd.conf    --主配置文件,一般不用配置,主要配置子配置文件
/etc/xinetd.d        --子配置文件目录

xinetd服务相当于是所有被拖管服务的总开关


# vim /etc/xinetd.d/rsync     --(man xinetd.conf参考帮助)

service rsync
{
        disable = yes        --yes表示关闭,no表示开启(也就是说要启动rsync服务,两个条件:1,disable = no 2,xinetd服务要启动)
        flags           = IPv6
        socket_type     = stream    
        wait            = no    --并发连接
        user            = root    --跑守护进程的用户
        server          = /usr/bin/rsync    --启动程序路径
        server_args     = --daemon        --启动参数(这三个参数合起来就是表示用root身份执行/usr/bin/rsync --daemon来启动rsync服务)
        log_on_failure  += USERID    --控制日志格式,表示登陆此服务失败时,在日志里原来的格式基础上再加上记录USERID
}



例一:
服务器端的配置:
1,第一步:
vim /etc/rsyncd.conf        --此文件不存在,需要手动建立(man rsyncd.conf参考帮助)

motd file=/etc/rsyncd.welcome

[weekendnotes]                --共享给客户端看到的名字
path=/share/weekend2        --实际共享的服务器路径


vim /etc/rsyncd.welcome    --手动建立自己定义的motd文件,并写上自定义的欢迎信息


2,第二步:
# vim /etc/xinetd.d/rsync

service rsync
{
        disable = no    --yes改为no  打开rsync服务功能
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}



第三步:
/etc/init.d/xinetd restart        --重启服务

netstat -ntlup |grep 873        --服务端就会有873的端口在监听了
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      4080/xinetd  



客户端的操作:

# rsync -v 10.1.1.10::        --直接这样可以查看10这个服务器共享了哪些
        "hello today! @_@"    --这就是你rsyncd.welcome里写的欢迎内容

weekendnotes          



# rsync -a 10.1.1.10::weekendnotes /notes/
--这样同步,是不需要密码的;注意weekendnotes为共享名,前面有两个:: 后面/notes为本地目录

--没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。
--如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file来做验证的用户


同步可能出现的问题:
1,如果同步报permission denied这种,可能是服务端selinux没有关闭

关闭selinux的方法:
# setenforce 0    --这是马上把selinux由强制模式改成警告模式
# vim /etc/selinux/config
    SELINUX=disabled    --把这个改成disabled,然后需要重启电脑才能生效

2,同步时间慢
解决方法:绑定对方主机名




例二:在上面的基础上加上一些功能    

要求:
1。把日志记录到/var/log/rsyncd.log    
2。共享模块要求隐藏(也就是说客户端查看不到这个模块名)  
3。并且同时只能1个客户端连接进行同步这个module
4。只能允许10.1.1.x(ip你自定义)同步这个module
5。只能早上9点到下午6点同步

第一个要求实现的方法很多:
方法1:在/etc/xinetd.d/rsync 加上参数log_type file /var/log/rsyncd.log;
方法2:在/etc/xinetd.d/rsync 加上参数log_type syslog local5;
方法3:在/etc/rsyncd.conf加上参数 log file=/var/log/rsyncd.log;
方法4:在/etc/rsyncd.conf加上参数syslog facility=local5
--方法2和4还需要在/etc/rsyslog.conf里加上local5.*  /var/log/rsyncd.log


# vim /etc/rsyncd.conf
motd file=/etc/rsyncd.welcome

[weekendnotes]
path=/share/weekend2
list=false
max connections=1
log file=/var/log/rsyncd.log
hosts allow=10.1.1.x    

# vim /etc/xinetd.d/rsync
access_times = 9:00-18:00

# /etc/init.d/xinetd restart


rsyncd能不能不拖管到xinetd下实现呢?
可以实现

使用下面的命令来启动,而不用xinetd来做(这样做rsyncd.conf里的参数还是生效,但/etc/xinetd.d/rsync里的参数不生效了)
/usr/bin/rsync --daemon


============================================================================================


rsync的补充:

实现实时同步(也就是源一变化,它就会触发同步)
        inotify+rsync


inotify-tools-3.13.tar.gz

# tar xf inotify-tools-3.13.tar.gz -C /usr/src/
# cd /usr/src/inotify-tools-3.13/
# ./configure
# make
# make install

--安装完后,就会产生下面两个命令
/usr/local/bin/inotifywait
/usr/local/bin/inotifywatch


# /usr/local/bin/inotifywait --help
/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory
如果报错,找不到那个库,这个库实际上是在/usr/local/lib下的
解决方法
# echo /usr/local/lib/  > /etc/ld.so.conf.d/abc.conf
# ldconfig


1,实现单向本地目录实时同步
测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test1目录

--使用下面的脚本来做


#vim /tmp/1.sh

#!/bin/bash

/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read files
do
                rsync -a --delete /test/ /test1/
                echo "`date +‘%F %T‘`出现事件$files" >> /var/log/rsync.log 2>&1
done


# nohup sh /tmp/1.sh  &        
--使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭
--如果你希望实现开机自动启动,可以把此命令加到/etc/rc.local里,或者写成shell服务脚本,让其支持chkconfig开机自动启动


再然后对/test进行各种操作,验证可以实时同步到/test1

2,实现双向本地目录的实时同步
也有相关的软件(比如unison)可以专门来做双向的实时同步
但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现



3,远程实时同步

                web1    web2

                共享存储iscsi FC (分布式存储)

方法一,inotify+rsync+nfs
把远程目录用nfs挂载过来,当本地目录来监控,然后直接用上面的本地实时同步脚本就可以了
--注意:经测试后,此种方法不可取。(应该是inotify只能支持本地目录的监控,远程目就算是挂载过来也不能监控)

监控远程挂载过来的目录不可以,那么我们可以考虑监控本地的目录,当本地目录内容有变化时,同步到远程挂载过来的NFS目录(但要有写权限)


实现把35上的/test目录实时同步到37上的/test1目录
    10.1.1.10 /test目录        10.1.1.34  /test1目录

步骤一:
在37上    
# vim /etc/exports
/test1  *(rw,no_root_squash)
# /etc/init.d/rpcbind restart
# /etc/init.d/nfs  restart

步骤二:
在35上
# mkdir /test1/
# mount -t nfs -o vers=3 10.1.1.34:/test1  /test1    --用nfs3版本挂载过来,那么/test1目录就是37上的远程/test1目录了

步骤三:
执行上面讲的两个本地目录同步一样的脚本,测试就可以了
#vim /tmp/1.sh

#!/bin/bash


/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read files
do
                rsync -a --delete /test/ /test1/
                echo "$files在`date +‘%F %T‘`被同步" >> /var/log/rsync.log 2>&1
done

#nohup sh /tmp/1.sh  &


方法二,使用ssh等效性(ssh密钥登录)让远程机器连接不需要密码,就很容易使用远程监控或同步了

对称加密
非对称加密

ssh等效性用的是非对称加密原理
原理:产生一对密钥,自己持有一个私钥,公钥给对方,需要一对才能解密

# ssh-keygen         --输入这个命令后,三次回车产生空密码key对

# scp /root/.ssh/id_rsa.pub 10.1.1.104:/root/.ssh/authorized_keys--把公钥传给104的机器后,重命令名为authorized_keys

# ssh-add /root/.ssh/id_rsa   --在rhel6如果不能成功,需要在本地把自己的私钥加一下
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

# ssh 10.1.1.104        --直接ssh不需要密码了



思考:三台机的user1用户之间全部ssh不需要密码,并且ssh自己也不需要密码

A
B
C
1,A,B,C三台都su - user1,然后使用ssh-keygen产生各自的私钥对
2,在A机器上用user1继续操作,
scp Bserver:~/.ssh/id_rsa.pub  ~/Bserver_pubkey
scp Cserver:~/.ssh/id_rsa.pub  ~/Cserver_pubkey
3,cat id_rsa.pub  Bserver_pubkey  Cserver_pubkey >> authorized_keys
4,scp authorized_keys Bserver:~/.ssh/
  scp authorized_keys Cserver:~/.ssh/


思考:
试想一下,如果你管理1000台服务器,你希望就在一台服务器上能轻松远程管理所有服务器,或者在一台上写脚本可以管理所有服务器,你会怎么做?  

答案:
1,如果你都做ssh等效性,工作量太大;当然也可以先在1000台上分别产生一对密钥,然后把公钥都传给其中一个人,全部追加到一个authorized_keys文件。然后使用expect脚本或者puppet这种工具推送到其它999台上面.
2,就算是都做好了,也不安全,如果一台被攻破,那么另外999台也没有安全保障了
3,但并不是说这个没有实际应用,在少量的几台之间做一些特殊应用还是可以用的;
   如:在oracle的RAC集群里,各个节点之间必须要配置这个(只不过是oracle用户,不是root用户);
   如:hadoop的管理用户也需要互相配置ssh等效性
4,或者使用用户集中化管理,所有的用户都在一个服务器上


然后实现远程实时同步,只需要在原来的脚本基础上把远程目录前加上远程IP就可以了(因为做了ssh等效性,不需要密码)

#!/bin/bash

/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read files
do
                rsync -a --delete /test/ 10.1.1.104:/test1/
                echo "`date +‘%F %T‘`出现事件$files" >> /var/log/rsync.log 2>&1
done


方法三,用脚本的expect自动应答来处理远程连接时要传的密码问题


shell脚本再讨论



方法四,使用rsync的secrets file的方法然后写脚本

例:      
        远程被同步端    本地同步端    
        10.1.1.34    10.1.1.10
我要实现把本地同步端10.1.1.10上的/localtest/目录里的内容实时同步到远程被同步端10.1.1.34的/remotetest/目录


准备:
关闭iptables和selinux


实现过程
第一大步:在远程被同步端10.1.1.34上操作
# mkdir /remotetest/    --创建测试的被同步目录

# vim /etc/rsyncd.conf
uid=root        
gid=root        --这里指定使用root身份同步到10,否则默认使用nobody用户(这样你需要把/remotetest/目录改成757的权限,才有权限写)

[testsource]
path=/remotetest/
ignore errors
read only=no        --服务级别给写权限
auth users=test        --验证的用户取名为test
secrets file=/etc/rsyncd.secrets    --验证用户test的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用这种方式来进行验证,而不需要远程的ssh密码验证了)
hosts allow=10.1.1.10        --进一步加强安全,只允许10.1.1.10同步


# vim /etc/rsyncd.secrets    --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试)
test:321

# chmod 600 /etc/rsyncd.secrets    --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限)

#  yum install xinetd -y

# vim /etc/xinetd.d/rsync
      disable = no        -- disable 后面值由yes改为no

# /etc/init.d/xinetd restart    --重启服务
# chkconfig xinetd on    --设置开机自动启动



第二大步:在本地同步端10.1.1.10上操作
先安装inotify软件,步骤参照上面过程,这里省略

# mkdir /localtest/    --创建测试的同步目录
# vim /etc/rsyncd.secrets    --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定
321
# chmod 600 /etc/rsyncd.secrets  --也改成600的权限

# vim /bin/rsync.sh    --脚本及其内容

#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /localtest |while read files
do
                rsync -a --delete  --password-file=/etc/rsyncd.secrets /localtest/ test@10.1.1.34::testsource
done


# chmod 755 /bin/rsync.sh   --给执行权限,方便执行

# nohup sh /bin/rsync.sh &   --后面挂起执行

# vim /etc/rc.local        --加到rc.local里让其开头自动启动
nohup sh /bin/rsync.sh &

第三大步:
测试过程省略

本文出自 “专注IT十八年” 博客,请务必保留此出处http://zhangjiajiang.blog.51cto.com/9701694/1843238

Rsync服务实时同步目录