谈到文件同步,我们最直接的同步方式是采用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-keygenserver A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identityidentity.pub文件

  2. server B上的home目录建立子目录.ssh

  3. Aidentity.pub拷贝到server B

  4. identity.pub加到~[user b]/.ssh/authorized_keys

  5. 于是server A上的A用户,可通过下面命令以用户B sshserver B上了。e.g. ssh -l userB serverB。这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

14.如何通过在不危害安全的情况下通过防火墙使用rsync?

  解答如下:

   这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd 仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防 火墙打开TCP端口22ssh外发连接就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_rsaid_rsa.pub两个文件,分别代表密钥对的私钥和公钥,如下图所示:

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

这里拷贝到Broot用户home目录下为例:

scp /root/.ssh/id_rsa.pub root@192.168.0.4:/root/


登录B服务器

拷贝Aid_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种方式各有利弊,各有其应用场景。