前面文章我們從應用層面對NFS進行了介紹,接下來的文章我們將進入實現層面。本文首先從整體上對Linux的NFS軟件架構進行介紹,然后介紹代碼與實際業務邏輯介紹一下NFS的處理流程。
NFS文件系統的架構分析
NFS分布式文件系統是一個客戶端-服務端架構(CS架構)。其客戶端是Linux內核中的一個文件系統,跟Ext4和XFS類似,它是虛擬文件系統下的一個具體實現。與其它本地文件系統(例如Ext4,XFS或者Btrfs等)的差異在于其數據請求不存儲在本地磁盤,而是通過網絡發送到服務端進行處理。
總體架構設計,如圖1是是NFS的整體軟件架構,其中左側是客戶端,右側是服務端。客戶端我們稱為NFS文件系統,其位于VFS之下,再之下是RPC模塊,兩者都位于Linux內核之中。
在服務端的NFS主要是指NFSD,它是一個NFS服務。該服務用于接收服務端的請求,處理后通過RPC將處理結果反饋給客戶端。而服務端最終還是要將數據存儲起來的,在Linux中的NFS服務還是借助的本地文件系統來存儲的。因此,在NFS服務端,其數據相關的業務邏輯也會調用到VFS的接口,然后是經過本地文件系統存儲在持久化存儲上(如磁盤)。
NFS的通信使用的是RPC協議,該協議也是Sun發明的一種網絡通信協議。RPC協議位于TCP/IP協議之上,是一個應用層的協議,可以類比http協議。RPC協議進行通信的流程大致如圖2所示。
RPC協議稱為遠程過程調用,類似本地函數調用。因此,RPC首先是在客戶端和服務端都要注冊處理函數,這些被注冊的函數稱為存根。這樣,當客戶端調用某個函數時,比如寫數據,RPC服務就會將該請求通過網絡傳到服務端,然后調用服務端注冊的寫數據的接口。也就是客戶端與服務端是一一對應的。這樣在客戶端來說,其函數的調用與本地函數調用并沒有太大的差異。
HDFS的概念。Linux NFS代碼解析
為了更加清晰的理解NFS的架構,我們以寫數據為例來介紹一下NFS文件系統與服務端通信的過程。由于NFS有很多版本,且Linux內核中對所有版本都有實現。為了便于介紹和學習,我們以NFS v3為例進行介紹。
由于NFS基于VFS,因此不可避免的需要實現一套函數指針,并在掛載的時候進行注冊。這主要是保證從VFS下來的請求可以轉發到NFS文件系統進行處理。如圖3是NFS文件系統實現的函數指針集合。
以寫數據為例(客戶端無緩存,非DIRECT模式),其具體實現的函數為nfs_file_write。當用戶通過程序調用write函數時,經過VFS的vfs_write函數,最后調用NFS的nfs_file_write函數。該函數與本地文件系統的邏輯類型,它首先將數據寫入緩存中(非DIRECT模式),然后調用generic_write_sync實現緩存數據刷寫。
hdfs架構圖,在客戶端的具體的寫動作由nfs_writepages函數完成,該函數進行若干初始化動作,然后通過RPC將數據發送到服務端。對比本地文件系統,本地文件系統是通過該函數將數據寫入磁盤。
服務端向RPC注冊了各種回調函數,當接收到客戶端的請求時會調用具體的回調函數進行處理。本例將調用nfsd3_proc_write函數。該函數最后調用VFS層的寫數據函數,而VFS寫數據函數則調用具體文件系統(例如Ext4)的函數完成最終的寫數據操作。
NFS分布式文件系統的整個架構和邏輯還是比較清晰的,主要是內核中同時支持了NFSv2、NFSv3和NFSv4多個版本,整體比較復雜,但難度并不是非常大。
本文從比較高的層面介紹了NFS的整體架構和RPC的流程,很多細節沒有深入。
centos nfs、舉報/反饋
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态