CentOS 6.5 rsync+inotify实现数据实时同步备份

CentOS 6.5 rsync+inotify实现数据实时同步备份


rsync
   remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的,而rsync跟复制差不多能将一个文件从一个地方复制到另外一个地方,但是他也可以实现跨主机复制,兼具了cp和scp的功能,但是在跨主机时不具备scp的加密功能。
   rsync有个特点,就是当你用rsync复制或跨主机复制时如果另一端也有一个同名的文件,他会先比较这两个文件的特征码是不是一致,如果不一致就会复制,并覆盖,如果一致他将不会复制,所以说这是一个快速复制工具,尤其是同步目录时,特别好用。


rsync命令的工作模式有四种:
   1、shell模式,也称为本地模式,速度要比cp快
   2、远程shell模式,其可以借助于ssh协议承载其数据传输过程
   3、列表模式,其工作方式与ls相似,仅列出源的内容:-nv
   4、服务器模式,此时,rsync可以工作为守护进程,能够接收客户端的数据传输请求,在使用时可以在客户端使用rsync命令发送给守护进程,也可以向服务器主获取文件。


rsync命令的选项:
   -n:如果担心命令执行不正确,一同步复制,可能这个复制的后果是致命的,那后果可就严重了,这里我们可以加-n先测试一下
   -v: --verbose,详细输出模式、显示详细过程的
   -q: --quiet,静默模式,尽可能输出少的信息
   -c: --checksum,可以对传输的文件进行较验的,强制对文件传输进行校验
   -r: --recursive,递归复制
   -a: --archives,归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性、如访问控制列表
   -p: --perms,保存文件的权限
   -t: --times,保留文件的时间戳
   -l: --links,保留文件的符号链接
   -g: --group,保留文件的属组
   -o: --owner,保留文件的属主
   -D: --devices,保留设备文件 


   -e SSH:远程复制时,表示使用ssh协议作承载
   -z:基于网络时使用,对文件压缩后传输
   --progress:显示压缩进度条的
   --stats:显示如何执行压缩和传输的,也就是显示传输状态的


注意:rsync命令使用中,如果源参数的末尾有斜线,就会复制指定目录内容,而不复制目录本身;没有斜线,则会复制目录本身,因此有如下命令:
   # rsync -r /mydata/data /backups/:会把目录data直接同步至/backups目录中去
   # rsync -r /mydata/data/ /backups/:会把目录中的data/中的内容同步至/backups目录中


rsync本地用法:
   # cp -r /etc /tmp/
   # mkdir /tmp/test
   # rsync /tmp/etc/passwd /tmp/test/passwd -nv
推送到远程主机上去,把本地的etc文件推送到172.16.251.244主机上去:
   # rsync -r -e ssh /tmp/etc root@192.168.3.17:/tmp/


拉取远程服务器上的文件:
   # rsync -e ssh -r -a root@192.168.3.17:/etc/pam.d ./ --stats


把文件推送到服务器端上去:
# rsync -auzv messages myuser192.168.3.17::my_data_rsync


如果我们从服务器上拉取文件时必须要指定文件路径
# rsync myuser@192.168.3.17::my_data_rsync/messages /tmp/


Inotify 
   Inotify 是一个 Linux特性,是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。Inotify 反应灵敏,用法非常简单,并且比 crontab 任务的繁忙轮询高效得多。


=====================rsync+inotify实现实时同步过程============================================
这里我们以两台服务器来做这个实验:


以下步骤在从服务上操作:
配置rsync以daemon的方式运行:也就是在服务器端以守护进程的方式运行
1、设定rsync服务器端
1)安装相关的程序包,他是基于xinetd工作的,超级守护进程
# yum -y install xinetd
安装好之后在/etc/xinetd.d/这个目录下有一个rsync的文件 
2)为rsync服务提供配置文件,而他的配置文件在/etc/rsyncd.conf,这个配置文件大概由两部分组成,一部分定义全局的,另一部分可以定义多个rsync共享目录: 


# Global Settings 全局设定
uid = nobody :以哪个用户的身份运行或获取数据的
gid = nobody :用户都以来宾帐号的方式运行
use chroot = no :在服务运行时要不要把他锁定在家目录
max connections = 10 :做为服务器端最大并发连接数
strict modes = yes :表示是否工作在严格模式下,严格检查文件权限等相关信息
pid file = /var/run/rsyncd.pid : 定义pid文件路径
log file = /var/log/rsyncd.log : 定义日志文件存放路径的
# Directory to be synced  定义共享目录的模块
[my_data_rsync] 要同步的目录名称,多个目录名称是不能重名的
path = /myrsync/data : 定义目录的路径
ignore errors = yes : 表示如果中间复制过程有一个文件出错了是要继续复制还是中止复制,yes表示继续复制,no表示中止复制
read only = no :如果打算让别人仅仅是来拉取数据的,yes就可以了,如果打算让别人推送过来做备份的那就为no,表示客户端是否可以推送的
write noly = no :只允别人在里面写数据,但不可以拉取数据
hosts allow = 192.168.3.17:做白名单的,是否允许哪些主机可以访问的
hosts deny = * :黑名单的
    说明:
    1、二者都不出现时,默认为允许访问
    2、只出现hosts allow,定义白名单,但没有被匹配到的主机由默认规则处理,即为允许
    3、只出现hosts deny,定义黑名单,出现在名单中的都被拒绝
    4、二者同时出现,先检查hosts allow,如果匹配就allow,否则检查hosts deny,如果匹配则拒绝,如是二者都不匹配,则由默认规则处理,即为允许
list = false :是否允许用户列出文件列表的
uid = root :以哪个用户身份去获取文件的
gid = root
auth users = myuser:做用户验证的,只允许哪个用户来复制
secrets file = /etc/.rsync.passwd :存放验证用户的密码的


******************************************************************************
vim /etc/rsyncd.conf


# Global Settings 全局设定
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Directory to be synced
[my_data_rsync]
path = /data/myrsync
ignore errors = yes
read only = no
write noly = no
hosts allow = 192.168.3.17
hosts deny = *
list = false
uid = root
gid = root
auth users = myuser
secrets file = /etc/.rsync.passwd


******************************************************************************
#配置密码文件/etc/.rsyncd.passwd,文件格式是明文的,所以文件权限设为600:
# vim /etc/.rsyncd.passwd
myuser:mypasswd
# chmod 600 /etc/.rsyncd.passwd
#配置服务能够启动,监听在873/tcp端口上
# chkconfig rsync on
# service xinetd start


验证服务是否启动
# ss -tnlp|grep 873
LISTEN     0      64                       :::873                     :::*      users:(("xinetd",39616,5))


接下来在内容发布的服务器上操作:
由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持,也可以用如下方法判断,内核是否支持inotify:
# uname -r
2.6.32-431.el6.x86_64
查看内核是否支持inotify API,如果有以下三项,表示系统已经默认支持inotify,接着就可以开始安装inotify-tools了


# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Nov  7 10:29 max_queued_events
-rw-r--r-- 1 root root 0 Nov  7 10:29 max_user_instances
-rw-r--r-- 1 root root 0 Nov  7 10:29 max_user_watches


简单介绍一下这三个文件是做什么用的:
   max_queued_evnets:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
   max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限。
   max_user_watches:表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches


查看完相关的安装环境后那接下来我们就可以安装inotify-tools这个程序包了,直接yum安装:


# yum install -y inotify*


创建一个目录存放要同步的数据:
# mkdir -p /data/myrsync_data
# cd /data/myrsync_data
# vim inotifyrsync.sh


#!/bin/bash
host=192.168.3.16 #从服务器的主机地址
data_dir=/data/myrsync_data #内容发布服务器上创建的同步数的路径
dst=my_data_rsync #从服务器上导出的共享目录,可参考从服务器的/etc/rsyncd.conf配置文件
username=myuser #从服务器上/etc/.rsyncd.passwd这个文件中定义的用户名


#绝对路径执行inotifywait这个程序,
#-m, 即--monitor,表示始终保持事件监听状态。
#-r, 即--recursive,表示递归查询目录。
#-q, 即--quiet,表示打印出监控事件。
#-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。
#--timefmt:指定时间的输出格式。
#--format:指定变化文件的详细信息。
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files
        do
                /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $data_dir $username@$host::$dst
                echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 #写入日志
        done


******************************************************************************
#!/bin/bash
host=192.168.3.16
data_dir=/data/myrsync_data
dst=/data/myrsync
username=myuser


/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files
do
        /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $data_dir $username@$host::$dst
        echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 #写入日志
done


******************************************************************************
#保存退出
# chmod 755 inotifyrsync.sh
# 加入验证的密码
# vim /etc/rsyncd.passwd
mypasswd
修改权限
# chmod 600 /etc/rsyncd.passwd
# -x可以看到具体的调试信息,当调试通过以后再后台执行
# /bin/bash -x inotifyrsync.sh
在从服务器上观察发现已经有文件同步成功,说明实验是ok的


# /bin/bash inotifyrsync.sh &



posted @ 2016-11-07 11:43  reblue520  阅读(240)  评论(0编辑  收藏  举报