谈到文件同步,我们最直接的同步方式是采用rsync的同步软件,rsync同步可以保持server和client的强一致(server中的增删改都会同步client),但在实际场景中rsync可能并不能被采纳。考虑到多场景,我在此列出来常用的同步方式,以及对应的利弊。
当然除了上面说的三种方式,还有2种在生产环境中会优先考虑的:NAS和NFS
1、rsync:最常用的同步方式,也是做文件同步的首先,但在实际的工作中,由于传统企业并没有对开源软件保持开放的心态,所以在某些场合下,虽说是最好的解决方法,但不一定会被认可。
2、scp实现免密码文件同步:此方式采用scp定时复制,实现server和client的文件同步,但需要实现服务器之间的免密码登录服务器,弊端在于需要修改服务器的SSH核心配置项,这在某些场合中是被禁止的。
3、ftp实现文件同步:ftp实现的同步属于弱同步,不能严格意义上实现文件的同步(文件的增加和修改可以实现严格意义的一直,但删除ftp同步暂时无法实现),此方法是同步的旁门左道,到在某些特定的情况下,确十分被接纳。毕竟ftp比rsync更能被传统行业所认可。
4、NAS存储:(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。
5、NFS:NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NAS和NFS都是采用网络协议实现文件的共享,但区别在于NAS是硬件级别的实现,NFS是软件实现,相当于在做负载均衡的时候,keepalived和F5硬件负载的区别。
1、rsync同步实现
rsync目录同步,可以采用yum的方式,也可以采用源码编译,笔者就是采用rsync的源码方式进行的安装。且作者整理成安装脚本,完成的下载目录:
http://update.faqrobot.org/onekey/rsync.zip
(1)、rsync的安装
rsync的安装分为server和client的安装,此处作者将rsync安装在/iyunwen/server/rsync下面
其中的代码如下,rsync_server()为实现rsync的server,rsync_client()为实现rsync的client
#!/bin/bash rm -rf rsync-3.1.2 if [ ! -f rsync-3.1.2.tar.gz ];then wget https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz fi rsync_server() { tar -zxvf rsync-3.1.2.tar.gz cd rsync-3.1.2 mkdir -p /iyunwen/server/rsync/ mkdir -p /iyunwen/log/rsync/ ./configure --prefix=/iyunwen/server/rsync/ make make install ln -s /iyunwen/server/rsync/bin/rsync /usr/bin/rsync cd .. #mkdir -p /etc/rsyncd/ \cp -rf ./rsyncd /iyunwen/server/rsync/ mkdir -p /iyunwen/server/rsync/rsyncd chmod 600 /iyunwen/server/rsync/rsyncd/rsyncd.secrets echo "rsync --daemon --config=/iyunwen/server/rsync/rsyncd/rsyncd.conf" >> /etc/rc.local /iyunwen/server/rsync/bin/rsync --daemon --config=/iyunwen/server/rsync/rsyncd/rsyncd.conf netstat -nltup } rsync_client() { tar -zxvf rsync-3.1.2.tar.gz cd rsync-3.1.2 ./configure --prefix=/iyunwen/server/rsync/ make make install ln -s /iyunwen/server/rsync/bin/rsync /usr/bin/rsync cd .. mkdir -p /iyunwen/server/rsync/ mkdir -p /iyunwen/server/rsync/cron.daily.rsync/ cp -rf ./rsyncd/cron.daily.rsync/rsync_client.sh /iyunwen/server/rsync/cron.daily.rsync/ chmod 755 /iyunwen/server/rsync/cron.daily.rsync/rsync_client.sh mkdir -p /iyunwen/server/rsync/rsyncd/ cp -rf ./rsyncd/rsyncuser.password /iyunwen/server/rsync/rsyncd/ chmod 600 /iyunwen/server/rsync/rsyncd/rsyncuser.password echo "* * * * * root run-parts /iyunwen/server/rsync/cron.daily.rsync" >> /etc/crontab /etc/init.d/crond restart } real=`grep -l '\^H' /root/.bash_profile` if [ $? -eq 1 ];then echo 'stty erase ^H' >> /root/.bash_profile source /root/.bash_profile #这几行主要就是让在使用read键时能使用回删键。写错了,回删了,重启写。不用这段的话,回删键会变成乱码。 fi echo -e '\033[0;33;1m #################nagios################## \033[0m' #让echo能弄点颜色出来好看点。。。 echo "rsync server install please input : 1" echo "rsync client install please input : 2" echo -e '\033[0;33;1m ######################################### \033[0m' read -p "please chose : " frist #定义输入的值 if [ $frist -eq 1 ];then rsync_server else rsync_client fi
(2)、关于rsync核心配置项说明:
rsync的核心配置项,也为rsync所在的server端,配置项所在目录:
/iyunwen/server/rsync/rsyncd/rsyncd.conf
对于rsyncd.conf文件如下信息很重要:
模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点像Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的;
我们来个简单的示例:比如我们要备份服务器上的 /data/share 和/opt ,在/data/share中,我想把beinan和samba目录排除在外;
配置完成启动命令为:
/iyunwen/server/rsync/bin/rsync --daemon --config=/iyunwen/server/rsync/rsyncd/rsyncd.conf
如果存在失败,rsync的日志路径为:/var/log/messages
(3)、rsync client通过定时脚本实现同步
rsync server配置后,同步的命令为:
rsync -avzp --delete --password-file=/iyunwen/server/rsync/rsyncd/rsyncuser.password [email protected]::www /iyunwen/www/robot
参数说明
v:显示详细信息
z:传输过程中对数据进行压缩
r:递归
t:保留修改时间属性
o:保留文件所有者属性
p:保留文件权限属性
g:保留文件所属组属性
a:归档模式,主要保留文件属性,等同于-rlptgoD
--password-file=FILE:指定密码文件,将密码写入文件,实现非交互式数据同步,这个文件名也需要修改权限为600
--delete:删除那些仅在目标路径中存在的文件(源路径中不存在),在脚本中的数据同步经常加上此参数
在实际的同步过程中,如果同步的周期比较短,且同步的目录比较大,则会出现rsync锁住的情况,导致CPU特别高,或者同步异常,因此在生产环境中,
flock -xn /var/run/rsync.lock -c 'rsync -avzp --delete --password-file=/iyunwen/server/rsync/rsyncd/rsyncuser.password [email protected]::www /iyunwen/www/robot'
flock加入了锁机制,当前同步没有执行完毕,下次的同步是无法进行,避免了CPU的大量浪费
***************************
排除故障
***************************
1.@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
这是因为密码设错了, 无法登入成功, 请检查一下 rsyncd.scrt 中的密码, 二端是否一致?
2.password file must not be other-accessible
continuing without password file
Password:
这表示 rsyncd.scrt 的档案权限属性不对, 应设为 600。
3.@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
这通常是您的 rsyncd.conf 中的 path 路径所设的那个目录并不存在所致.请先用 mkdir开设好要备份目录
4.@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
最后原因终于找到了。因为有两个网段都需要同步该文件夹内容,但没有在hosts allow 后面添加另一个IP段
hosts allow = 192.168.1.0/24
改为
hosts allow = 192.168.1.0/24 192.168.2.0/24