rsync+inotify实现数据实时同步备份
定时备份和实时备份
说到备份,无疑于定时备份和实时同步备份。定时备份可以通过脚本或者Crontab来实现,而实时同步备份可以通过某些接口监控文件的各种变化情况来实现的(比如内核接口inotify);通过对比可以发现对数据信息要求高的环境使用实时同步备份可以更好更有利的保护数据的安全性。
软件介绍之rsync
rsync说明
rsync 远程同步,同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的,而rsync说白了和复制差不多、能将一个文件从一个地方复制到另外一个地方的、但是他也可以实现跨主机复制,兼具了cp和scp的功能,但是在跨主机时不具备scp的加密功能。
rsync有一个特点,就是当你用rsync复制或跨主机复制时如果另一端也有一个同名的文件,他会先对比两个数据的md5码是不是一致,如果不一致就会复制,并覆盖,如果一致他将不会复制,所以这是一个快速复制工具,尤其是同步目录时,特别好用。
rsync常用选项
-a 归档,复制时可以保存原有的属主属组等属性信息,甚至包含一点额外的属性(如访问控制列表)
-v 详细输出模式、显示详细过程的
-q 静默模式,尽可能输出少的信息
-r 递归复制
-c 打开校验开关,强制对文件传输进行校验
-b 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项指定不同的备份文件前缀。可以使用--backup-dir将备份文件(~filename)存放在此目录下
-p 保留文件的权限
-t 保留文件的时间戳
-l 保留文件的符号链接
-g 保留文件的属组
-o 保留文件的属主
-n 显示哪些文件将被传输
-W 拷贝文件,不进行增量检查
--delete 删除那些DST中SRC没有的文件
--exclude 指定排除不需要传输的文件模式
--progress 在传输时显示传输过程(进度条)
--stats 显示状态
--password-file=FILE 指定从FILE中得到密码
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf
软件介绍之inotify
inotify介绍
Inotify 是一个Linux特性,是一种强大的、细粒度的、异步的文件系统监控机制,linux内核从2.6.13起便加入了Inotify支持,通过Inotify可以监控文件系统中添加、修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。Inotify反应灵敏,用法简单,并且比使用Crontab轮询高效很多。
inotify常见监控事件
IN_ACCESS: 文件被访问
IN_MODIFY: 文件被修改
IN_ATTRIB: 文件属性被修改
IN_CLOSE_WRITE: 以可写方式打开的文件被关闭
IN_CLOSE_NOWRITE: 以不可写方式打开的文件被关闭
IN_OPEN: 文件被打开
IN_MOVED_FROM: 文件被移出监控的目录
IN_MOVED_TO: 文件被移入监控着的目录
IN_CREATE: 在监控的目录中新建文件或子目录
IN_DELETE: 文件或目录被删除
IN_DELETE_SELF, 自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF, 自移动,即一个可执行文件在执行时移动自己
inotify-tools介绍
inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。inotify-tools提供的两个命令行工具(inotifywait,inotifywatch)就是可以监控文件系统下文件的各种变化情况。
工具一–inotifywait命令介绍:
inotifywait:通过inotify API等待被监控文件上相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。他可以监控对应监控对象上指定的事件后退出,也可以进行持续的监控。
inotifywait尤其适合用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将事件对应的文件同步到其他主机上。
工具一–inotifywait之常用选项介绍:
-m inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而是要此选项则可实现持续性的监控。
-r 递归监控指定目录下的所有文件,包含新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认为8192.
-e<event> 指定要监控的特定事件,默认是监控所有的事件,包括access,modify,attrib,close_write,close_nowirte,close,open,moved_to,moved_from,move,create,delete,delete_selt等;
--timefmt <fmt> 当在--format选项中使用%T时,--timefrt选项则可以用来自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常有的参数是'%d/%m/%y %H:%M';
--format <fmt> 自定义inotiywait的输出格式,如--format'%T %w %f';常有的选项如下:
%w 显示被监控文件的文件名;
%f 如果发生某些事件对象是目录,则显示被监控目录的名字;默认显示为空串;
%T 使用–timefmt选项中自定义的时间格式;
工具二–inotifywatch命令介绍:
通过inotify API收集被监控文件或目录的相关事件并输出统计信息。
配置rsyncd+inotify实现实时同步
环境介绍
目标主机 --> rsync服务器端:CentOS 6.5
源文件主机 --> rsync客户端:Ubuntu 12.04
配置rsync服务器端:
本次环境中采用rsync守护进程的方式进行数据同步。
安装rsync相关程序包
# rsync程序系统默认会安装,若没有安装可在此安装:
yum -y install rsync
# rsync服务通常基于超级守护进程xinetd管理的方式来实现因此需要安装xinetd
yum -y install xinetd
提供rsync配置文件
###创建配置文件目录###
#mkdir -p /etc/rsyncd
###创建rsync主配置文件###
touch /etc/rsyncd/rsyncd.conf
###这个配置文件有两部分组成,一是全局定义,二是定义rsync共享目录###
cat /etc/rsyncd.conf
# Global Settings 全局定义
uid =root #使用哪个用户运行或获取数据
gid = root #用户都以来宾账号的方式运行
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 #定义共享目录
[Git_rsync] #要同步的目录名称,多个目录名称不能重名
path = /data1/gitbackup/git/ #定义目录的路径
list = false #是否允许用户列出文件列表
read only = no #如果打算让别人仅仅是来拉取数据的,yes就可以了,如果打算让别人推送过来做备份的那就为no,表示客户端是否可以推送的
write only = no #只允别人在里面写数据,但不可以拉取数据
ignore errors = yes #表示如果中间同步过程有一个文件出错了是要继续同步还是中止同步,yes表示继续同步,no表示中止同步
hosts allow = 10.171.215.112 #白名单,那些主机可以访问
auth users = git #做用户验证(认证)的,只允许那个用户来同步
secrets file = /etc/rsyncd/rsyncd.secrets #存放验证(认证)用户的密码的
###由于守护进程程序xinetd是读取默认rsync的配置(/etc/rsyncd.conf)###
ln -sv /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
提供rsync认证用户密码文件
cat > /etc/rsyncd/rsyncd.secrets <EOF
git:huilian1234 #其中冒号前的是用户名,冒号后的是对应用户的密码
EOF
###由于此密码文件是明文显示,所以文件权限设为600###
chmod 600 /etc/rsyncd/rsyncd.secrets
设置rsync开机自启动
chkconfig rsync on
启动rsync服务
service xinetd start
查看rsync监听信息
netstat -tanlp | grep xinetd
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 27400/xinetd
默认情况下,rsyncd监听的端口为TCP:873
配置rsync客户端
确保内核支持inotify
客户端(源主机)需要实时监控指定目录中的所有文件与文件改变相关的事件,并在事件发生时将改变的数据同步到目录主机,因此,源主机需要确保内核支持inotify,并安装inotify-tools和rsync。
判断内核是否支持inotify方法有如下:
###确保内核版本高于2.6.13,低于则需重新编译内核###
uname -r
3.2.0-64-generic
###查看内核是否默认支持inotify—API###
ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 Sep 18 18:06 max_queued_events
-rw-r--r-- 1 root root 0 Oct 20 10:24 max_user_instances
-rw-r--r-- 1 root root 0 Sep 18 18:06 max_user_watches
既然说到了这里就简单介绍一下这三个分别有什么作用?
max_queued_events 表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃
max_user_instances 表示每一个real user ID可创建的inotify instatnces的数量上限
max_user_watches 表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches
安装相关程序包:
这里我采用的是源码编译安装
源码安装过程
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
./configure
make
make install
安装完成会生成两个二进制文件:
ll /usr/local/bin/inotify*
-rwxr-xr-x 1 root root 56956 Oct 16 17:54 /usr/local/bin/inotifywait*
-rwxr-xr-x 1 root root 53306 Oct 16 17:54 /usr/local/bin/inotifywatch*
创建密码文件
为源主机的rsync提供通过git用户同步文件目标主机的密码文件
touch /etc/rsync.passwd
echo 'huilian123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
创建监控脚本
通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步
cat > inotifyrsync.sh <EOF
#!/bin/bash
host=10.168.23.101
src=/home/git/
dst=Git_rsync
user=git
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/bin/rsync -avzP --exclude".gitolite/logs/*" --progress --password-file=/etc/rsync.passwd $src $user@$host::$dst &>/dev/null &&
echo "${files} was rsynced" >> /data/rsyncd/rsync.log 2>&1
done
EOF
chmod 755 inotifyrsync.sh
bash inotifyrsync.sh &
设置开机自启动
echo 'bash /data/rsyncd/inotifyrsync.sh &' >> /etc/rc.local