设为首页 收藏本站
查看: 1275|回复: 0

[经验分享] rsync+inotify实现Git数据实时同步备份

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-10-22 11:07:18 | 显示全部楼层 |阅读模式
定时备份和实时备份       说到备份,无疑于定时备份和实时同步备份。定时备份可以通过脚本或者Crontab来实现,而实时同步备份可以通过某些接口监控文件的各种变化情况来实现的(比如内核接口inotify);通过对比可以发现对数据信息要求高的环境使用实时同步备份可以更好更有利的保护数据的安全性。
软件介绍之rsyncrsync说明       rsync 远程同步,同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的,而rsync说白了和复制差不多、能将一个文件从一个地方复制到另外一个地方的、但是他也可以实现跨主机复制,兼具了cp和scp的功能,但是在跨主机时不具备scp的加密功能。
       rsync有一个特点,就是当你用rsync复制或跨主机复制时如果另一端也有一个同名的文件,他会先对比两个数据的md5码是不是一致,如果不一致就会复制,并覆盖,如果一致他将不会复制,所以这是一个快速复制工具,尤其是同步目录时,特别好用。

rsync常用选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-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



软件介绍之inotifyinotify介绍      Inotify 是一个Linux特性,是一种强大的、细粒度的、异步的文件系统监控机制,linux内核从2.6.13起便加入了Inotify支持,通过Inotify可以监控文件系统中添加、修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。Inotify反应灵敏,用法简单,并且比使用Crontab轮询高效很多。
inotify常见监控事件
1
2
3
4
5
6
7
8
9
10
11
12
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:通过inotifyAPI等待被监控文件上相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。他可以监控对应监控对象上指定的事件后退出,也可以进行持续的监控。
       inotifywait尤其适合用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将事件对应的文件同步到其他主机上。

工具一--inotifywait之常用选项介绍:
1
2
3
4
5
6
7
8
9
10
11
12
-m          inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而是要此选项则可实现持续性的监控。

-r          递归监控指定目录下的所有文件,包含新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认为8192.

-e   指定要监控的特定事件,默认是监控所有的事件,包括access,modify,attrib,close_write,close_nowirte,close,open,moved_to,moved_from,move,create,delete,delete_selt等;

--timefmt      当在--format选项中使用%T时,--timefrt选项则可以用来自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常有的参数是'%d/%m/%y %H:%M';

--format       自定义inotiywait的输出格式,如--format'%T %w %f';常有的选项如下:
         %w         显示被监控文件的文件名;
         %f         如果发生某些事件对象是目录,则显示被监控目录的名字;默认显示为空串;
         %T         使用–timefmt选项中自定义的时间格式;



工具二--inotifywatch命令介绍:      通过inotifyAPI收集被监控文件或目录的相关事件并输出统计信息。
配置rsyncd+inotify实现实时同步环境介绍
1
2
3
目标主机-->rsync服务器端:CentOS 6.5

源文件主机-->rsync客户端:Ubuntu 12.04



配置rsync服务器端:    本次环境中采用rsync守护进程的方式进行数据同步。
安装rsync相关程序包
1
2
3
4
5
###rsync程序系统默认会安装,若没有安装可在此安装###
[iyunv@mon-zabbix ~]# yum -y install rsync

###rsync服务通常基于超级守护进程xinetd管理的方式来实现因此需要安装xinetd###
[iyunv@mon-zabbix ~]# yum -y install xinetd



提供rsync配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
###创建配置文件目录###
[iyunv@mon-zabbix ~]#mkdir -p /etc/rsyncd

###创建rsync主配置文件###
[iyunv@mon-zabbix ~]#touch /etc/rsyncd/rsyncd.conf

###这个配置文件有两部分组成,一是全局定义,二是定义rsync共享目录###
[iyunv@mon-zabbix ~]# 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)###
[iyunv@mon-zabbix ~]#ln -sv /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf



提供rsync认证用户密码文件
1
2
3
4
5
[iyunv@mon-zabbix ~]#vim /etc/rsyncd/rsyncd.secrets
git:hui1234        #其中冒号前的是用户名,冒号后的是对应用户的密码

###由于此密码文件是明文显示,所以文件权限设为600###
[iyunv@mon-zabbix ~]#chmod 600 /etc/rsyncd/rsyncd.secrets



设置rsync开机自启动
1
[iyunv@mon-zabbix ~]#chkconfig rsync on



启动rsync服务
1
[iyunv@mon-zabbix ~]#service xinetd start



查看rsync监听信息
1
2
3
[iyunv@mon-zabbix ~]# 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方法有如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
###确保内核版本高于2.6.13,低于则需重新编译内核###
root@mon11:~# uname -r
3.2.0-64-generic

###查看内核是否默认支持inotify—API###
root@mon11:~# 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



安装相关程序包:    这里我采用的是源码编译安装
源码包下载地址
1
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz



源码安装过程
1
2
3
4
5
root@mon11:~# tar xf inotify-tools-3.14.tar.gz
root@mon11:~# cd inotify-tools-3.14/
root@mon11:~/inotify-tools-3.14#./configure
root@mon11:~/inotify-tools-3.14# make
root@mon11:~/inotify-tools-3.14# make install



安装完成会生成两个二进制文件:
1
2
3
root@mon11:~# 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用户同步文件目标主机的密码文件
1
2
3
root@mon11:~# touch /etc/rsync.passwd
root@mon11:~# echo 'huilian123' > /etc/rsync.passwd
root@mon11:~# chmod 600 /etc/rsync.passwd



创建监控脚本   通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步
1
2
3
4
5
6
7
8
9
10
11
12
13
root@mon11:/data/rsyncd# vim inotifyrsync.sh
#!/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
root@mon11:/data/rsyncd#chmod 755 inotifyrsync.sh
root@mon11:/data/rsyncd# bash inotifyrsync.sh &



设置开机自启动
1
root@mon11:/data/rsyncd# echo 'bash /data/rsyncd/inotifyrsync.sh &' >> /etc/rc.local



结果展示




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-26509-1-1.html 上篇帖子: 用Python爬取LeetCode的AC代码到Github 下篇帖子: CentOS Git服务安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表