天天看點

NFS4.1規範研究:session

NFS4僅支援單伺服器,并且用戶端和伺服器隻有一個連接配接。這意味着用戶端不能并發通路伺服器資料。同時NFS4雖然支援EOS(Exactly Once Semantics),但存在重大設計缺陷。NFS4.1有兩個主要目标:1)修正NFS4的一些重大設計缺陷; 2) 提高并發通路能力。

為此NFS4.1引入一個重大的設計:session。Session的引入是為了解決下面幾大問題:

1) 支援EOS(Exactly Once Semantics)

2) 支援回調;

3) 支援trunking(中繼)的并發通路

4) Requiring machine credentials for fully secure operation.(這個不談)

當用戶端啟動後,通過EXCHANGE_ID擷取相應的伺服器(scope)配置設定的clientid。緊接着,通過CREATE_SESSION建立特定的session,并向伺服器确認clientid。EXCHANGE_ID和CREATE_SESSION取代了NFS4的SETCLIENTID和SETCLIENTID_CONFIRM。

NFS4.1所有的用戶端操作均基于session。每個用戶端可有多個session,session可以連接配接不同的server。每個session最多可以有兩個通道(channal): 前端通道和後端通道。每個通道可以擁有多個連接配接(connection),每個連接配接的類型可以不同。

用戶端發起的請求走前端通道,後端通道作為伺服器端的回調通路。Session的請求均基于COMPOUND指令,每個COMPOUND指令可以組合多個操作,完成一組複雜的指令。

中繼是為了加快資料傳輸,其本質就是利用位于同一組client和server的多個連接配接進行并發資料傳輸。

Session中繼:一個用戶端可以有多個session,一個session可以有多個連接配接。用戶端和伺服器均可以有多個網卡(interface),這意味着同一組用戶端和伺服器之間的連接配接其目标位址和源位址均是可以不同的。Session中的connection是否可用于中繼傳輸,最本質的就是判斷此連接配接是否是同一組用戶端和伺服器的連接配接。

Clientid中繼:在NFS4.1中,多個伺服器可以位于同一台機器,及一組伺服器擁有同樣的資源(叢集,共享磁盤),均可為所有客戶提供同樣的資料。每個clientID唯一表示同一個client。一個client可以擁有多個session。故Clientid 中繼隻需session位于同樣的client和server間即可。

NFS4可提供EOS保證,但存在設計缺陷。NFS4通過讓每個狀态請求攜帶序列号并緩存此類請求的響應,基于此保證EOS。這意味着每個狀态請求必須有一個緩存響應的空間。每個用戶端的狀态可以是無限的,這将極大的浪費伺服器的記憶體空間。故NFS要求用戶端限定隻能有一個未收到響應的狀态請求。這避免浪費記憶體空間,但極大限制了NFS的并發請求。本質上,序列号和響應緩存隻有在用戶端未收到響應之前才是有效的,收到響應之後,序列号和緩存就已經沒有存在的意義。

NFS4.1同樣采用序列号+緩存響應(response)的機制保證EOS,同時共享session内的緩存空間。在用戶端建立session時,将同時設定最大的緩存空間,請求大小,response大小等參數。所有的用戶端操作均基于特定session,每個操作均攜帶序列号和slot ID(緩存槽)。伺服器在發回響應之前,将響應基本資訊或全部資訊存于緩存槽。若用戶端正确收到響應,則該緩存槽将可用于其他操作。本質:伺服器可共享緩存槽。用戶端必須控制未收到響應的操作數(不能大于slot數量)。

重用緩存槽還有另一個額外好處,伺服器可知道用戶端是否收到響應。隻要緩存槽被重用,即說明用戶端已經收到響應!

每個slot都有自己的序列号。用戶端需要記錄每個slot的狀态:目前序列号,是否可用(是否已收到響應)等。伺服器通過判斷請求的序列号與目前槽的序列号可判斷請求是否有效。槽序列号由用戶端維護。槽的大小可調整,故用戶端可同時發起無數個請求(理論上)。NFS4.1要求所有的請求都需要攜帶序列号。

有些請求可引發callback,callback可能比相應請求更先被用戶端收到。Client必須能夠正确處理callback race。

每個用戶端請求可通過三元組辨別: session ID, slot ID, sequence ID。此三元組将被緩存于slot中,server能夠知道其響應是否已經被用戶端收到:slot是否被重用。在slot未被重用之前,該請求所引發的callback均需要傳回 session ID, slot ID, sequence ID 三元組給用戶端。用戶端根據此三元組可知道callback是否比響應更早達到用戶端。若callback更早到達,則該callback應被推遲處理;因不能無限推遲,故在一段時間後,若請求的響應還未達到,該callback被忽略。

注:規範上的細節非常多,這裡僅給出概括。

本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2011/05/29/NFS4_1_session.html   ,如需轉載請自行聯系原作者

繼續閱讀