谈到文件同步,我们最直接的同步方式是采用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
重新启动rsync服务,问题解决
5.rsync: failed to connect to 172.21.50.8: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的873端口打开
启动服务:rsync --daemon --config=/etc/rsyncd.conf
6.@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
client端没有设置/etc/rsync.pas这个文件,而在使用rsync命令的时候,加了这个参数--password-file=/etc/rsync.scrt
7.rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28)
*** Skipping any contents from this failed directory ***
磁盘空间满了
8.rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)
同步目录的权限设置不对,改为755
9.rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]
未启动xinetd守护进程
[root@CC02 /]# service xinetd start
10.rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory
xnetid查找的配置文件位置默认是/etc下,在/etc下找不到rsyncd.conf文件
11.rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
连接服务器超时,检查服务器的端口netstat –tunlp,远程telnet测试
12.[root@client cron.daily.rsync]# sh root.sh
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(175) [Receiver=3.0.9]
创建密码文件,root用户用的是 rsyncroot.password,权限是600
13.如何通过ssh进行rsync,而且无须输入密码?
可以通过以下几个步骤
1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了。e.g. ssh -l userB serverB。这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。
14.如何通过在不危害安全的情况下通过防火墙使用rsync?
解答如下:
这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd 仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防 火墙打开TCP端口22的ssh外发连接就ok了。
15.我能将更改过或者删除的文件也备份上来吗?
当然可以。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup- 2000-2-13/path/to/some/file.c,这里这个目录需要自己手工建立起来
16.我需要在防火墙上开放哪些端口以适应rsync?
视情况而定。rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:
rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:
17.我如何通过rsync只复制目录结构,忽略掉文件呢?
rsync -av --include '*/' --exclude '*' source-dir dest-dir
18.为什么我总会出现"Read-only file system"的错误呢?
看看是否忘了设"read only = no"了
19.为什么我会出现'@ERROR: invalid gid'的错误呢?
rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = ogroup或者其它
20.绑定端口873失败是怎么回事?
如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用--port参数来改变。
21.为什么我认证失败?
从你的命令行看来:你用的是
> bash$ rsync -a 144.16.251.213::test test
> Password:
> @ERROR: auth failed on module test
>
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.
应该是没有以你的用户名登陆导致的问题,试试rsync -a [email protected]::test test
22.出现以下这个讯息, 是怎么一回事?
@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.secrets 中的密码设定, 二端是否一致?
23.出现以下这个讯息, 是怎么一回事?
password file must not be other-accessible
continuing without password file
Password:
这表示 rsyncd.secrets 的档案权限属性不对, 应设为 600。请下 chmod 600 rsyncd.secrets
24.出现以下这个讯息, 是怎么一回事?
@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开设好备份目录.完!
2、scp实现免密码文件同步
原理:
- 客户端向服务器端发出连接请求
- 服务器端向客户端发出自己的公钥
- 客户端使用服务器端的公钥加密通讯密钥然后发给服务器端
- 如果通讯过程被截获,由于窃听者即使获知公钥和经过公钥加密的内容,但不拥有私 钥依然无法解密(RSA算法)
- 服务器端接收到密文后,用私钥解密,获知通讯密钥
实现从A服务器SSH B服务器不需要密码
A服务器地址:192.168.0.3,下面简称A 账号:root
B服务器地址:192.168.0.4,下面简称B 账号:root
检查A服务器如下配置项是否OK
(1)、关闭防火墙和selinux
service iptables stop
setenforce 0(修改vim /etc/selinux/config,将SELINUX=disabled)
(2)、修改ssh配置文件/etc/ssh/sshd_config,将如下行的注释去掉
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
在A生成秘钥对
ssh-keygen -t rsa
执行上述命令,一路回车,会在当前登录用户的home目录下的.ssh目录下生成id_rsa和id_rsa.pub两个文件,分别代表密钥对的私钥和公钥,如下图所示:
拷贝A的公钥(id_rsa.pub)到B服务器
这里拷贝到B的root用户home目录下为例:
scp /root/.ssh/id_rsa.pub root@192.168.0.4:/root/
登录B服务器
拷贝A的id_rsa.pub内容到.ssh目录下的authorized_keys文件中
cd /root
cat id_rsa.pub >> .ssh/authorized_keys
将authorized_keys文件修改权限:chmod 600 authorized_key,如果不修改可能引起一些列问题,这步完成后,正常情况下就可以无密码登录本机了,即ssh localhost,无需输入密码
此时在A中用SSH登录B或者向B拷贝文件,将不需要密码
ssh root@192.168.0.4
scp abc.txt root@192.168.0.4:/root
当然,强大的linux也有方便的工具快速实现SSH免密码登录,ssh-copy-id
在A服务器中执行:
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
在第一次输入B的密码之后,在SSH B服务器,就不需要输入密码了
scp实现文件同步
B服务器中用SCP的命令,实现A和B的文件同步:
将定时同步加入事务(此处将scp_121_to_local_rsync.sh放在/iyunwen/bin/scp_rsync目录下面):
echo ‘*/30 * * * * root run-parts /iyunwen/bin/min_job’ >> /etc/crontab
重启事务:/etc/init.d/crond restart
3、ftp实现文件同步
意见部署的脚本连接为:update.faqrobot.org/onekey/ftp_rsync.zip
部分脚本如下,脚本由4个函数完成,judge_evn()用来判断服务器的环境是否OK,包括权限用户、文件目录等,install_ftp_server()函数搭建ftp服务,ftp_set_rsync()实现client和server的同步配置。
#!/bin/bash nginx_install_user=root ####rsync_upload_server_dir为后台upload所在目录 ftp_server_ip=192.111.35.121 ftp_server_web_user=www ftp_server_web_password=Faqrobot2018 ###ftp_server_rsync_web_dir是前段页面所在目录,不到robot4,到robot4的上级目录 ftp_server_rsync_web_dir=/iyunwen/www ftp_server_upload_user=upload ###ftp_server_rsync_upload_dir是后台upload所在目录,不到upload,到upload的上级目录 ftp_server_rsync_upload_dir=/home/wasadmin/faqrobot-web/faqrobot-web_war.ear/faqrobot-web.war judge_evn() { echo "判断操作用户权限,要求部署操作采用root进行" operation_user=`whoami` if [ $operation_user != "root" ];then echo "操作的用户不是root权限,不满足部署条件,请用root权限部署,系统退出" exit 100 else echo "操作用户为root,满足部署条件" fi echo "第一步:执行yum操作" yum clean all &>/dev/null yum -y install gcc gcc-c++ gcc-g77 make kernel-headers glibc-headers libnl-devle libtool bc php-fpm autoconf patch unzip automake libxml2 libxml2-devel ncurses ncurses -devel libtool-ltdl-devel libtool-ltdl libmcrypt libmcrypt-devel libpng libpng-devel libjpeg-devel openssl openssh-clients openssl-devel curl curl-devel libxml2 libxml 2-devel ncurses ncurses-devel libtool-ltdl-devel libtool-ltdl autoconf automake lrzsz wget dmidecode vim libaio* zip ntpdate openssl* popt* ipvsadm libnl-dev* python e xpect numactl-libs rm -rf install_soft if [ -e install_soft.zip ];then echo "install_soft.zip exist,unzip install_soft.zip" unzip install_soft.zip else echo "install_soft.zip not exist please check,system exist" exit 100 fi } install_ftp_server() { judge_evn yum -y remove vsftpd yum -y install vsftpd \cp -f ./install_soft/config-ftp/rpm_ftp/* /etc/vsftpd/ /etc/init.d/vsftpd start userdel $ftp_server_web_user groupadd $ftp_server_web_user useradd -g $ftp_server_web_user -M -d $ftp_server_rsync_web_dir -s /sbin/nologin $ftp_server_web_user &> /dev/null chown -R $ftp_server_web_user:$ftp_server_web_user $ftp_server_rsync_web_dir userdel $ftp_server_upload_user groupadd $ftp_server_upload_user useradd -g $ftp_server_upload_user -M -d $ftp_server_rsync_upload_dir -s /sbin/nologin $ftp_server_upload_user &> /dev/null chown -R $ftp_server_upload_user:$ftp_server_upload_user $ftp_server_rsync_upload_dir/upload #bug kill: '500 OOPS: vsftpd: refusing to run with writable root inside chroot()' echo "设置ftp $ftp_server_web_user 的密码:" echo $ftp_server_web_password | passwd --stdin $ftp_server_web_user echo $ftp_server_web_password | passwd --stdin $ftp_server_upload_user #设置 getsebool -a setsebool ftp_home_dir 1 setsebool allow_ftpd_full_access 1 echo "service vsftpd start" >> /etc/rc.local echo "service iptabels stop" >> /etc/rc.local #echo $ftp_server_web_user >> /etc/vsftpd/chroot_list service vsftpd restart } ftp_set_rsync() { judge_evn yum -y install ftp* rpm -ivh install_soft/ftp-0.17-54.el6.x86_64.rpm echo "ftp 安装成功,满足采用ftp传输的条件" if [ ! -e /iyunwen/bin ];then echo "/iyunwen/bin目录不存在,创建目录进行同步设置" mkdir /iyunwen/bin -p fi if [ -e install_soft/ftp_rsync ];then echo "install_soft/ftp_rsync 存在,开始设置同步" \cp -rf install_soft/ftp_rsync /iyunwen/bin/ chmod 755 /iyunwen/bin/ftp_rsync/*.sh sed -i s/'127.0.0.1'/${ftp_server_ip}/g /iyunwen/bin/ftp_rsync/ftp_rsync.sh sed -i s/'ftpwww'/${ftp_server_web_user}/g /iyunwen/bin/ftp_rsync/ftp_rsync.sh sed -i s/'ftpupload'/${ftp_server_upload_user}/g /iyunwen/bin/ftp_rsync/ftp_rsync.sh sed -i s/'123456'/${ftp_server_web_password}/g /iyunwen/bin/ftp_rsync/ftp_rsync.sh echo "*/30 * * * * root run-parts /iyunwen/bin/ftp_rsync" >> /etc/crontab /etc/init.d/crond restart fi } case $1 in install_ftp_server) install_ftp_server ;; ftp_set_rsync) ftp_set_rsync ;; *) echo "please input install_nginx,scp_server or scp_client" echo "(1)input install_ftp_server for install ftp server" echo "(2)input ftp_set_rsync for install ftp client and set ftp rsync" ;; esac
ftp实现A和B的同步
A服务器地址:192.168.0.3,下面简称A 账号:root
B服务器地址:192.168.0.4,下面简称B 账号:root
A的/iyunwen/www/robot4目录和B的/iyunwen/www/robot4进行同步
FTP服务器搭建
B服务器上面,上传ftp_rsync.zip文件至指定的目录。此处为/root下面,编辑install_web.sh文件,有几个参数比较重要
ftp_server_ip为ftp server服务器所在的IP地址,不可以设置成负载IP地址
ftp_server_rsync_web_dir为server端需要同步的目录,如果是/iyunwen/www/robot4,但注意ftp_server_rsync_web_dir不带robot4
执行./install_web.sh install_ftp_server
脚本执行完成,vsftp的server服务就搭建完成。通过如下命令做检查:
a.vsftp进程是否存在:ps –ef | grep vsftp
b.vsftp是否开启启动:cat /etc/rc.local
ftp的server就搭建完成,ftp的用户为www,密码:Faqrobot2018
FTP客户端搭建
将install_web.sh和install_soft.zip上传到B服务器的任意位置。此处放在/home下面。注意,如果对install_web.sh做了修改,这个时候在B服务器也要确保install_web.sh是一样的。
此处只需要执行:
bash -x install_web.sh ftp_set_rsync
需要不确定,可以直接执行bash -x install_web.sh会有提示告知
在B的服务器中可以测试了,首先是手动测试:
但get只能实现单个文件的下载同步,对于目录似乎无法实现的,因此对于目录的同步下载,需要用到mget命令
但即使这样也解决不了robot4整个文件夹的同步,因为mget下载当前路径下的所有文件和文件夹,但不能递归下载robot4下面的子文件。
wget实现ftp文件同步
wget -r -m -nH ftp://192.168.0.4:21/robot4 --ftp-user=www --ftp-password=Faqrobot2018
使用wget下载整个FTP目录,可以用于服务器间文件传输,进行远程备份。通过限制网速,可以解决带宽限制问题。
wget ftp://IP:PORT/* --ftp-user=xxx --ftp-password=xxx -r -c
备注:星号*必须有,否则下载下来的就一个文件index.html
-nH:不创建以主机名命名的目录。
-r参数就是用来目录下载的
-m:下载所有子目录并且保留目录结构。
–ftp-user:FTP用户名
–ftp-password:FTP密码
同步的脚本参考如下;
#!/bin/sh if [ -e /iyunwen/www/robot4 ];then echo "/iyunwen/www/robot4 存在,进入目录同步" else echo "/iyunwen/www/robot4 不存在,创建robot4目录" mkdir /iyunwen/www/robot4 -p fi chmod -R 777 /iyunwen/www/ cd /iyunwen rm -rf robot4 wget -r -m -nH ftp://127.0.0.1:21/robot4 --ftp-user=ftpwww --ftp-password=123456 if [ -e /iyunwen/robot4 ];then \cp -rf /iyunwen/robot4/* /iyunwen/www/robot4/ rm -rf /iyunwen/robot4 fi chmod -R 777 /iyunwen/www echo "get from ftp successfully"
注意,这个就体现了使用wget实现ftp同步的思想,wget存在一个问题,如果对于同步的目录进行多次同步,在第二次的时候由于发现存在,wget不会强制下载同步,且对于ftp server同步目录删除一个文件,是无法实现同步的,也就是我们在文章开始的时候说的,ftp实现的同步似乎弱同步
4、NAS存储
NAS存储此处借鉴阿里云的NAS存储方案,其文档写的比我的好,如果考虑NAS的话,可以参考
https://help.aliyun.com/product/27516.html
5、NFS网络文件系统
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享文件资源。NFS采用纯网络协议,将本地磁盘共享至多台机器,实现文件的共享同步,但使用NFS存在一些缺点:
1、NFS是本地文件系统,采用网络共享文件,对于高并发的场景,存在性能缺陷,且需要分布式存储
2、NFS采用明文传输,存在一定的安全隐患
3、存在单节点问题,如果本地的服务出现异常,会导致全局异常
NFS的在实际的网络结构如下图:
笔者的公司采用NFS做文件素材(文件、图片、视频)的同步,且NFS的server和client是在一个局域网中进行文件共享,因为NFS在我司的场景中适用
搭建NFS
NFS作者根据server和client,写成了一键部署脚本:
#!/bin/bash ###############################定义参数 start##################################### ###nfs_server_ip为nfs服务器的IP地址 ###nfs_server_share为nfs服务器用来共享的挂载点或者共享目录,也是文件实际存储的路径 ###nfs_client_ip为nfs客户端的IP地址 ###nfs_client_dir为nfs客户端的挂载目录 nfs_server_ip=10.221.249.106 nfs_server_share=/iyunwen/server/tomcat_back/webapps/ROOT/upload nfs_client_ip=10.221.249.104 nfs_client_dir=/iyunwen/server/tomcat_core/webapps/ROOT/upload ###############################定义参数 end###################################### nfs_server() { install_nfs_flag=`rpm -qa | grep "rpcbind"` if [ "$install_nfs_flag" == "" ]; then echo "this server not install nfs server,begining install nfs.........." yum -y install nfs-utils rpcbind else echo "this server has installed nfs server" fi ###创建共享目录 if [ ! -e $nfs_server_share ];then mkdir -p $nfs_server_share fi ##NFS共享文件路径配置 echo "$nfs_server_share $nfs_client_ip(rw,sync,no_root_squash)" >> /etc/exports ##启动NFS服务(先启动rpcbind,再启动nfs;如果服务器自身已经安装过NFS,那就用restart重启两个服务) service rpcbind start service nfs start ###设置NFS服务开机自启动 chkconfig rpcbind on chkconfig nfs on service iptables stop } nfs_client() { client_install_nfs_flag=`rpm -qa | grep "rpcbind"` if [ "$install_nfs_flag" == "" ]; then echo "this server not install nfs server,begining install nfs.........." yum -y install nfs-utils rpcbind else echo "this server has installed nfs server" fi ###创建挂载点 if [ ! -e $nfs_client_dir ];then mkdir -p $nfs_client_dir fi ###查看NFS服务器上的共享 showmount -e $nfs_server_ip ###挂载,采用tcp协议,保证网络传输的稳定 mount -t nfs $nfs_server_ip:$nfs_server_share $nfs_client_dir -o proto=tcp -o nolock echo "$nfs_server_ip:$nfs_server_share $nfs_client_dir nfs defaults 0 0" >> /etc/fstab ###查看已挂载共享 mount } 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 "nfs server install please input : 1" echo "nfs client install please input : 2" echo -e '\033[0;33;1m ######################################### \033[0m' read -p "please chose : " frist #定义输入的值 if [ $frist -eq 1 ];then nfs_server else nfs_client fi
部署前的需要根据实际参数做修改,具体的参数有nfs_server_ip、nfs_server_share、nfs_client_ip和nfs_client_dir,有关NFS 手动安装的教程太多,已经安装的过程说明,此处不做介绍,度娘和GOOGLE一堆这样的介绍
综上,有关文件同步和共享的5种方式已经介绍完毕,大家可以根据实际工作中的场景进行灵活选择,5种方式各有利弊,各有其应用场景。