文件共享同步5种方式:NFS、NAS、rsync、scp、ftp
談到文件同步,我們最直接的同步方式是采用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/bashrm?-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?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加入了鎖機制,當前同步沒有執行完畢,下次的同步是無法進行,避免了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/bashnginx_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/shif?[?-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的在實際的網絡結構如下圖:
筆者的公司采用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種方式各有利弊,各有其應用場景。
總結
以上是生活随笔為你收集整理的文件共享同步5种方式:NFS、NAS、rsync、scp、ftp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序数据过滤(filter)方法
- 下一篇: V-7 Openstack 在ceph中