一、数据同步:linux
1.数据同步:git
A服务器的一个目录同步到B服务器上的一个目录github
方法是:能够在A服务器上把这个目录共享(如ftp,http等),而后B服务器上写shell脚本,用crontab作定时任务下载过来(数据同步不实时)算法
实时同步shell
方法是:rsync远程目录实时同步apache
drbd远程存储实时同步(很老的方案)vim
共享存储,就是同一个磁盘设备同时被不少人用浏览器
分布式存储(云存储)安全
二、同步、异步和远程同步bash
sync同步
async异步
rsync 远程同步
这里主要说rsync,在开始以前须要了解如下几个问题:
rsync是什么;rsync的工做原理;rsync优势不足;rsync认证方式;安装rsync;rsync命令参数详解;配置rsync;rsync的启动与关闭;rsync同步实例
2.1 rsync是什么
rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可经过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减小数据的传输。
rsync第一次会全量传输,后续会对比两个文件的不一样,只传输文件更新的部分,传输速度比通常工具快。
rsync还能够拷贝、显示目录属性及拷贝文件,并可选择性的压缩及递归拷贝。
2.2 rsync的工做原理
2.2.1 命令或者脚本运行以后,同步端开始构造FileList,FileList就是被同步端须要同步的文件索引,name->id(每一个文件都有一个id值,如MD5)
2.2.2 同步端构造完成以后,将FileList发送到被同步端,被同步端rsync处理发送的FileList,而后开始同步。
2.2.3第二次同步时,由于两边的都有文件,同步端构造发送这边的FileList,被同步端rsync处理同步端发送的FileList,根据MD5值比较,删除同步端已经相同的文件信息,保留不存在和更新的文件,来构建新的FileList。
2.2.4 同步端收到被同步端新的FileList,而后开始同步文件到同步端。
2.3 rsync有点
优势:
安全性高
备份迅速,使用同步算法,只比较变化
支持增量备份
保存源目录整个目录树和文件系统
保持源文件的权限、时间、软硬链接等
无需特使权限便可安装
优化流程和比较高的文件传输效率。
多样方式来传输文件。
支持匿名运行,方便网站镜像。
与scp相比,rsync传输速度远在scp之上。(局域网测试,rsync是scp的20倍)
解决对实时性要求不高的数据备份需求
不足:
同步数据,须要扫描全部文件进行对比,才进行差量传输。若是文件数量达到百万甚至千万级,扫描文件对比文件将很是耗时,下降了rsync效率。
rsync不能实时地区监测、同步数据。虽然能够经过守护进程方式触发同步,但两次动做间有时间差,致使数据不一致,没法应对出现故障时彻底恢复数据。
解决: rsync+inotify来弥补不足。
2.4 认证方式
2.4.1 两种方式
rsync-daemon
ssh
注意:在使用rsync时,同步端和被同步端都必须安装rsync程序。
2.4.2 rsync-daemon认证
在rsync-daemon认证方式下,默认监听毒tcp的873端口
在rsync-daemon认证下,rsync能够把密码写入到一个文件中。
注意:被同步端的rsync必须启动,配置文件。同步端能够不起动服务,但必须有这个应用。
2.4.3 ssh认证
经过ssh隧道进行传输,相似于scp工具,同步操做不在局限于rsync中定义的同步文件夹,而且双方只要安装rsync,也不要双方启动rsync。
如:rsync -avz /root/test root@192.168.19.248:/root/
若rsync服务端SSH为非标准端口,可经过rsync的-e参数进行端口指定。使用方式以下:
rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.19.248:/root/
2.5通常用到的工具跟实例
2.5.1 wget工具
wget http://10.1.1.9/linux_basic01.txt --直接下载到当前目录 wget --no-check-certificate https://www.baidu.com/img/bd_logo1.png # 有https链接的,下载时须要加--no-check-certificate参数 wget http://10.1.1.9/linux_basic01.txt -O /test/123 #把文件下载下来更名为/test/123 wget -m -k -np http://10.1.1.9/shell/#只下载shell目录,但注意shell后面必定要加/ wget -m http://www.xxx.com#下载整个网站
2.5.2 转化本地yum源:
如何下载一个epel的扩展yum源,并转化成本地的yum源
使用wget下载;使用reposync下载
reposync下载的作法步骤以下:
先在本地yum配置里写上你要下载的yum源的路径,如
# vim /etc/yum.repos.d/rhel-source.repo [epel] server=epel baseurl=http://xxx.xxx.xxx/--网络路径 gpgcheck=0 enabled=1 # yum repolist --列出你如今全部配置的repo的名字 # reposync --repoid=epel--把epel路径的全部软件包下载到本地当前目录 下载到本机目录后,cd进去,使用createrepo .命令建立软件仓库的货物清单目录repodata 把yum的写法改为 # vim /etc/yum.repos.d/rhel-source.repo [epel] server=epel baseurl=file:///xxx/--写上你的本地目录路径(也就是repodata的上级目录地址) gpgcheck=0 enabled=1
3 安装rsync
两种方式:源码安装和rpm安装
3.1源码安装
3.1.1 下载
先去官网下载源码包
https://rsync.samba.org/ wget --no-check-certificate https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz
有https链接的,下载时须要加--no-check-certificate参数
3.1.2 安装
[root@localhost rsync-3.1.2]# tar xf rsync-3.1.2.tar.gz [root@localhost rsync-3.1.2]# cd rsync-3.1.2 [root@localhost rsync-3.1.2]# ./configure [root@localhost rsync-3.1.2]# make && make install 注意:须要gcc库要提早安装 默认会安装到/usr/local/下,经过./configure --help
安装完成后,查看rsync帮助,须要切换到/usr/local/bin目录下: /usr/local/bin rsync -h [root@localhost rsync-3.1.2]# cd /usr/local/bin [root@localhost bin]# ll total 1344 -rwxr-xr-x 1 root root 1373922 May 16 18:46 rsync [root@localhost bin]# pwd /usr/local/bin 源码安装的rsync,须要开机启动,把启动命令放在rc.local文件中,以下: echo “/usr/local/bin/rsync –daemon –config=/etc/rsyncd.conf”>>/etc/rc.local 也能够写成: echo “/usr/local/bin/rsync –daemon”>>/etc/rc.local cat /etc/rc.local
3.2 RPM方式安装
直接yum安装:yum -y install rsync 查看rsync安装位置,以下: [root@localhost bin]# rpm -ql rsync rsync安装到了/usr/bin,而且生成一个/etc/xinetd.d/rsync文件。 查看安装时产生的帮助文档: [root@localhost bin]# more /usr/share/doc/rsync-3.0.6/README which rsync rsync --help
3.3 可否把rsync作成服务的形式,加上一些控制功能或日志记录功能
3.3.1两个知识点:
xinetd
man rsyncd.conf
两个一块儿共存,共同控制rsync
3.3.2 xinetd介绍
xinetd相似于一个托管服务,托管其余一些其它小服务,好处是可使用xinetd强大的参数来控制这些服务
如:
/etc/xinetd.conf--主配置文件,通常不用配置,主要配置子配置文件 /etc/xinetd.d--子配置文件目录 xinetd服务至关因而全部被拖管服务的总开关 # yum install -y xinetd xinted须要配置文件: vi /etc/xinetd.d/rsync --(man xinetd.conf参考帮助) service rsync { disable = no --yes表示关闭,no表示开启 (启动rsync服务,两个条件:1,disable = no 2,xinetd服务要启动) flags = IPv6 socket_type = stream wait = no --并发链接 user = root --跑守护进程的用户 server = /usr/bin/rsync --启动程序路径 server_args = –daemon –config=/etc/rsyncd.conf --启动参数(这三个参数合起来就是表示用root身份执行/usr/bin/rsync --daemon来启动rsync服务) log_on_failure += USERID --控制日志格式,表示登陆服务失败时,在日志原格式上加上记录USERID } 配置完毕,还须要安装xinted软件包,不然没法启动xinetd root@localhost bin]# yum install -y xinetd [root@localhost bin]# /etc/init.d/xinetd start Starting xinetd: [ OK ] [root@localhost bin]# /etc/init.d/xinetd start Starting xinetd: [ OK ] [root@localhost bin]# chkconfig xinetd on [root@localhost bin]# netstat -tlunp |grep 873 tcp 0 0 :::873 :::* LISTEN 8831/xinetd
4 rsync命令参数详解
查看参数最好的方法就是去查看帮助信息:
rsync --help
4.1 经常使用参数
-v, –verbose详细模式输出。
-a, –archive归档模式,表示以递归方式传输文件,并保持全部文件属性不变。
-l 保留软连接
-R 保留相对路径
-H 保留硬连接
-p,-o,-g,-A 分别保留权限,属主,属组,acl等,但若是加了-a,这些就都包括了
-z, –compress对备份的文件在传输时进行压缩处理。
-D 等于--devices --specials 表示支持b,c,s,p类型的文件
–delete:删除那些DST中存在而在SRC中没有的文件。
4.2 普通应用
rsync -av /home/ /backup/ --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件) rsync -av /home/ 192.168.19.248:/backup/ --把本地的/home目录内容,同步到远端218的/backup目录下,须要远程的192.168.19.248的密码 rsync -av 192.168.19.248:/backup/ /backup/ --把远端218的/backup目录下的内容同步到本地的/backup目录,须要远程的192.168.19.248的密码 rsync -a /test/ '-e ssh -p 2222' 192.168.19.248:/test1/ --若是远程机192.168.19.248的ssh端口不为默认的22,好比改为了2222,那么须要这样写
注意的问题:
同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容
--原目录后面加不加/也影响你的同步
下面这三个有区别:
rsync -av /home/ /backup/ --/home下的内容直接同步到/backup下 rsync -av /home /backup/ rsync -aRv /home/ /backup/ --这两上是/home被同步成/backup/home/* # rsync -av /share/20160516 /backup/ --被同步成/backup/20160516/* # rsync -aRv /share/20160516 /backup/ --被同步成/backup/share/20160516/* 若是源目录有文件被删除了,那同步的目标目录是删除仍是不删除,是否能够用参数来控制? --delete # rsync -aHAX --delete /test/ /test1/ --比较完整的一个写法 扩展file extended attributes # lsattr /etc/shadow --列出文件属性 -------------e- /etc/shadow # chattr +i /etc/shadow --对这个文件加一个i属性(i属性表示文件彻底不可变,不可删),会让全部用户不能修改密码 # lsattr /etc/shadow ----i--------e- /etc/shadow # chattr -i /etc/shadow --去掉i属性
5 配置rsync
5.1rsync被同步端配置
两个文件:rsyncd.conf rsyncd.password
字面上看,一个是主配置文件,一个是存放认证用户密码的。安装完成rsync时,不会生成这个两个配置文件,须要手工建立。cat /etc/rsyncd.conf --此文件不存在,须要手动创建(man rsyncd.conf参考帮助),路径必须是/etc/rsyncd.conf
motd file=/etc/rsyncd.welcome --欢迎文件,路径自定义 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 = /backup/ --实际共享的服务器路径,名字必须是你要共享的实际路径 ignore errors read only = no list = no hosts allow = 192.168.19.0/255.255.255.0 auth users = test secrets file = /etc/rsyncd.password [www] path = /www/ ignore errors read only = no list = no hosts allow = 192.168.19.0/255.255.255.0 auth users = apache secrets file = /etc/rsyncd.password vim /etc/rsyncd.welcome--手动创建本身定义的motd文件,并写上自定义的欢迎信息 rsyncd.password的配置 echo “test:test”>>/etc/rsyncd.password echo “apache:apache”>>/etc/rsyncd.password cat /etc/rsyncd.password
注意:该密码文件中的用户和密码能够进行自定义,同时该用户不必定要在服务器中的系统用户存在。
密码文件建立完毕后,要把其权限要设置为600,不然会在之后同步时提示验证出错。以下:
chmod 600 /etc/rsyncd.password
以上两个文件建立完毕后,咱们来建立其对应的目录并受权,以下:
mkdir /{backup,www} chown root:root –R /backup/ chown root:root –R /www/
5.2同步端配置
不须要启动rsync服务,建立密码文件便可。
echo “apache”>>/etc/rsyncd.password
chmod 600 /etc/rsyncd.password
注意:该密码文件中只能存放一个用户的密码,而且该文件与rsync服务器端的密码文件同样也须要把其权限设置为600。
5.3 验证
# rsync -a 10.1.1.9::--直接这样能够查看10.1.1.9这个服务器共享了哪些 "hello today! @_@"--这就是你rsyncd.welcome里写的欢迎内容 notes --这就是共享的名字 # rsync -a 10.1.1.9::notes /notes/
--这样同步,是不须要密码的;注意notes为共享名,前面有两个:: 后面/notes为本地目录
--没有密码有好处也有坏处,好处是不须要密码方便写脚本作远程同步。若是要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可使用iptables等来增强安全。
--若是你但愿有密码,也不用传密码的话,能够用rsyncd自己自带的secrets file来作验证的用户
5.4 同步出现的问题
若是同步报permission denied这种,多是服务端selinux没有关闭
关闭selinux的方法:
# setenforce 0 --这是立刻把selinux由强制模式改为警告模式
# vim /etc/selinux/config
SELINUX=disabled--把这个改为disabled,而后须要重启电脑才能生效
同步时间慢
解决方法:绑定对方主机名
5.5在上面的基础上加上一些功能
要求:
把日志记录到/var/log/rsyncd.log
共享模块要求隐藏(也就是说客户端查看不到这个模块名)
而且同时只能1个客户端链接进行同步这个module
只能容许192.168.19.x(ip你自定义)同步这个module
只能早上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; --但这一句在rhel6.5经测试,必需要放在global配置里,放到modules配置里不能产生日志
--方法2和4还须要在/etc/rsyslog.conf里加上local5.* /var/log/rsyncd.log
# vim /etc/rsyncd.conf motd file=/etc/rsyncd.welcome [notes] path=/share/20160516 list=false max connections=1 log file=/var/log/rsyncd.log hosts allow=192.168.19.x # vim /etc/xinetd.d/rsync access_times = 9:00-18:00 # /etc/init.d/xinetd restart
6 rsync的启动与关闭
6.1启动服务
源码包安装的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 –config=/etc/rsyncd.conf
若是加载能够查看帮助文档: rsync –daemon –help
rpm的加入到xinetd中,直接启动xinetd便可
6.2关闭服务
源码 pkill rsync
rpm /etc/init.d/xinetd stop
实现实时同步(也就是源一变化,它就会触发同步)
7 inotify
7.1 inotify是什么
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制。
经过inotify能够监控文件系统中的添加、删除、修改、移 动等各类细微事件。利用这个内核接口,第三方软件就能够监控文件系统下文件的各类变化状况,而inotify-tools就是这样一个第三方软件。rsync同步数据的实时性问题恰好有inotify获得弥补
7.2 inotify相关参数解析
inotify定义了三个接口参数,能够用来限制inotify消耗kernel memory的大小。
这些参数是内存参数,能够根据需求实时调节大小。
/proc/sys/fs/inotify/max_queued_evnets
表示请求events数的最大值,超出这个值的事件将被丢弃。该值默认为16384。
注意:max_queued_events是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。
若是你在日志中看到Event Queue Overflow,说明max_queued_events过小须要调整参数后再次使用。
/proc/sys/fs/inotify/max_user_instances
表示每一个user可建立的instances数量上限。该值默认为128。
/proc/sys/fs/inotify/max_user_watches
表示可监控目录的最大数。该值默认为8192。
要修改以上默认值,咱们可使用如下相似手段修改。以下:
echo 30000000>/proc/sys/fs/inotify/max_user_watches
8 inotify监控文件事件类型
inotify可监控的文件系统事件类型,以下:
IN_ACCESS:文件被访问。
IN_MODIFY:文件被write。
IN_ATTRIB:文件属性被修改,如chmod、chown等。
IN_CLOSE_WRITE:可写文件被close。
IN_CLOSE_NOWRITE:不可写文件被close。
IN_OPEN:文件被open。
IN_MOVED_FROM:文件被移出被监控目录,如mv。
IN_MOVED_TO:文件被移入被监控目录,如mv、cp。
IN_CREATE:文件/文件夹被建立。
IN_DELETE:文件/文件夹被删除,如rm。
IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除本身。
IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动本身。
IN_UNMOUNT:宿主文件系统被umount。
IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。
IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。
注意:上面所说的文件也包括目录。
9 inotify-tools是什么
inotify是一个API,须要经过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。
inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。
1)inotify不须要对被监视的目标打开文件描述符,若是被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,而且会产生一个umount事件。
2)inotify既能够监视文件,又能够监视目录。
3)inotify使用系统调用而非SIGIO信号来通知文件系统事件。
4)inotify使用文件描述符做为接口,于是可使用一般的文件I/O操做select和poll来监视文件系统的变化。
10 安装inotify-tools
两种方式:源码和rpm
注意:inotify-tools主要是经过inotifywait和inotifywatch,这两个命令进行工做。而inotifywait命令,是生产环境中使用最多的命令。
10.1 源码包安装
下载地址:https://github.com/rvoicilas/inotify-tools/wiki
注意:不建议使用wget下载inotify-tools,由于网站缘由下载不成功,wget https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
咱们能够先经过浏览器下载本地,而后经过rz命令上传到服务器。
要使用rz命令,咱们须要安装lrzsz软件,以下:
yum -y install lrzsz tar -xf inotify-tools-3.14.tar.gz ./configure make&&make install ls /usr/local/bin/ # /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 director 若是报错,找不到那个库,这个库其实是在/usr/local/lib下的 解决方法 # echo /usr/local/lib/ > /etc/ld.so.conf.d/abc.conf # ldconfig
10.2 rpm包安装
配置yum源
咱们能够去下面这个链接下载最新的yum源,以下:
http://dl.fedoraproject.org/pub/epel/6/x86_64/ 下载epel-release-6-8.noarch.rpm软件包并安装,以下: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm yum –y install inotify-tools rpm -ql inotify-tools 安装完成后,会产生下面两个命令 [root@localhost test]# ls /usr/bin/inotify* /usr/bin/inotifywait /usr/bin/inotifywatch
11.inotifywait使用详解
inotifywait是一个监控等待事件,它主要用于监控文件或目录的变化,而且能够递归地监控整个目录树。
11.1 .inotifywait命令详解
经过inotifywait -h来查看帮助信息
-m表示始终保持事件监听状态。
-r表示递归查询目录。
-q表示打印出监控事件。
-e经过此参数能够指定要监控的事件。可监听的事件,以下:
access:访问,读取文件。
modify:修改,文件内容被修改。
attrib:属性,文件元数据被修改。
move:移动,对文件进行移动操做。以及重命名,对文件进行重命名。
create:建立,生成新文件
open:打开,对文件进行打开操做。
close:关闭,对文件进行关闭操做。
delete:删除,文件被删除。
–timefmt是指定时间的输出格式,用于–format选项中的%T格式。
–format指定文件变化的详细信息输出格式。格式参数以下:
%w表示发生事件的目录
%f表示发生事件的文件
%e表示发生的事件
%T使用由–timefmt定义的时间格式
%Xe事件以“X”分隔
11.2 inotifywait命令实例
咱们要监测/home目录下全部文件及目录的变化状况,命令以下:
inotifywait -mrq –timefmt ‘%y/%m/%d/%H:%M’ –format ‘%T %w %f %e’ -e modify,delete,create,attrib,move,open,close,access /home/
这条命令是对/home目录下全部文件及目录的操做进行监控。
打开一台机的两个窗口,一边建文件,一边查看状态看看是否会有变化
12. inotifywatch使用详解
inotifywatch主要用于收集被监控的文件系通通计数据,包括每一个inotify事件发生多少次等信息。
12.1.inotifywatch命令详解
inotifywatch -h 查看帮助信息
inotifywatch参数说明以下:
-h:输出帮助信息。
-v:输出详细信息。
@:排除不须要监视的文件,能够是相对路径,也能够是绝对路径。
–-fromfile:从文件读取须要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z:输出表格的行和列,即便元素为空。
–-exclude:正则匹配须要排除的文件,大小写敏感。
–-excludei:正则匹配须要排除的文件,忽略大小写。
-r:监视一个目录下的全部子目录。
-t:设置超时时间。
-e:只监听指定的事件。该事件与inotifywait监听的事件类型同样。
-a:以指定事件升序排列。
-d:以指定事件降序排列。
要求统计60秒内/home目录下文件系统的事件,使用以下命令:
inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home
打开一台机的两个窗口,一边建文件,一边查看状态看看是否会有变化
13 inotify-tools与rsync集成
inotify-tools与rsync的集成主要是经过inotifywait命令与rsync命令集成来实现的,而且该集成主要是体现的rsync被同步端,而rsync同步端不须要太多配置。
注意:该集成的主要目的是把rsync被同步端须要备份的文件实时推送到rsync同步端上。
经过下面的实例来讲明
14 应用实例
14.1 实现单向本地目录实时同步
测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test1目录
--使用下面的脚原本作
#vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read events do rsync -a --delete /test/ /test1/ echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1 done # nohup sh /tmp/1.sh &
--使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭
--若是你但愿实现开机自动启动,能够把此命令加到/etc/rc.local里,或者写成shell服务脚本,让其支持chkconfig开机自动启动
再而后对/test进行各类操做,验证能够实时同步到/test1
14.2 实现双向本地目录的实时同步
也有相关的软件(好比unison)能够专门来作双向的实时同步
但咱们就能够用inotify反向再作一次再写一个脚本也同样能够简单去实现,这里再也不介绍
14.3 远程实时同步
方法一:inotify+rsync+nfs
这个方法的思路是:
把远程的目录经过nfs服务挂载到本地,而后当作本地目录同样来使用,这样就避免了rsync同步远程时要输密码的问题
在rhel6.5测试为:使用innotify监控远程nfs挂载的目录再同步到本地目录,没法成功;(在远程机器操做,不会同步到本地。但在挂到本地的目录操做,也会同步到本地。缘由:就是inotify只能监控本机上的目录,不能监控另一台机器上的目录)
可是反过来,使用innotify监控本地目录,再同步到远程nfs挂载的目录,能够成功
实现把10.1.1.9上的/test目录实时同步到192.168.19.248上的/test1目录
10.1.1.9 /test目录 192.168.19.248 /test1目录
在192.168.19.248上
# vim /etc/exports /test1 *(rw,no_root_squash) # /etc/init.d/rpcbind restart # /etc/init.d/nfs restart 在10.1.1.9上 # mkdir /test1/ # mount -t nfs -o vers=3 192.168.19.248:/test1 /test1 --用nfs3版本挂载过来,那么/test1目录就是192.168.19.248上的远程/test1目录了 执行上面讲的两个本地目录同步同样的脚本,测试就能够了 #vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read events do rsync -a --delete /test/ /test1/ echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1 done #nohup sh /tmp/1.sh &
测试(过程省略)但注意在测试以前把前面例子运行的脚本进程经过ps找出来,并kill掉
--扩展,若是把nfs换成samba服务,经过mount -t cifs指令把远程samba共享目录挂载到本地,是否可行?
方法二:使用ssh等效性(ssh密钥登陆)让远程机器链接不须要密码,就很容易使用远程监控或同步了
在10.1.1.9上产生一对密钥
# ssh-keygen # scp /root/.ssh/id_rsa.pub 192.168.19.248:/root/.ssh/authorized_keys # ssh-add /root/.ssh/id_rsa 而后实现远程实时同步,只须要在原来的脚本基础上把远程目录前加上远程IP就能够了(由于作了ssh等效性,不须要密码) #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read events do rsync -a --delete /test/ 192.168.19.248:/test1/ echo "`date +'%F %T'`出现事件events" >> /var/log/rsync.log 2>&1 done
方法三:不作上面方法二的ssh密钥,使用expect脚原本解决密码问题
#!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,move /test |while read events do sed -i '/^192.168.19.248/d' /root/.ssh/known_hosts expect <<EOF &> /dev/null spawn rsync -a --delete /test/ 192.168.19.248:/test1/ expect "no)?" send "yes\r" expect "password:" send "123456\r" expect eof EOF echo "`date +'%F %T'`出现事件events" &>> /var/log/rsync.log done
测试:要先把上面执行的脚本进程都kill掉,再从新执行这个脚原本验证
方法四,使用rsync的secrets file的方法而后写脚本
例:
本地同步端 ----->远程被同步端
10.1.1.9 192.168.19.248
我要实现把本地同步端10.1.1.9上的/test/目录里的内容实时同步到远程被同步端192.168.19.248的/test1/目录
准备:
关闭iptables和selinux
实现过程
在远程被同步端192.168.19.248上操做
# mkdir /test1/ --建立测试的被同步目录 # vim /etc/rsyncd.conf uid=root gid=root --这里指定使用root身份同步到192.168.19.248,不然默认使用nobody用户(这样你须要把/test1/目录改为757的权限,才有权限写) [testsource] path=/test1/ ignore errors read only=no --服务级别给写权限 auth users=test --验证的用户取名为test(此用户与系统用户无关) secrets file=/etc/rsyncd.secrets --验证用户test的用户名和密码的存放文件,此文件须要同步端和被同步端都要有(这样咱们就能够用这种方式来进行验证,而不须要远程的ssh密码验证了) hosts allow=10.1.1.9 --进一步增强安全,只容许10.1.1.9同步 # 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 --重启服务 # netstat -ntlup |grep :873 --验证873端口是否启动 tcp 0 0 :::873 :::* LISTEN 50438/xinetd # chkconfig xinetd on --设置开机自动启动
在本地同步端10.1.1.9操做
先安装inotify软件,步骤参照上面过程,这里省略
# mkdir /test/ --建立测试的同步目录 # vim /etc/rsyncd.secrets --也要建立这个密码文件,里面只写密码就能够了。用户咱们在后面的脚本里的命令里指定 321 # chmod 600 /etc/rsyncd.secrets --也改为600的权限 # vim /tmp/rsync.sh --脚本及其内容(这里强调一下,这里是测试方便,因此才放到/tmp下,生产环境能够放到/bin这种目录下作成一个命令) #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read events do rsync -a --delete --password-file=/etc/rsyncd.secrets /test/ test@192.168.19.248::testsource done # chmod 755 /tmp/rsync.sh --给执行权限,方便执行 # nohup sh /tmp/rsync.sh & --后面挂起执行 # vim /etc/rc.local --加到rc.local里让其开头自动启动 #nohup sh /tmp/rsync.sh &
测试过程省略