首页 > 代码库 > 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服务实时同步目录