linux运维总结十六:Rsync 文件同步
Rsync(remote sync)是UNIX及类UNIX平台下一款神奇数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync可以使用SSH安全遂道进行加密数据传输。Rsync服务器端定义源数据,Rsync客户端源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据敢会被 删除,以确保主机之间数据是同步的。Rsync使用TCP 873端口
1、搭建Rsync服务器
部署Rsync服务器需要创建至少一个配置文件,默认在系统中并不存在Rsync配置文件,对于服务器而言,配置文件创建完成后,使用守护进程模式启动Rsync程序即可。下面将创建配置文件,将/common目录发布给所有客户端主机。因为Rsync是Andrew Tridgell(Samba的作者)与Paul Mackerras 合作开发的软件,所以Rsync配置文件与Samba配置文件比较相似。Rsync主要分为三个配置文件,分别是:rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)和 rsyncd.motd(服务器信息文件)
使用CentOS 6.3 系统安装部署Rsync非常方便,安装光盘以及 YUM源中都提供了Rsync软件包,使用YUM方式安装即可。下面案例演示了如何共享/common目录,为些,我们需要创建/common目录,并复制一些测试文件存放在该目录下。本例需要手动创建配置文件/etc/rsync.conf,该文件具语法格式在后面详细描述。
[root@agent ~]# yum -y install rsync
[root@agent ~]# mkdir /common;cp /etc/init.d/* /common/
[root@agent ~]# vi /etc/rsyncd.conf
#/etc/rsyncd.conf
#设置服务器信息提示文件名称,在该文件中编写提示信息
motd file = /etc/rsyncd.motd
#开启Rsync数据传输日志功能
transfer logging = yes
#设置日志文件名称,可以通过log format参数设置日志格式
log file = /var/log/rsyncd.log
#设置Rsync进程号保存文件名称
pid file = /var/run/rsyncd.pid
#设置锁文件名称
lock file = /var/run/rsync.lock
#设置服务器监听的端口号,默认为873
port = 873
#设置服务器所监听网卡接口的IP地址,这里服务器IP地址为192.168.0.254
address = 192.168.0.254
#设置进行数据传输时所使用的账户名称或ID号,默认使用nobody
uid = nobody
#设置进行数据传输时所使用的组名称或GID号,默认使用nobody
gid = nobody
#设置user chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,对客户
#端而言,系统的根就是path参数所指定的路径。但这样做需要root权限,并且在同步符号
#连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
#是否允许客户端上传数据,这里设置为只读。
read only = yes
#设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会收
#到稍后重试的提示消息
max connections = 10
#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义,这与Samba定义共
#享目录是一样的效果。在Rsync中也可以定义多个模块
[common]
#comment定义注释说明字串
comment = Web content
#同步目录的真实路径通过path指定
path = /common
#忽略一些IO错误
ignore errors
#exclude可以指定例外的目录,即将common目录下的某个目录设置为不同步数据
#exclude = test/
#设置允许连接服务器的账户,账户可以是系统中不存在的用户
auth users = tom,jerry
#设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为600,仅在设置auth users
#参数后有效
secrets file = /etc/rsyncd.secrets
#设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段之间使用空
#格分隔
hosts allow=192.168.0.0/255.255.255.0
#设置拒绝所有(除hosts allow定义的主机外)
hosts deny=*
#客户端请求显示模块列表时,本模块名称是否显示,默认为true
list = false
接下来,通过echo 的方式创建密码文件/etc/rsyncd.secredts,在该文件中输入两个帐户:tom帐户的密码是pass,jerry帐户密码是111。需要注意是,密码文件不可以对所有人开放可读权限,为了安全,建议设置为600。创建服务器提示信息文件并向该 文件中导入欢迎词。由于 Rsync默认不是开机启动服务,为了实现开机启动 Rsync服务,我们可以通过echo将 rsync -daemon追加至开机启动文件/etc/rc.local。最后通过设置iptables开启873端口入站数据请求。
[root@agent ~]# echo "tom:pass">/etc/rsyncd.secrets
[root@agent ~]# echo "jerry:111">/etc/rsyncd.secrets
[root@agent ~]# chmod 600 /etc/rsyncd.secrets
[root@agent ~]# echo "welcome to access" >/etc/rsyncd.motd
[root@agent ~]# rsync --daemon
Failed to parse config file: /etc/rsyncd.conf
[root@agent ~]# mv /etc/rsync.conf /etc/rsyncd.conf
[root@agent ~]# rsync --daemon
[root@agent ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local
2、客户端同步数据
现在让我们开始同步数据吧,在客户端主机中同样使用rsync命令进行初始化数据传输,使用同样的程序,但客户端主机不需要--daemon选项。
[root@puppet tmp]# yum -y install rsync
[root@puppet /]# rsync -vzrtopg --progress tom@192.168.32.201::common /test
备注:问题处理:
rsync错误:@ERROR:auth failed on module XXX解决
@ERROR: auth failed on module XXX
其中,XXX 表示你的远程rsync服务模块名称。
出现这种情况,先检查你的用户名和密码是否正确,如果都正确,有一个可能是原因是:远程rsync服务器的帐户密码文件的权限必须为600,例如,你在rsyncd.conf中设置了secrets file = /etc/rsyncd/rsync_pwd
那么你就必须确保rsync_pwd的访问权限为600:
chmod 600 /etc/rsyncd/rsync_pwd
二、Rsync + Inotify 实现文件自动同步
如果仅使用Rsync进行数据同步,只能满足企业对数据实时性要求不高的环境,即使使用计划任务也仅可以实现定期数据同步。而且使用Rsync在进行数据同步前需要对所有文件进行对比,然后进行差异数据同步,然而我们数据可能只是 1TB数据中1KB数据发生了改变,在不知道什么时候会发生数据改变的情况下。为了同步1KB数据,我们需要不停地进行Rsync连接,对比客户端与服务器之间数据差异,这样机制在当前大数据时代背景下是低效的。往往数据变化随时都有可能发生,如果多台主机之间要求当数据发生变化后进行实时同步,就需要结合Inotify(inode notify)工具。目前Inotify已经被集成到linux内核中,Inotify为用户态应用程序提供了文件系统事件通告机制,比如,当发生文件访问,修改以及删除等事件时,可以立刻通告给用户态应用程序,通过Inotify可以实时了解文件系统发生所有变化。
1、源码安装软件
我们可以去官网下载源码包安装部署软件,下载源码文件解压后,可以查看对应的install安装说明,根据新版本文档说明,需要使用autogen.sh脚本读取configure.ac文件来创建configure安装脚本。而些步骤需要依赖于automake及libtool软件包,如果采用的是yum方式安装这两依赖软件包,系统会将编译inotify-tool警方所需要的gcc软件也一起安装。
[root@agent ~]# yum -y install automake libtool
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@agent inotify-tools-3.14]# ./configure
[root@agent inotify-tools-3.14]# make && make install
2、监控数据
inotify-tool 提供了两个应用程序,分别为inotifywait 与inotifywatch。
实例1:创建测试目录/test 和测试文件/test/foo ,运行inotifywait命令监控/test目录,然后开启一个终端窗口运行命令cat /test/foo,验证当发生查看文件事件时,是否会有事件通知。
[root@agent ~]# /usr/local/bin/inotifywait /test/
打开另一个SSH终端更新foo内容,这样就出现 /test/ OPEN foo通知信息
3、Rsync 与Inotify双剑合璧
单一Rsync工具公可以进行数据同步,单Inotify仅可以实现 褚文件监控,而两者的结合 将能满足企业对数据中心实时数据同步要求。
首先在多台web服务器部署Rsync服务器,这些Rsync 服务器要能够提供客户端上传功能,以实现客户端主机将推送至Rsync服务器上,所以只要在192.168.32.201主机上修改数据,就要以实时推送到其他web服务器。