1. 程式人生 > >Glusterfs之nfs模組原始碼分析(上)之nfs原理和協議

Glusterfs之nfs模組原始碼分析(上)之nfs原理和協議

歡迎大家相互交流,共同提高技術。

一、網路檔案系統概述

Sun Microsystems公司於1984年推出了一個在整個計算機工業中被廣泛接受的遠端檔案存取機制,它被稱為Sun的網路檔案系統(Network File System),或者簡稱為NFS。該機制允許在一臺計算機上執行一個伺服器,使對其上的某些或所有檔案都可以進行遠端存取,還允許其他計算機上的應用程式對這些檔案進行存取。

它使我們能夠達到檔案的共享。當使用者想用遠端檔案時只要用"mount"就可把remote檔案系統掛接在自己的檔案系統之下,使得遠端的檔案操作上和本地機器的檔案沒兩樣。一個應用程式可以開啟(Open)一個遠端檔案以進行存取,可以從這個檔案中讀取(Read)資料,向該檔案中寫入(Write)資料,定位(Seek)到檔案中的某個指定位置(開始、結尾或者其他地方),最後當使用完畢後關閉(Close)該檔案。並且這些操作都是對程式設計者透明的,操作方法和對本地檔案的操作方法完全一樣。

二、NFS協議

NFS協議使用NFS,客戶端可以透明地訪問伺服器中的檔案系統,這不同於提供檔案傳輸的FTP協議。FTP會產生檔案一個完整的副本;NFS只訪問一個程序引用檔案部分,並且一個目的就是使得這種訪問透明。這就意味著任何能夠訪問一個本地檔案的客戶端程式不需要做任何修改,就應該能夠訪問一個NFS檔案。NFS是一個使用SunRPC構造的客戶端/伺服器應用程式,其客戶端通過向一臺NFS伺服器傳送RPC請求來訪問其中的檔案。儘管這一工作可以使用一般的使用者程序來實現,即NFS客戶端可以是一個使用者程序,對伺服器進行顯式呼叫,而伺服器也可以是一個使用者程序。因為兩個理由,NFS一般不這樣實現。首先訪問一個NFS檔案必須對客戶端透明,因此NFS的客戶端呼叫是由客戶端作業系統代表使用者程序來完成的;其次,出於效率的考慮,NFS伺服器在伺服器作業系統中實現。如果NFS伺服器是一個使用者程序,每個客戶端請求和伺服器應答(包括讀和寫的資料)將不得不在核心和使用者程序之間進行切換,這個代價太大。第3版的NFS協議在1993年釋出,下圖所示為一個NFS客戶端和一臺NFS伺服器的典型結構。 

 

圖1  NFS客戶端和NFS伺服器的典型結構 

(1)訪問一個本地檔案還是一個NFS檔案對於客戶端來說是透明的,當檔案被開啟時,由核心決定這一點。檔案被開啟之後,核心將本地檔案的所有引用傳遞給名為“本地檔案訪問”的框中,而將一個NFS檔案的所有引用傳遞給名為“NFS客戶端”的框中。

(2)NFS客戶端通過其TCP/IP模組向NFS伺服器傳送RPC請求,NFS主要使用UDP,最新的實現也可以使用TCP。

(3)NFS伺服器在埠2049接收作為UDP資料包的客戶端請求,儘管NFS可以被實現為使用埠對映器,允許伺服器使用一個臨時埠,但是大多數實現都是直接指定UDP埠2049。

(4)當NFS伺服器收到一個客戶端請求時,它將這個請求傳遞給本地檔案訪問例程,然後訪問伺服器主機上的一個本地的磁碟檔案。

(5)NFS伺服器需要花一定的時間來處理一個客戶端的請求,訪問本地檔案系統一般也需要一部分時間。在這段時間間隔內,伺服器不應該阻止其他客戶端請求。為了實現這一功能,大多數的NFS伺服器都是多執行緒的——伺服器的核心中實際上有多個NFS伺服器在NFS本身的加鎖管理程式中執行,具體實現依賴於不同的作業系統。既然大多數UNIX核心不是多執行緒的,一個共同的技術就是啟動一個使用者程序(常被稱為“nfsd”)的多個例項。這個例項執行一個系統呼叫,使其作為一個核心程序保留在作業系統的核心中。

6在客戶端主機上,NFS客戶端需要花一定的時間來處理一個使用者程序的請求。NFS客戶端向伺服器主機發出一個RPC呼叫,然後等待伺服器的應答。為了給使用NFS的客戶端主機上的使用者程序提供更多的併發性,在客戶端核心中一般執行著多個NFS客戶端,同樣具體實現也依賴於作業系統。

三、NFS的工作原理和服務程序的作用

Linux中,NFS和服務程序是兩個不同的概念,但它們確實緊密聯絡在一起。首先,先介紹NFS的工作原理。

第一節、NFS的工作原理

啟動NFS檔案伺服器時,/etc/rc.local會自動啟動exportfs程式,指定可以匯出的檔案或目錄,而所能掛載的也只能是其所指定的目錄。
NFS是基於XDR/RPC協議的。XDReXternal Data Representation,即外部資料表示法)提供一種方法,把資料從一種格式轉換成另一種標準資料格式表示法,確保在不同的計算機、作業系統及程式語言中,所有資料代表的意義都是相同的。
RPCRemote Procedure Call,遠端程式呼叫)請求遠端計算機給予服務。客戶機通過網路傳送RPC到遠端計算機,請求服務。
NFS運用RPC傳送資料的方法有以下幾步:
1)客戶送出資訊,請求服務。
2)客戶佔位程式把客戶送出的引數轉換成XDR標準格式,並用系統呼叫把資訊送到網路上。
3)資訊經過網路送達遠端主機系統。
4)遠端主機將接受到的資訊傳給伺服器佔位程式。
5)把XDR形式的資料,轉換成符合主機端的格式,取出客戶發出的服務請求引數,送給伺服器。
6)伺服器給客戶傳送服務的逆向傳送過程。

第二節、服務程序的作用

服務程序是系統在啟動計算機後自動執行的程式,包括對網路的連線、網路協議的載入、圖形桌面的顯示、檔案系統的載入等,Linux系統中常見的程序包括以下幾種。
(1nfsd
根據客戶端對檔案系統的需求,啟動檔案系統請求服務程序,響應客戶的請求,而一般檔案系統請求服務程序的數目是8,這也是在rc.local中寫nfsd 8 &的原因。
(2biod
此程序是在NFS客戶端上用的,用來啟動非同步塊I/O服務程序來建立Buffer Cache,處理在客戶機上的讀寫。(3mountd
這是個RPC伺服器。啟動rpc.mountd服務程序後,mountd會讀取/etc/xtab檢視哪一臺客戶機正在掛載哪一個檔案系統,並回應客戶機所要掛載的路徑。
(4inetd Internet services服務程序
當系統啟動時,rc.local會啟動inetd讀取inetd.conf配置檔案,讀取網路上所有伺服器的地址,連結啟動inetd.conf中所有的伺服器。當客戶機請求服務時,inetd就會啟動相關的服務程序,如user使用telnet時,inetd啟動telnetd配合user telnet的需求,其餘像ftpfingerrlogin等應用程式,inetd也都會啟動相對應的服務程式ftpdfingerdrloingd等。
(5portmap服務程式
主要功能是將TCP/IP通訊協議的埠數字轉換成RPC程式數字,因為這樣客戶端才能進行RPC呼叫。一般RPC伺服器是被inet啟動的,所以portmap必須在inetd之前啟動,否則無法進行RPC呼叫。 

四、NFS伺服器之RPC

因為NFS支援的功能相當多,而不同的功能都會使用不同的程式來啟動。每啟動一個功能就會啟用一些埠來傳輸資料,因此NFS的功能所對應的端口才沒有固定,而是採用隨機取用一些未被使用的小於724的埠來作為傳輸之用。但如此一來又造成客戶端要連線伺服器時的困擾,因為客戶端要知道伺服器端的相關端口才能夠聯機,此時我們需要遠端過程呼叫(RPC)的服務。RPC最主要的功能就是指定每個NFS功能所對應的埠號,並且回報給客戶端,讓客戶端可以連線到正確的埠上。當伺服器在啟動NFS時會隨機選用數個埠,並主動地向RPC註冊。因此RPC可以知道每個埠對應的NFS功能。然後RPC固定使用埠111來監聽客戶端的請求並回報客戶端正確的埠,所以可以讓NFS的啟動更為容易。注意,啟動NFS之前,要先啟動RPC;否則NFS會無法向RPC註冊。另外,重新啟動RPC時原本註冊的資料會不見,因此RPC重新啟動後它管理的所有程式都需要重新啟動以重新向RPC註冊。
當客戶端有NFS檔案要存取請求時,它如何向伺服器端要求資料?
1)客戶端會向伺服器端的RPCport 111)發出NFS檔案存取功能的詢問請求。
2)伺服器端找到對應的已註冊的NFS daemon埠後會回報給客戶端。
3)客戶端了解正確的埠後,就可以直接與NFS守護程序來聯機。
由於NFS的各項功能都必須要向RPC註冊,因此RPC才能瞭解NFS服務的各項功能的port numberPIDNFS在主機所監聽的IP等,而客戶端才能夠通過RPC的詢問找到正確對應的埠。即NFS必須要有RPC存在時才能成功地提供服務,因此我們稱NFSRPC Server的一種。事實上,有很多這樣的伺服器都向RPC註冊。例如,NISNetwork Information Service)也是RPC Server的一種。所以如下圖所示,不論是客戶端還是伺服器端,要使用NFS都需要啟動RPC


2 NFSRPC服務及作業系統的相關性

NFS協議從誕生到現在為止,已經有多個版本,如NFS V2rfc794)及NFS V3rfc1813)(最新的版本是V4rfc307))。最早,SUN公司曾將NFS V2設計為只使用UDP,主要原因是當時機器的記憶體、網路速度和CPU的影響,不得不選擇對機器負擔較輕的方式。而到了NFS V3SUN公司選擇了TCP作為預設的傳輸方式。V3相對V2的主要區別如下:
1)檔案尺寸:V2最大隻支援32位的檔案大小(4 GB),而V3新增加了支援64位檔案大小的技術
2)檔案傳輸尺寸:V3沒有限定傳輸尺寸,V2最多隻能設定為8 KB,可以使用-rsize and -wsize來設定
3)返回完整的資訊:V3增加和完善了返回錯誤和成功資訊,對於伺服器的設定和管理能帶來很大好處
4)增加了對TCP傳輸協議的支援:V2只提供了對UDP的支援,在一些高要求的網路環境中有很大限制;V3增加了對TCP的支援。UDP有著傳輸速度快且非連線傳輸的便捷特性,但是在傳輸上沒有TCP穩定。當網路不穩定或者黑客入侵時很容易使NFS的效能大幅度降低,甚至使網路癱瘓。所以對於不同情況,網路要有針對性地選擇傳輸協議。NFS的預設傳輸協議是UDP,然而RHEL 4.0核心提供了對通過TCPNFS的支援。要通過TCP來使用NFS,在客戶端系統上掛載NFS匯出的檔案系統時包括一個“-o tcp”選項。使用TCP的優點和缺點如下:
1)被提高了的連線永續性,因此獲得的NFS stale file handles訊息就會較少。
2)載量較大的網路的效能會有所提高,因為TCP確認每個分組,而UDP只在完成時才確認。
3TCP具有擁塞控制技術(UDP根本沒有),在一個擁塞情況嚴重的網路上,UDP分組是被首先撤銷的型別。使用UDP意味著,如果NFS正在寫入資料(單元為8 KB的塊),所有這8 KB資料都需要被重新傳輸。由於TCP的可靠性,8 KB資料中只有一部分需要重新傳輸。
4)錯誤檢測。當TCP連線中斷(由於伺服器停止),客戶端就會停止傳送資料而開始重新連線。UDP是無連線的,使用它的客戶端就會繼續給網路傳送資料直到伺服器重新上線為止。
5TCP的費用在效能方面的提高並不顯著。
5)非同步寫入特性。
6)改進了伺服器的mount效能。
7)有更好的I/O寫效能。
8)更強的網路執行效能,使得網路執行更為有效。
9)更強的災難恢復功能。

Linux上,UDP是預設使用的協議。作為伺服器別無選擇。但作為客戶端,可以使用TCP和其他使用TCPUNIX NFS伺服器互聯。在區域網中使用UDP較好,因為區域網有比較穩定的網路保證。使用UDP可以帶來更好的效能,Linux預設使用V2,但是也可以通過mount optionnfsvers=n選擇。NFS使用TCP/IP提供的協議和服務運行於OSI層次模型的應用層,如表1所示。


1  OSI層次模型上的NFS

層    數

名    稱

功    能

1

應用層

NFS

2

表示層

XDR

3

會話層

RPC

4

傳輸層

UDPTCP

5

網路層

IP

6

資料鏈路層

7

物理層

Ethernet

相關推薦

Glusterfsnfs模組原始碼分析nfs原理協議

歡迎大家相互交流,共同提高技術。 一、網路檔案系統概述 Sun Microsystems公司於1984年推出了一個在整個計算機工業中被廣泛接受的遠端檔案存取機制,它被稱為Sun的網路檔案系統(Network File System),或者簡稱為NFS。該機制允許在一

Apollo Planning模組原始碼分析

【本文篇幅較長共分為上下兩篇,此為第一部分】阿波羅專案(https://github.com/ApolloAuto/apollo)規劃(Planning)模組位於名稱空間:apollo::planning,其作用在於構建無人車從起始點到目的地之間的路徑規劃,具體而言,就是給定

zigbee ZStack-2.5.1a原始碼分析無線資料傳送接收

前面說過SampleApp_Init和SampleApp_ProcessEvent是我們重點關注的函式,接下來分析無線傳送和接收相關的程式碼: 在SampleApp_ProcessEvent函式中: if ( events & SYS_EVENT_MSG ) {  &nbs

tornado原始碼分析iostream

在事件驅動模型中,所有任務都是以某個事件的回撥函式的方式新增至事件迴圈中的,如:HTTPServer要從socket中讀取客戶端傳送的request訊息,就必須將該socket新增至ioloop中,並設定回掉函式,在回掉函式中從socket中讀取資料,並且檢查request訊息是否全部接收到了,如果

Docker原始碼分析Docker Client

一、建立Docker Client     Docker是一個client/server的架構,通過二進位制檔案docker建立Docker客戶端將請求型別與引數傳送給Docker Server,Docker Server具體執行命令呼叫。 Docker Client執行流

Vuex 2.0 原始碼分析

當我們用 Vue.js 開發一箇中到大型的單頁應用時,經常會遇到如下問題: 如何讓多個 Vue 元件共享狀態 Vue 元件間如何通訊 通常,在專案不是很複雜的時候,我們會利用全域性事件匯流排 (global event bus)解決,但是隨著複雜度的提升,這些程式碼將變的難以

SpringMVC原始碼分析請求如何轉發到對應的Controller

        在前一篇對DispatcherServlet的分析中,初略的過了下請求是如何處理的,本文將重點分析,HandlerMapping與HandlerAdapter是如何工作的          在web容器啟動的過程中,會初初始化一系列SpringMVC所需

Docker原始碼分析整體架構圖

一、Docker的總架構圖  docker是一個C/S模式的架構,後端是一個鬆耦合架構,模組各司其職。 使用者是使用Docker Client與Docker Daemon建立通訊,併發送請求給後者

Android如何在應用層進行截圖及截圖原始碼分析

最近在看framework層程式碼時發現其中有一個是測試截圖操作的專門的包,於是潛意識的驅使下就研究了這方面的知識,今天作個總結吧!以及我們在寫上層應用時如何做截圖操作的,那麼我們先來看看截圖的原始碼分析,其實截圖操作就java這部分是放在了系統SystemUI

HashMap原始碼分析

HashMap是一種散列表,通過陣列加連結串列的方式實現。在JDK1.8版本後新增加了紅黑樹結構來提高效率。 HashMap HashMap是Java的Map介面的一種基礎雜湊表實現。它提供了Map的所有操作,並且支援以null為key或value。(除了是非同步的以及支援null以外,HashMap與H

Mybatis原始碼分析5—— 外掛的原理

MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。 預設情況下,可以使用外掛來攔截的方法呼叫包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, cl

Mybatis原始碼分析4—— Mapper的建立獲取

Mybatis我們一般都是和Spring一起使用的,它們是怎麼融合到一起的,又各自發揮了什麼作用? 就拿這個Mapper來說,我們定義了一個介面,聲明瞭一個方法,然後對應的xml寫了這個sql語句, 它怎麼就執行成功了?這傢伙是怎麼實現的,帶著這個好奇心,我一步步跟蹤,慢慢揭開了它的

dubbo原始碼分析:超時原理以及應用場景

本篇主要記錄dubbo中關於超時的常見問題,實現原理,解決的問題以及如何在服務降級中體現作用等。 超時問題 為了檢查對dubbo超時的理解,嘗試回答如下幾個問題,如果回答不上來或者不確定那麼說明此處需要再多研究研究。 我只是針對個人的理解提問題,並不代表我理解的就是全面深入的,但我的問題如果也回答不

細思恐極的星座分析 ——用大資料機器學習揭開十二星座的真實面目!

“為什麼我的論文總髮表不了,是不是我天生就不是做研究的料?”很多同學在寫論文中遇到挫折,經常會發出這樣的疑問。那麼今天我就用星座,真實的資料和“高大上”的機器學習來幫大家分析一下原因。首先宣告,我不是宿命論的支持者,也不懂占星術。本文也不是教大家如何成功,但利用本文的研究成果,可以幫助大家少走些彎路。現在網

AQS(AbstractQueuedSynchronizer)原始碼分析——共享的aquiredrelease

     本文是在AQS(AbstractQueuedSynchronizer)原始碼分析(一)和AQS(AbstractQueuedSynchronizer)原始碼分析(二)兩篇文章的基礎上編寫的。關於shouldParkAfterFailedAcquire,addWait

istio原始碼分析pilot-discovery模組分析_Kubernetes中文社群

Istio是由Google/IBM/Lyft共同開發的新一代Service Mesh開源專案。 上次我們深入剖析了pilot-agent的各個功能,這次讓我們一起來看看pilot-discovery有何功能。 注:本文分析的istio程式碼版本為0.8.0,commit為0cd8d67,com

Glusterfsrpc模組原始碼分析(中Glusterfs的rpc模組實現3

歡迎大家相互交流,共同提高技術。 第三節、rpc通訊過程分析 前面兩個小節分別對rpc服務端和客戶端的建立流程做了詳細的分析,也就是說rpc客戶端和伺服器端已經能夠進行正常的通訊了(rpc客戶端已經通過connect連結上rpc伺服器了),那麼這一小節主要根據一個實際

android原始碼分析View的事件分發

1、View的繼承關係圖 View的繼承關係圖如下: 其中最重要的子類為ViewGroup,View是所有UI元件的基類,而ViewGroup是容納這些元件的容器,同時它也是繼承於View類。而UI元件的繼承關係如上圖,比較常用的元件類用紅色字型標出

Flume NG原始碼分析支援執行時動態修改配置的配置模組

在上一篇中講了Flume NG配置模組基本的介面的類,PropertiesConfigurationProvider提供了基於properties配置檔案的靜態配置的能力,這篇細說一下PollingPropertiesFileConfigurationProvider提供的執行時動態修改配置並生效的

Flume NG原始碼分析基於靜態properties檔案的配置模組

日誌收集是網際網路公司的一個重要服務,Flume NG是Apache的頂級專案,是分散式日誌收集服務的一個開源實現,具有良好的擴充套件性,與其他很多開源元件可以無縫整合。搜了一圈發現介紹Flume NG的文章有不少,但是深入分析Flume NG原始碼的卻沒有。準備寫一個系列分析一下Flume NG的