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

您所在的位置:网站首页 形容别人见不得你好的句子 文件共享同步5种方式:NFS、NAS、rsync、scp、ftp

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

2023-12-02 21:20| 来源: 网络整理| 查看: 265

谈到文件同步,我们最直接的同步方式是采用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 ];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文件如下信息很重要:

图片.png

模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点像Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的; 我们来个简单的示例:比如我们要备份服务器上的 /data/share 和/opt ,在/data/share中,我想把beinan和samba目录排除在外;

图片.png

配置完成启动命令为:

/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两个文件,分别代表密钥对的私钥和公钥,如下图所示:

图片.png

拷贝A的公钥(id_rsa.pub)到B服务器

这里拷贝到B的root用户home目录下为例:

scp /root/.ssh/id_rsa.pub [email protected]:/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 [email protected]

scp abc.txt [email protected]:/root

当然,强大的linux也有方便的工具快速实现SSH免密码登录,ssh-copy-id

在A服务器中执行:

ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]

图片.png

在第一次输入B的密码之后,在SSH B服务器,就不需要输入密码了

scp实现文件同步

B服务器中用SCP的命令,实现A和B的文件同步:

图片.png

将定时同步加入事务(此处将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" ];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文件,有几个参数比较重要

图片.png

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

图片.png

脚本执行完成,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会有提示告知

图片.png

在B的服务器中可以测试了,首先是手动测试:

图片.png

但get只能实现单个文件的下载同步,对于目录似乎无法实现的,因此对于目录的同步下载,需要用到mget命令

图片.png

但即使这样也解决不了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密码

图片.png

同步的脚本参考如下;

#!/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实现的同步似乎弱同步

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的在实际的网络结构如下图:

图片.png

笔者的公司采用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种方式各有利弊,各有其应用场景。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3