1. 程式人生 > 其它 >nfs實時備份案例

nfs實時備份案例

nfs網路檔案系統

實現流程

本地檔案操作方式

1.當用戶執行mkdir命令,該命令會呼叫shell直譯器翻譯給核心
2.核心解析完成後會驅動對應的硬體裝置,完成相應的操作

NFS實現原理(需要先了解[程式|程序|執行緒])

1.使用者程序訪問NFS客戶端,使用不同的函式對資料進行處理
2.NFS客戶端通過TCP/IP的方式傳遞給NFS服務端
3.NFS服務端接收到請求後,會先呼叫portmap程序進行埠對映
4.nfsd程序用於判斷NFS客戶端是否有用許可權連線NFS服務端
5.Rpc.mount程序判斷客戶端是否有對應的許可權進行驗證
6.idmap程序實現使用者對映和壓縮
7.最後NFS服務端會將對應請求的函式轉換為本地能識別的命令,傳遞至核心,由核心驅動硬體
注意:rpc是一個遠端呼叫過程協議,那麼使用nfs必須有rpc服務

nfs安裝配置啟動

centos7.5					NFS服務端		192.168.250.139      nfs01
centos7.5					NFS客戶端		192.168.250.137			 head
# 關閉防火牆
nfs01]>>> systemctl disable firewalld
nfs01]>>> systemctl stop firewalld
# 關閉selinux防火牆
nfs01]>>> sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
nfs01]>>> setenforce 0
# 安裝
nfs01]>>> yum install nfs-utils -y
nfs01]>>> systemctl start rpcbind
nfs01]>>> systemctl enable rpcbind

# 配置nfs服務,nfs服務程式的配置檔案為`/etc/exports`,需要嚴格按照共享目錄的路徑,允許訪問的NFS客戶端(共享許可權引數)格式書寫,定義要共享的目錄與相應的許可權,如下
>>> man exports
# sample /etc/exports file  示例
/               master(rw) trusty(rw,no_root_squash)  # 共享的目錄(/),共享給誰(主機名(許可權))
/projects       proj*.local.domain(rw)
/usr            *.local.domain(ro) @trusted(rw)
/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
/pub            *(ro,insecure,all_squash)
/srv/www        -sync,rw server @trusted @external(ro)
/foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build          buildhost[0-9].local.domain(rw)
# 示例
配置語法				/data					192.168.250.0/24				(rw,sync,all_squash)
語法含義				NFS共享目錄			NFS客戶端地址				(引數1,引數2....)

# 配置場景,將nfs服務端的/data目錄共享給192.168.250.0/24網段內的所有主機
1)所有客戶端主機都擁有讀寫許可權
2)在將資料寫入到NFS伺服器的硬碟中後才會結束操作,最大限度保證資料不丟失
3)將所有使用者對映為本地的匿名使用者(nfsnobody)
# NFS客戶端地址與許可權之間沒有空格
nfs01]>>> vim /etc/exports
/data		192.168.250.0/24(rw,sync,all_squash)
# 在NFS伺服器上建立用於NFS檔案共享的目錄,並設定對應許可權
nfs01]>>> mkdir /data
nfs01]>>> chown -R nfsnobody.nfsnobody /data
nfs01]>>> systemctl start nfs-server  # 啟動nfs
nfs01]>>> systemctl enable nfs-server

nfs01]>>> cat /var/lib/nfs/etab  # 當nfs啟動後,這裡面記錄這共享資訊


# 客戶端操作
head]>>> yum install nfs-utils -y
head]>>> systemctl start rpcbind
head]>>> systemctl enable rpcbind
# 檢測是否有共享的內容
head]>>> showmount -e 192.168.250.139
Export list for 192.168.250.139:
/data 192.168.250.0/24
# 掛載
head]>>> mount -t nfs 192.168.250.139:/data /opt
# 檢測掛載是否成功
head]>>> df -h

# 客戶端將nfs掛載資訊寫入/etc/fstab檔案中,實現永久掛載
head]>>> vi /etc/fstab
192.168.250.139:/data			/opt		nfs01			defaults		0	0
>>> mount -a  # 驗證fstab開機啟動是否填寫錯誤

# nfs掛載說明
客戶端當前的目錄僅僅只是nfs服務端共享目錄的一個入口檔案,當在web刪除檔案的時候,其實是刪除的nfs服務端的目錄

# 解除安裝
>>> umount /opt

nfs配置詳解

>>> man exports
nfs共享引數				引數作用
rw							讀寫許可權        # 常用
ro							只讀許可權
root_squash			當nfs客戶端以root管理員訪問時,對映為nfs伺服器的匿名使用者(不常用)
no_root_squash	當nfs客戶端以root管理員訪問時,對映為nfs伺服器的root管理員(不常用)
all_squash			無論nfs客戶端用什麼賬號訪問,均對映為nfs伺服器的匿名使用者  # 常用
no_all_squash		無論nfs客戶端使用什麼賬戶訪問,都不進行壓縮
sync						同時將資料寫入到記憶體與硬碟中,保證不丟失資料  #常用
async						優先將資料儲存到記憶體,然後再寫入硬碟,這樣效率更高,但可能會丟失資料
anonuid				  配置all_squash使用,指定NFS的使用者UID,必須存在系統  #常用
anongid				  配置all_squash使用,指定NFS的使用者UID,必須存在系統  # 常用

驗證all_squash,anonuid,anongid

# 如果只用all_squash,不用anonuid,anongid,那麼就會自動生成uid為65534,使用者名稱為nfsnobody

# 服務端
nfs01]>>> vi /etc/exports
/data 192.168.250.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
nfs01]>>> groupadd -g 666 www
nfs01]>>> useradd -u 666 -g 666 www
nfs01]>>> chown -R www.www /data/
nfs01]>>> systemctl restart nfs-server  # 重啟nfs

# 客戶器重新掛載驗證
head]>>> touch /opt/file   
head]>>> ll  # 可以看到建立的檔案的屬主使用者為666,客戶端如果覺得666不好看,建議在客戶端上建立同名的使用者以及uid
head]>>> groupadd -g 666 www
head>>> useradd -u 666 -g 666 www

實時同步

1.什麼是實時同步,只要當前目錄發生變化則會觸發一個事件,事件觸發後將變化的目錄同步至遠端伺服器
2.為什麼要實時同步,保證資料的連續性,減少人力維護成本,解決nfs單點故障
3.實時同步實現原理,實時同步需要藉助Inotify通知介面,用來監控目錄的變化,如果監控的目錄發生變更,則觸發動作,這個動作可以是進行一次同步操作,或其它操作
4.實時同步工具選擇,有sersync(),inotify+rsync,通常我們會選擇sersync,因為sersync是國人基於rsync+inotify-tools開發的工具,不僅保留了優點同時還強化了實時監控,檔案過濾,簡化配置等功能,幫助使用者提高執行效率,節省時間和網路資源。

實時同步案例

# 實現head上傳視訊檔案,實則是寫入nfs01至儲存,當nfs存在新的資料則會實時的複製到備份伺服器
head				192.168.250.137			httpd+php
nfs01				192.168.250.139			nfsServer、rsync+inotify+sersync
backup			192.168.250.138			rsync-server

web上傳視訊至nfs儲存

# nfs儲存服務 192.168.250.139
# 安裝
nfs01]>>> yum intsll nfs-utils -y
# 配置
nfs01]>>> vim /etc/exports
/data 192.168.250.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
nfs01]>>> groupadd -g666 www
nfs01]>>> useradd -u 666 -g 666 www
nfs01]>>> mkdir /data
nfs01]>>> chown -R www.www /data/
# 啟動
nfs01]>>> systemctl start nfs-server
nfs01]>>> systemctl enable nfs-server


# head伺服器操作:192.168.250.137
# 安裝
head]>>> yum install httpd php -y
# 掛載
head]>>> mount -t nfs 192.168.250.139:/data	/var/www/html
head]>>> cd /var/www/html/
head]>>> # 將php程式放入到/var/www/html目錄下,
# 修改檔案大小 php.ini檔案
>>> vi /etc/php.ini
upload_max_filesize = 200M 
post_max_size = 200M
# 許可權修改
>>> sed -i '/^User/c User www' /etc/httpd/conf/httpd.conf
>>> sed -i '/^Group/c Group www' /etc/httpd/conf/httpd.conf
# 啟動
head]>>> systemctl start httpd

head和nfs01的資料都備份在備份伺服器的/backup

# 備份伺服器192.168.250.138
# 安裝
backup]>>> yum install rsync -y
# 配置
backup]>>> vim /etc/rsyncd.conf
uid = www    # 修改為www,目的是為了以後nfs伺服器故障的時候,head中的web資料可以直接備份到backup伺服器
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log

[backup]  # 備份資料存放目錄
path = /backup

[data]  # web資料存放目錄
path = /data

# 建立使用者
backup]>>> groupadd -g 666 www
backup]>>> useradd -u666 -g666 www
# 準備虛擬使用者和密碼用於連線
backup]>>> echo "rsync_backup:1" > /etc/rsync.passwd
backup]>>> chmod 600 /etc/rsync.passwd

# 建立目錄及授權
backup]>>> mkdir /backup
backup]>>> mkdir /data
backup]>>> chown -R www.www /backup
backup]>>> chown -R www.www /data

# 啟動
backup]>>> systemctl restart rsyncd

# 客戶端執行指令碼,測試rsync的備份是否ok(客戶端的數都寫入到/backup目錄中)
head]>>> sh /scripts/client_push_data_server.sh   # 指令碼參考之前rsync
# 指令碼內容
#!/usr/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Host=$(hostname)
Addr=$(ifconfig ens33 | awk '/inet / { print $2 }')
Date=$(date +%F)
Dest=${Path}/${Host}_${Addr}_${Date}
# 1.建立好對應的備份目錄
[ -d $Dest ] ||  mkdir -p $Dest
# 2.打包要備份的資料
cd / && \
[ -f $Dest/sys.tar.gz ] || tar czf $Dest/sys.tar.gz etc/passwd etc/fstab etc/hosts && \
[ -f $Dest/other.tar.gz ] ||  tar czf $Dest/other.tar.gz var/spool/cron scripts
# 3.新增標記
[ -f $Dest/flag_${Date} ] || md5sum $Dest/*.tar.gz > $Dest/flag_${Date}
# 4.推送資料至遠端倉庫
export RSYNC_PASSWORD=1
rsync -avz $Path/  [email protected]::backup
# 5.保留最近7天備份資料
find $Path/ -type d -mtime +7 | xargs rm -rf

nfs01]>>> sh /scripts/client_push_data_server.sh  # 指令碼參考之前rsync
# 指令碼內容
#!/usr/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Host=$(hostname)
Addr=$(ifconfig ens33 | awk '/inet / { print $2 }')
Date=$(date +%F)
Dest=${Path}/${Host}_${Addr}_${Date}
# 1.建立好對應的備份目錄
[ -d $Dest ] ||  mkdir -p $Dest
# 2.打包要備份的資料
cd / && \
[ -f $Dest/sys.tar.gz ] || tar czf $Dest/sys.tar.gz etc/passwd etc/fstab etc/hosts && \
[ -f $Dest/other.tar.gz ] ||  tar czf $Dest/other.tar.gz var/spool/cron scripts
# 3.新增標記
[ -f $Dest/flag_${Date} ] || md5sum $Dest/*.tar.gz > $Dest/flag_${Date}
# 4.推送資料至遠端倉庫
export RSYNC_PASSWORD=1
rsync -avz $Path/  [email protected]::backup
# 5.保留最近7天備份資料
find $Path/ -type d -mtime +7 | xargs rm -rf


backup]>>> ll /backup/

如何將nfs的資料實時的同步到備份伺服器的/data目錄

# 監控nfs01伺服器上面的/data目錄,如果發生變化則觸發動作,動作可以是執行一次同步
# 安裝 https://github.com/wsgzao/sersync  下載tar包
nfs01]>>> yum install inotify-tools -y  # 安裝監控工具
nfs01]>>> tar -xzf sersync2.5.4_64bit_binary_stable_final.tar.gz
nfs01]>>> mv GNU-Linux-x86/ /usr/local/sersync
# 配置
nfs01]>>> vim /usr/local/sersync/confxml.xml
<filter start="false"> # 排除不想同步的檔案
</filter>
<inotify>	 # 監控的事件型別
  <fileSystem xfs="true"/>
  <createFile start="true"/>
  <attrib start="true"/>
  <modify start="true"/>
</inotify>  
<sersync>
  <localpath watch="/data">  # 監控nfs01的/data目錄
              <remote ip="192.168.250.138" name="data"/>  # 只要上面nfs01的/data發生變化就推送到192.168.250.138backup的data目錄
<rsync># 使用rsync推送的選項
  <commonParams params="-az"/>  
  <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pass"/>  # rsync的nfs01客戶端的虛擬使用者和密碼
</rsync>
<timeout start="true" time="100"/>

# 建立密碼檔案
nfs01]>>> echo "1" > /etc/rsync.pass
nfs01]>>> chmod 600 /etc/rsync.pass

# 啟動
nfs01]>>> /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
nfs01]>>> cd /data && rsync -az -R --delete ./  --timeout=100 [email protected]::data --password-file=/etc/rsync.pass  # 上面啟動後,手動執行下命令檢測rsync是否錯誤

# 測試
head頁面上傳一個檔案,首先會同步到nfs01上面,然後同時備份到backup服務上

如果平滑的遷移nfs資料到backup伺服器。並且讓後續的上傳都是上傳至backup(不能出現業務中斷)

# 1.backup伺服器上需要執行和nfs伺服器上一樣的業務環節
backup]>>> yum install -y nfs-utils
backup]>>> rsync -avz 192.168.250.139:/etc/exports /etc/exports  # 將nfs的exports檔案拷貝到backup伺服器上
backup]>>> groupadd -g 666 www
backup]>>> useradd -g666 -u666 www
backup]>>> systemctl restart nfs-server

# 2.先實現實時的同步

# 3.在head上實現切換,解除安裝nfs的/data目錄,重新掛載backup服務的/data目錄
head]>>> umount -lf /var/www/html/ && mount -t nfs 192.168.250.138:/data /var/www/html/
head]>>> umount /opt  # 將原來練習掛載的/opt解除安裝掉

# 4.測試
head頁面上傳一個檔案,檢視backup伺服器上/data/下面是否有檔案,如果有,說明切換成功了,同時也需要檢視nfs01伺服器上/data/目錄,如果沒有,也說明切換成功

總結

# sersync對數百萬張圖片資料做到了實時同步,新增的資料能夠立馬同步到另一臺,最後上百G的圖片資料實現了線上遷移
# 實時同步
1.為什麼要使用實時同步?
	- 解決nfs單點
	- 大量的靜態資源遷移(本地遷移雲端)
2.實時同步能解決什麼問題?
	- 平滑的遷移
	- 備份:減少人為的干預
3.實時同步工具選擇?
	- rsync+inotify-tools  # 少量檔案同步,麻煩,同步大檔案太慢,遍歷掃描,非常影響效率
	- sersync  # 配置簡單,多執行緒同步,同步快,適合大量的小檔案或圖片
	- lsryncd
4.流程
使用者上傳檔案-->web瀏覽器head伺服器-->寫入-->nfs儲存-->inotify(監控)-->action(動作)-->rsync-->backup伺服器
使用者上傳檔案-->web瀏覽器head伺服器-->寫入-->nfs儲存(本地)-->實時同步到--> 儲存(雲端) web瀏覽器(head伺服器)-->解除安裝儲存(本地)--> 重新掛載儲存(雲端)