本节我们来讲一讲如何利用rsync以及inotify来实现两台不同主机之间的实时数据同步,rsync虽然同步功能异常强悍,但是它不能实时的去监测、同步数据,这就是为什么我们要用了inotify的原因了。 好的废话不多说,下面我们就分别对他们进行介绍。
rsync
顾名思意,它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
特点:
1、可以镜像保存整个目录树或文件系统;
2、较高的数据传输效率;
3、可以借助于ssh实现安全数据传输;
4、支持匿名传输;
rsync命令的工作模式:
第一种模式:shell模式,也称作本地模式;
第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;
第三种模式:列表模式,仅列出源中的内容,-nv
第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;
rsync命令的选项:
-n: 同步测试,不执行真正的同步过程;
-v: 详细输出模式
-q: 静默模式
-c: checksum,开启校验功能
-r: 递归复制
注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
-a: 归档,保留文件的原有属性;
-p: 保留文件的权限;
-t: 保留文件的时间戳;
-l: 保留符号链接
-g: 保留属组
-o: 保留属主
-D:保留设备文件
-e ssh: 使用ssh作为传输承载;
-z: 压缩后传输;
--progress: 显示进度条
--stats: 显示如何执行压缩和传输
rsync的服务模式
1、设定rsync服务器端
# yum -y install xinetd # chkconfig rsync on
2、为rsync提供配置文件:手动创建
/etc/rsyncd.conf
[root@localhost ~]# vim /etc/rsyncd.conf
配置文件分两段:
全局配置段:1个
共享配置段:可以有多个
[SHARE_NAME]:名称可以自定义
配置示例:
# Global Settings uid = nobody 进程运行用户身份 gid = nobody 进程运行用户组 use chroot = no 是否启用chroot max connections = 10 最大并发请求连接数 strict modes = yes 严格模式 pid file = /var/run/rsyncd.pid pid文件:名字自己定义 log file = /var/log/rsyncd.log 日志文件:名字自己定义 # Directory to be synced [tools] path = /data 同步目录:名字自己定义 ignore errors = yes 忽略错误 read only = no 只读 write only = no 只写 hosts allow = 172.16.0.0/16 同步白名单 hosts deny = * 同步黑名单 *表示拒绝所有 list = false uid = root gid = root
3、启动服务
注意启动服务之前必须修改/etc/xinetd.d/rsync 文件中的disable项,使其为no,这样xinetd才会为其开启监听服务。
[root@localhost ~]# vim /etc/xinetd.d/rsync
# service xinetd start
如果启动成功则监听于873/tcp:可用ss -tnl 命令查看
可以看到最后一行,873端口已监听。
用法:
读取:Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送:Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
测试:本机的地址为172.16.6.20,以另一台地址为172.16.106.2的机子进行同步测试
可以看到同步成功,但是由于没有验证功能这里不需要任何密码
4、服务端启用用户认证的功能
创建密码文件
密码文件创建为/etc/rsyncd.passwd (该文件名可以自己定义,但需要与配置文件中保持一致):注意,密码不能超过8个字符
密码文件中的格式:username:password
[root@localhost ~]# vim /etc/rsyncd.passwd
这里我任意写了三个用户mwj,james,tracy
由于此文件不能允许其它用户有访问权限,因此创建完成后修改下文件的权限:
[root@localhost ~]# chmod 600 /etc/rsyncd.passwd
在共享定义处加认证配置:
[tools] path = /data ignore errors = yes read only = no write only = no hosts allow = 172.16.0.0/16 hosts deny = * list = false uid = root gid = root auth users = USERNAME LIST 该用户列表为以逗号分隔且在密码文件中存在的用户名 secrets file = /etc/rsyncd.passwd 密码文件
注意,这里我们只给了james和tracy权限,因此理论上来说mwj没有权限同步,那么我们来验证下结果。
ok,一切完毕。我们来重启下服务并且测试下:
[root@localhost ~]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ]
测试:本机的地址为172.16.6.20,还是以另一台地址为172.16.106.2的机子进行同步测试
[root@localhost data]# rsync [email protected]::tools/inittab /web/data/ 复制inittab文件 Password: @ERROR: auth failed on module tools 认证被拒绝 rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6] [root@localhost data]# ls fstab 复制未成功 [root@localhost data]# rsync [email protected]::tools/inittab /web/data/ 复制inittab文件 Password: [root@localhost data]# ls fstab inittab 复制成功 [root@localhost data]# rsync [email protected]::tools/fstab2 /web/data/ 复制fstab2文件 Password: [root@localhost data]# ls fstab fstab2 inittab 复制成功
好了,通过上述的测试验证的我们此前的预测,认证生效。
inotify
rsync虽然也能够使用cron来进行任务同步,但是其中还是会出现一定的时间差,如果想要解决这个问题,那么我们就可以用inotify来解决了,Inotify 是一个 Linux 内核特性,它可以实时监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等,还可以实时跟踪活动的源头和目标等细节,这样一旦同步文件发送改变,inotify就可以实时的通知客户端到服务器端进行同步,这样就可以实现无缝隙的数据同步。
1、安装 (注意:此功能需要2.6.13及以上内核支持)
[root@localhost ~]# uname -r 查看一下机器的内核版本 2.6.32-431.el6.x86_64 2.6.32的内核
这里我们两种方式都提供:编译安装和yum安装
编译安装
这里我们下载inotify的源码包进行编译安装
下载地址:http://sourceforge.net/projects/inotify-tools/files/
[root@localhost ~]# wget http://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@localhost ~]# tar xf inotify-tools-3.13.tar.gz [root@localhost ~]# cd inotify-tools-3.13 [root@localhost inotify-tools-3.13]# ./configure [root@localhost inotify-tools-3.13]# make && make install
这里只是提供一下编译安装的过程,具体的我还是利用下面yum安装的操作来进行。
yum安装
[root@localhost inotify-tools-3.13]# yum install inotify-tools [root@localhost inotify-tools-3.13]# rpm -ql inotify-tools 查看生成了哪些文件 /usr/bin/inotifywait 指令文件:用来监视文件的变化 /usr/bin/inotifywatch 指令文件:用于收集被监控的文件系统统计数据 /usr/lib64/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0.4.1 /usr/share/doc/inotify-tools-3.14 /usr/share/doc/inotify-tools-3.14/AUTHORS /usr/share/doc/inotify-tools-3.14/COPYING /usr/share/doc/inotify-tools-3.14/ChangeLog /usr/share/doc/inotify-tools-3.14/NEWS /usr/share/doc/inotify-tools-3.14/README /usr/share/man/man1/inotifywait.1.gz /usr/share/man/man1/inotifywatch.1.gz
inotify相关参数
inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小。下面分别做简单介绍。
/proc/sys/fs/inotify/max_queued_evnets
表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances
表示每一个real user ID可创建的inotify instatnces的数量上限。
/proc/sys/fs/inotify/max_user_watches
表示每个inotify instatnces可监控的最大目录数量。如果想要增加此值的大小: 可直接使用echo重定向即可:
echo 1000000 > /proc/sys/fs/inotify/max_user_watches
下面我们来看下inotifywait和inotifywatch这2个命令的用法:
inotifywait:wait for changes to files using inotify 使用inotify监控文件变化
语法格式:
inotifywait [-options] <file> [ ... ]
options
-h :help
-m : --monitor,监听
-c :输出为逗号分隔形式
-r :递归
-e <event>:指定监听事件,不指默认问全部
-t <seconds>:时间
--format <fmt> :格式
--timefmt <fmt>:时间格式
inotifywatch:gather filesystem access statistics using inotify收集统计数据
语法格式:
inotifywatch [options] <file> [ ... ]
options
-h :help
-r :递归
-v :输出额外的错误信息
-e <event>:指定事件
-t <seconds>:时间
-a <event>:输出时按照事件计数进行升序排序
-d <event>:输出时按照事件计数进行降序排序
案例:
172.16.6.20:作为rsync服务器
172.16.106.2:作为inotify服务端,rsync的客户端,当文件改动时将改变同步到A
rsync服务器配置
这里的配置跟上面的服务认证一样,这里就不多加介绍了,主要还是介绍下面的inotify的配置
[root@localhost ~]# vim /etc/rsyncd.conf
密码文件以及其他配置跟上面完全相同。
inotify服务端配置
这里假设我们将监控/shared目录下的内容,并同步到rsync服务器端。
下面编写一个脚本
[root@localhost ~]# vim /etc/inotify.sh
#!/bin/bash # host1=172.16.6.20 ##服务器端IP src=/shared/ ##本地数据存放目录 dst=tools ##服务端数据的目录 user=james ##主机A允许推送拉取数据的用户 psd=lbj 密码 /usr/bin/local/inotifywait -mrq -e modify,delete,create,attrib $src |while read line ; do echo $psd > /usr/bin/rsync -vzrtopg --delete --progress $src $user@$host::$dst done
[root@localhost ~]#
好了,这样我们一个rsync+inotify的实时数据同步就OK了。直接启动就可以用来额。
[root@localhost ~]#/etc/inotify.sh &
好了本节就讲到这里,欢迎大家的批评指正,谢谢!