谈到文件同步,我们最直接的同步方式是采用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硬件负载的区别。

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 ];thenwget https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz
fi
rsync_server() {tar -zxvf rsync-3.1.2.tar.gzcd rsync-3.1.2mkdir -p /iyunwen/server/rsync/mkdir -p /iyunwen/log/rsync/./configure --prefix=/iyunwen/server/rsync/makemake installln -s /iyunwen/server/rsync/bin/rsync  /usr/bin/rsynccd ..#mkdir -p /etc/rsyncd/\cp -rf ./rsyncd /iyunwen/server/rsync/mkdir -p /iyunwen/server/rsync/rsyncdchmod 600 /iyunwen/server/rsync/rsyncd/rsyncd.secretsecho "rsync --daemon --config=/iyunwen/server/rsync/rsyncd/rsyncd.conf" >> /etc/rc.local/iyunwen/server/rsync/bin/rsync --daemon --config=/iyunwen/server/rsync/rsyncd/rsyncd.confnetstat -nltup
}
rsync_client() {tar -zxvf rsync-3.1.2.tar.gzcd rsync-3.1.2./configure --prefix=/iyunwen/server/rsync/makemake installln -s /iyunwen/server/rsync/bin/rsync  /usr/bin/rsynccd ..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.shmkdir -p /iyunwen/server/rsync/rsyncd/cp -rf ./rsyncd/rsyncuser.password /iyunwen/server/rsync/rsyncd/chmod 600 /iyunwen/server/rsync/rsyncd/rsyncuser.passwordecho "* * * * * 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 ];thenrsync_server
elsersync_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 www@10.86.20.149::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 www@10.86.20.149::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 max@144.16.251.213::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  root@192.168.0.4

在第一次输入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



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" ];thenecho "操作的用户不是root权限,不满足部署条件,请用root权限部署,系统退出"exit 100elseecho "操作用户为root,满足部署条件"fiecho "第一步:执行yum操作"yum clean all &>/dev/nullyum -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-libsrm -rf install_softif [ -e install_soft.zip ];thenecho "install_soft.zip exist,unzip install_soft.zip"unzip install_soft.zipelseecho "install_soft.zip not exist please check,system exist"exit 100fi
}

install_ftp_server() {judge_evnyum -y remove vsftpdyum -y install vsftpd\cp -f ./install_soft/config-ftp/rpm_ftp/* /etc/vsftpd//etc/init.d/vsftpd startuserdel $ftp_server_web_usergroupadd $ftp_server_web_useruseradd -g $ftp_server_web_user -M -d $ftp_server_rsync_web_dir -s /sbin/nologin $ftp_server_web_user &> /dev/nullchown -R $ftp_server_web_user:$ftp_server_web_user $ftp_server_rsync_web_diruserdel $ftp_server_upload_usergroupadd $ftp_server_upload_useruseradd -g $ftp_server_upload_user -M -d $ftp_server_rsync_upload_dir -s /sbin/nologin $ftp_server_upload_user &> /dev/nullchown -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_userecho $ftp_server_web_password |  passwd --stdin $ftp_server_upload_user

#设置getsebool -asetsebool ftp_home_dir 1setsebool allow_ftpd_full_access 1echo "service vsftpd start" >> /etc/rc.localecho "service iptabels stop" >> /etc/rc.local#echo $ftp_server_web_user >> /etc/vsftpd/chroot_listservice vsftpd restart    

}
ftp_set_rsync() {judge_evnyum -y install ftp*rpm -ivh install_soft/ftp-0.17-54.el6.x86_64.rpmecho "ftp 安装成功,满足采用ftp传输的条件"if [ ! -e /iyunwen/bin ];thenecho "/iyunwen/bin目录不存在,创建目录进行同步设置"mkdir  /iyunwen/bin -pfiif [ -e install_soft/ftp_rsync ];thenecho "install_soft/ftp_rsync 存在,开始设置同步"\cp -rf install_soft/ftp_rsync /iyunwen/bin/chmod 755 /iyunwen/bin/ftp_rsync/*.shsed -i s/'127.0.0.1'/${ftp_server_ip}/g  /iyunwen/bin/ftp_rsync/ftp_rsync.shsed -i s/'ftpwww'/${ftp_server_web_user}/g  /iyunwen/bin/ftp_rsync/ftp_rsync.shsed -i s/'ftpupload'/${ftp_server_upload_user}/g  /iyunwen/bin/ftp_rsync/ftp_rsync.shsed -i s/'123456'/${ftp_server_web_password}/g  /iyunwen/bin/ftp_rsync/ftp_rsync.shecho "*/30 * * * * root run-parts /iyunwen/bin/ftp_rsync" >> /etc/crontab/etc/init.d/crond restartfi
}
case $1 ininstall_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 ];thenecho "/iyunwen/www/robot4 存在,进入目录同步"
elseecho "/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实现的同步似乎弱同步


NAS存储

NAS存储此处借鉴阿里云的NAS存储方案,其文档写的比我的好,如果考虑NAS的话,可以参考

https://help.aliyun.com/product/27516.html


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" == "" ]; thenecho "this server not install nfs server,begining install nfs.........."yum -y install  nfs-utils rpcbindelseecho "this server has installed nfs server"fi###创建共享目录if [ ! -e $nfs_server_share ];thenmkdir -p $nfs_server_sharefi##NFS共享文件路径配置echo "$nfs_server_share     $nfs_client_ip(rw,sync,no_root_squash)" >> /etc/exports##启动NFS服务(先启动rpcbind,再启动nfs;如果服务器自身已经安装过NFS,那就用restart重启两个服务)service rpcbind startservice nfs start###设置NFS服务开机自启动chkconfig rpcbind onchkconfig nfs onservice iptables stop
}
nfs_client() {client_install_nfs_flag=`rpm -qa | grep "rpcbind"`if [ "$install_nfs_flag" == "" ]; thenecho "this server not install nfs server,begining install nfs.........."yum -y install  nfs-utils rpcbindelseecho "this server has installed nfs server"fi

###创建挂载点if [ ! -e $nfs_client_dir ];thenmkdir -p $nfs_client_dirfi###查看NFS服务器上的共享showmount -e $nfs_server_ip

###挂载,采用tcp协议,保证网络传输的稳定mount -t nfs $nfs_server_ip:$nfs_server_share $nfs_client_dir  -o proto=tcp -o nolockecho "$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 ];thennfs_server
elsenfs_client
fi

部署前的需要根据实际参数做修改,具体的参数有nfs_server_ip、nfs_server_share、nfs_client_ip和nfs_client_dir,有关NFS 手动安装的教程太多,已经安装的过程说明,此处不做介绍,度娘和GOOGLE一堆这样的介绍

综上,有关文件同步和共享的5种方式已经介绍完毕,大家可以根据实际工作中的场景进行灵活选择,5种方式各有利弊,各有其应用场景。

文件共享同步5种方式:NFS、NAS、rsync、scp、ftp相关推荐

  1. 文件共享同步5种方式-NFS、NAS、rsync、scp、ftp

    谈到文件同步,我们最直接的同步方式是采用rsync的同步软件,rsync同步可以保持server和client的强一致(server中的增删改都会同步client),但在实际场景中rsync可能并不能 ...

  2. 文件同步详细操作(NFS,rsync)

    目录 一.NFS的工作原理 二.NFS安装与检查 三.服务端安装配置(192.168.65.201) 四.Linux客户端挂载配置(192.168.65.202) 五.Linux挂载windows的共 ...

  3. 家庭网络文件共享的几种方式

    1.PC文件夹共享(SMB方式) 右击文件夹就可以方便设置共享.该共享文件夹可被访问的前提是打开网络发现和SMB文件共享支持. 1)打开windows网络发现 控制面板→网络和Internet→ 网络 ...

  4. 电脑获取手机文件的一种方式(通过手机建立ftp)

    1 打开手机热点. 2 手机需要安装es文件浏览器,在es浏览器首页有个远程管理(或在左侧网络功能下有个远程管理),打开即可启用手机目录下的ftp. 3 打开电脑按提示输入ftp站点.默认地址是手机热 ...

  5. php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步

    如何实现子goroutine与主线程的同步 第一种方式:time.sleep(),这种方式很太死板,就不演示了. 第二种方式:使用channel机制,每个goroutine传一个channel进去然后 ...

  6. java异步处理同步化_java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring EventListener,超时处理和空循环性能优化...

    异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 正常处理逻辑 触发异步操作,然后传递一个唯一标识. 等到异步结果返回,根据传入的唯一标识,匹配此次结果. 如何转换为同步 ...

  7. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx

    linux下实现web数据同步的四种方式(性能比较)教程 实现web数据同步的四种方式=======================================1.nfs实现web数据共享2.rs ...

  8. linux下实现web数据同步的四种方式(性能比较)

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  9. 实现web数据同步的四种方式

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

最新文章

  1. 预加载系列一:DNS Prefetching 的正确使用姿势
  2. eclipse的怪问题。background indexer crash recovery .java.lang.OutOfMemoryError: Java heap space
  3. JDBC(二)——使用IDEA连接数据库、数据库连接池
  4. Rapidmind计算库性能测试
  5. 【汇编语言】结合C语言,使用VS 2017调试模式下的反汇编工具学习32位x86汇编指令
  6. Python-PIL
  7. Find and Delete Files with Extension Name
  8. android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法
  9. Java 和C# 最大的不同是对底层的控制能力不同
  10. Vijos P1398 奖学金【排序】
  11. [渝粤教育] 西南科技大学 机械设计基础 在线考试复习资料(1)
  12. WCF学习 (三)深入认识WCF契约
  13. 《Spring揭秘》读书笔记
  14. python实验五答案_python程序设计 实验指导答案
  15. 2017版张宇1000题【题目收集】
  16. 阿里邮箱怎么开通pop3服务器,云邮箱如何在IPAD上设置POP3/IMAP协议?
  17. Python生成图文并茂PDF报告
  18. 关于旅游景点主题的HTML网页设计——青岛民俗 7页 带登录注册
  19. 可可粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 技术的魅力在于融汇惯通

热门文章

  1. 打算写的文章,先写个标题
  2. asp.net Forums 之HttpHandler和HttpModule
  3. 贵州2021高考状元成绩查询,2021年贵州高考最高分多少分,历年贵州高考状元
  4. 绘制机械图c语言编程,求用C语言绘制机械三视图程序?
  5. 转载:socket通信基础
  6. Python 3.9.1 安装教程
  7. Qt学习(三):事件、定时器、事件过滤器
  8. android显示服务器端文件夹,Android上传文件到服务端并显示进度条
  9. JVM实战与原理---字节码执行引擎
  10. [Unity C#教程] 游戏对象和脚本