rsync+sersync+inotify实现服务器间文件同步之一
一、概述
前面讲了很多集群的内容,集群间服务器实现数据的同步一直是一个问题,比如一个lvs集群中,如果有上百台RS服务器,当更新Web程序时,如何在这么多台服务器间进行快速的更新,这是一个问题,如果使用手动更新,或者scp等命令,明显是不可取的。因此,今天介绍这样一组工具实现这样的应用,后面也会讲到puppet等工具的使用。
1.1 什么是rsync?
rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输。rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个目标只需要一次传送。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。
在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输协议或者通过远程shell如RSH或者SSH伺服文件。SSH情况下,rsync客户端运行程序必须同时在本地和远程机器上安装。
1.2 什么是sersync?
sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发。目前使用的比较多的同步解决方案是inotify-tools+rsync ,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的。相比较上面两个项目,本项目优点是:
sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
1.3 什么是inotify?
inotify是Linux核心子系统之一,做为文件系统的附加功能,它可监控文件系统并将异动通知应用程序。本系统的出现取代了旧有Linux核心里,拥有类似功能之dnotify模块。inotify的原始开发者为John McCutchan、罗伯特·拉姆与Amy Griffis。于Linux核心2.6.13发布时(2005年六月十八日),被正式纳入Linux核心。尽管如此,它仍可通过补丁的方式与2.6.12甚至更早期的Linux核心集成。
因此,利用inotify的文件系统更改通知功能,结合rsync和sersync等工具,就能很好的实现当主服务器文件变动后能及时更新到其他服务器。
1.4 单纯使用rsync和使用serync+rsync的区别:
使用rsync+crontab做定时同步时,主服务器端开启rsync守护进程,而镜像服务器是运行rsync客户端,平时一般会利用crontab定时获取rsync服务器上的数据。
但使用rsync+sersync做实时同步时,用于推送文件的服务器运行sersync服务,用于接收文件的服务器则运行rsync守护进程,简单来说就是sersync会利用rsync命令将文件推送到rsync服务器,实际线上使用一般会把sersync作为主服务器,rsync作为镜像服务器,实现数据同步备份,web镜像等功能。
二、安装和使用rsync
2.1 rsync的安装
每个镜像服务器(需要同步的服务器)都需要安装rsync守护进程。
一般发行版都带有rsync,因此我这里直接使用yum安装。当然在很多发行版上默认已经安装了rsync。
[root@web1 ~]# yum install rsync
[root@web1 ~]# rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.0.6
/usr/share/doc/rsync-3.0.6/COPYING
/usr/share/doc/rsync-3.0.6/NEWS
/usr/share/doc/rsync-3.0.6/OLDNEWS
/usr/share/doc/rsync-3.0.6/README
/usr/share/doc/rsync-3.0.6/support
/usr/share/doc/rsync-3.0.6/support/Makefile
/usr/share/doc/rsync-3.0.6/support/atomic-rsync
/usr/share/doc/rsync-3.0.6/support/cvs2includes
/usr/share/doc/rsync-3.0.6/support/deny-rsync
/usr/share/doc/rsync-3.0.6/support/file-attr-restore
/usr/share/doc/rsync-3.0.6/support/files-to-excludes
/usr/share/doc/rsync-3.0.6/support/git-set-file-times
/usr/share/doc/rsync-3.0.6/support/logfilter
/usr/share/doc/rsync-3.0.6/support/lsh
/usr/share/doc/rsync-3.0.6/support/mnt-excl
/usr/share/doc/rsync-3.0.6/support/munge-symlinks
/usr/share/doc/rsync-3.0.6/support/rrsync
/usr/share/doc/rsync-3.0.6/support/rsyncstats
/usr/share/doc/rsync-3.0.6/support/savetransfer.c
/usr/share/doc/rsync-3.0.6/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
rsync是由超级守护进程xinetd来启动的。因此需要启动xinetd服务。
2.2 配置rsync服务器
rsync服务器主要有三个配置文件:rsyncd.conf,rsyncd.secrets和rsyncd.motd,而rsync安装后并没有自动创建相关配置文件,因此我们还需手动创建:
[root@web1 ~]# mkdir /etc/rsyncd ##创建配置目录
[root@web1 ~]# touch /etc/rsyncd/rsyncd.conf ##创建主配置文件
[root@web1 ~]# touch /etc/rsyncd/rsyncd.secrets ##创建用户密码文件
[root@web1 ~]# chmod 600 /etc/rsyncd/rsyncd.secrets ##修改用户密码文件
[root@web1 ~]# touch /etc/rsyncd/rsyncd.motd ##创建定义服务器信息的文件
编辑主配置文件:
[root@web1 ~]# vi /etc/rsyncd/rsyncd.conf
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873 ##监听端口
address = 192.168.204.129 ##监听地址
#uid = nobody
#gid = nobody
uid = root
gid = rootuse chroot = yes ##是否限制在指定目录,为了安装,一般需要启用
read only = no#limit access to private LANs
hosts allow=192.168.204.0/255.255.255.0 ##允许网段
hosts deny=*max connections = 5
motd file = /etc/rsyncd/rsyncd.motd#This will give you a separate log file
#log file = /var/log/rsync.log#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yeslog format = %t %a %m %f %b
syslog facility = local3
timeout = 300##定义一个同步目录
[webhome]
path = /var/www/html
list=yes
ignore errors
auth users = apache
secrets file = /etc/rsyncd/rsyncd.secrets ##指定上述账号密码文件
comment = web homeexclude = data/ ##排除目录
编辑/etc/rsyncd/rsyncd.secrets文件:
[root@web1 ~]# vi /etc/rsyncd/rsyncd.secrets
apache:password123
##注意,这个账号是系统账号,但没有使用系统账号的密码,而是自定义密码
重启使rsync生效:
[root@web1 ~]# /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
设置为开机启动:
[root@web1 ~]# echo "/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf" >> /etc/rc.d/rc.local
2.3 使用rsync客户端实现数据同步
客户端安装同上,额外只需配置一个密码文件,具体如下:
[root@web2 ~]# mkdir /etc/rsyncd ##创建配置目录
[root@web2 ~]# echo “passowd123”> /etc/rsyncd/rsyncd.password ##创建密码文件,密码为服务器端rsyncd.secrets文件中的密码。[root@web2 ~]# chmod 600 /etc/rsyncd/rsyncd.password
同步:
[root@web2 ~]# rsync -avzP --delete --password-file=/etc/rsyncd/rsyncd.password apache@web1::webhome /var/www/html/
receiving incremental file list
./
index.html
22 100% 21.48kB/s 0:00:00 (xfer#1, to-check=1/3)
newpage.html
26 100% 0.63kB/s 0:00:00 (xfer#2, to-check=0/3)sent 100 bytes received 264 bytes 728.00 bytes/sec
total size is 48 speedup is 0.13
说明:
--delete:本地与服务器完全一样,如果本地存在不一样的,则删除,慎用
--password-file:指定密码文件,如果不指定,则需手动输入
-a :参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z :传输时压缩;
-P :传输进度;
-v :传输时的进度等信息
apache@web1::webhome 用双冒号引用主配置文件中的定义资源,也可以使用单引号跟绝对路径
以后同步时,只会同步新增内容。
最后将上述命令加入计划任务定时同步即可。
可能存在的问题:
- 防火墙端口开发问题:iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
- 权限问题,需要写权限