nfs實時備份案例
阿新 • • 發佈:2021-06-20
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伺服器)-->解除安裝儲存(本地)--> 重新掛載儲存(雲端)