Cage遠端檔案存取系統

系統目的

支援遠端存取網路電腦上的檔案。 該系統透過使用 TCP 協定交換事務(訊息)來「虛擬」支援所有基本文件操作(建立、刪除、讀取、寫入等)。

應用

此系統的功能在以下情況下有效:

  • 在行動和嵌入式裝置(智慧型手機、車載控制系統等)的本機應用程式中,這些應用程式需要在面臨可能的臨時通訊中斷(離線)時快速存取遠端伺服器上的檔案;
  • 在載入的DBMS中,如果某些伺服器進行查詢處理,另一些伺服器進行資料儲存;
  • 在分散式企業網路中收集和處理信息,要求高速資料交換、冗餘和可靠性;
  • 在具有微服務架構的複雜系統中,模組之間的資訊交換延遲至關重要。

結構

Cage 系統(Windows 上的 Python 3.7 有一個實作 - beta 版本)包括兩個主要部分:

  1. 籠式伺服器 — 在網路上的電腦上執行的檔案伺服器程式(功能包),其檔案需要遠端存取;
  2. 具有客戶端軟體方法庫,簡化了與伺服器互動的編碼。

在客戶端使用系統

Cage 類別的方法取代了通常的「例行」檔案系統操作: 建立、開啟、關閉、刪除 文件,以及 以二進位格式讀取/寫入數據 (表示資料的位置和大小)。 從概念上講,這些方法接近 C 語言的檔案函數,其中開啟/關閉檔案是在輸入/輸出的「通道」上執行的。

換句話說,程式設計師不使用「文件」物件(類 _io 在 Python 中),但使用 Cage 類別的方法。

當建立 Cage 物件的實例時,它會與一個伺服器(或多個伺服器)建立初始連接,由客戶端 ID 授權,並接收所有檔案操作的專用連接埠號碼的確認。 當 Cage 物件被刪除時,它會指示伺服器停止通訊並關閉檔案。 通訊的終止也可以由伺服器本身發起。

系統透過將客戶端程式經常使用的檔案片段快取在RAM快取(緩衝區)中來提高讀取/寫入效能。
客戶端軟體可以使用任意數量的具有不同設定(緩衝記憶體大小、與伺服器交換時的區塊大小等)的Cage物件。

單一 Cage 物件可以與多個伺服器上的多個檔案進行通訊。 通訊參數(IP 位址或 DNS 伺服器、授權的主連接埠、路徑和檔案名稱)在建立物件時指定。

由於每個 Cage 物件可以同時處理多個文件,因此共享記憶體空間用於緩衝。 快取大小 – 頁面數量及其大小,在建立 Cage 物件時動態設定。 例如,1 GB 快取是 1000 個每個 1 MB 的頁面,或 10 萬個每個 100 KB 的頁面,或 1 萬個每個 1 KB 的頁面。 選擇頁面大小和頁數是每個應用案例的特定任務。

您可以同時使用多個 Cage 物件來定義不同的緩衝記憶體設置,具體取決於不同檔案中資訊的存取方式。 作為基本的緩衝演算法,使用最簡單的緩衝演算法:在給定數量的記憶體耗儘後,新頁面會按照最少造訪次數的退休原則取代舊頁面。 緩衝在不均勻(統計意義上)共享訪問的情況下尤其有效,首先是對不同文件的共享訪問,其次是對每個文件的片段的共享訪問。

Cage 類別不僅透過資料位址(指示陣列的位置和長度,「替換」檔案系統操作)支援 I/O,而且還支援較低的「實體」等級 - 透過緩衝記憶體中的頁號。

Cage 物件支援原始功能 “冬眠” (「睡眠」) - 它們可以「折疊」(例如,在與伺服器失去連接的情況下,或當應用程式停止時等)到客戶端的本機轉儲檔案中,並從此檔案(通訊恢復後,重新啟動應用程式時)。 這使得在暫時「離線」後啟動客戶端程式時可以顯著減少流量,因為經常使用的檔案片段已經在快取中。

Cage大約有3600行程式碼。

伺服器建構原理

Cageserver 檔案伺服器可以使用任意數量的連接埠運行,其中一個(「main」)僅用於所有客戶端的授權,其餘的用於資料交換。 Cage伺服器程式只需要Python。 同時,具有檔案伺服器的電腦可以執行任何其他工作。

伺服器最初作為兩個主要進程的集合啟動:

  1. “連接” – 執行與客戶端建立通訊並在伺服器主動終止通訊的操作的過程;
  2. "營運" – 執行客戶端任務(操作)以處理文件以及根據客戶端命令關閉通訊會話的過程。

兩個進程並不同步,並且被組織為基於多進程隊列、代理物件、鎖和套接字的接收和發送訊息的無限循環。
Connection進程為每個用戶端分配一個連接埠來接收和傳送資料。 連接埠數在伺服器啟動時設定。 連接埠和客戶端之間的對應儲存在進程間共享的代理記憶體中。

Operations進程支援共享檔案資源,以便多個不同的用戶端可以共用(準並行,因為存取是由鎖定控制的)從一個檔案讀取資料(如果在「第一個」客戶端最初開啟該檔案時允許這樣做)。

在伺服器上建立/刪除/開啟/關閉檔案的命令的處理是在「操作」進程本身中嚴格地按順序使用伺服器作業系統的檔案子系統執行的。

為了通常加快讀取/寫入速度,這些操作是在「操作」進程產生的執行緒中執行的。 線程的數量通常等於打開的文件的數量。 來自客戶端的讀取/寫入任務被提交到通用佇列,第一個空閒線程從其頭部獲取任務。 特殊邏輯可讓您消除伺服器 RAM 中的資料重寫操作。

操作進程監視客戶端活動,並根據其命令或超過不活動逾時時停止為它們提供服務。

為了確保可靠性,Cageserver 保留所有交易的日誌。 一份常規日誌包含來自客戶端的訊息副本,其中包含建立/開啟/重新命名/刪除檔案的任務。 為每個工作文件建立一個單獨的日誌,其中記錄了在該工作文件中讀取和寫入資料的任務的訊息副本,以及寫入的(新)資料數組和在覆蓋(寫入)過程中破壞的資料數組。新資料“位於舊資料之上”)。)

這些日誌提供了恢復備份的新變更以及將當前內容回滾到過去某個時間點的能力。

Cageserver大約有3100行程式碼。

Cage遠端檔案存取系統

啟動 Cageserver 檔案伺服器程式

啟動時,您需要在對話方塊中定義:
——授權的主要連接埠;
— 與授權用戶端交換交易的連接埠數量(從 1 或更多,號碼池從主連接埠號碼旁邊的那個開始)。

使用籠類

籠。( age_name="",pagesize=0,numpages=0,maxstrlen=0,server_ip={},wait=0,awake=False,cache_file="" )

從此類建立與檔案伺服器互動並包含緩衝記憶體的物件。

參數

  • 籠子名稱(STR) - 物件的條件名稱,用於在伺服器端識別客戶端
  • 頁面大小(INT) — 一頁緩衝記憶體的大小(以位元組為單位)
  • 頁數(INT) — 緩衝記憶體頁數
  • 最大長度(INT) - 寫入和讀取操作中位元組串的最大長度
  • 服務器地址(字典) - 包含所使用伺服器位址的字典,其中鍵是伺服器的條件名稱(應用程式內的伺服器 ID),值是位址為「ip 位址:連接埠」或「DNS: port」(名稱和真實位址的比較是臨時的,可以更改)
  • 等待(INT) — 接收連接埠時等待伺服器回應的時間(以秒為單位)
  • (布爾) — 物件創建方式的標誌 ( - 如果建立了一個新對象, - 如果一個物件是從先前「折疊」的物件建立的 - 使用「休眠」操作,預設為 False)
  • 快取文件(STR) - 休眠的檔案名

方法

籠。文件創建( 伺服器、路徑 ) – 建立一個新文件

籠。文件重命名( 伺服器、路徑、新名稱 ) – 重新命名文件

籠。文件刪除( 伺服器、路徑) - 刪除文件

籠。打開( 伺服器、路徑、模式 ) - 開啟文件

回報 頻道 頻道號碼。 範圍 MOD — 這是檔案開啟模式:「wm」 — 獨佔(讀/寫),「rs」 — 只讀,僅共用給其他客戶端讀取,「ws」 — 讀/寫,僅共用給讀取-僅由其他客戶。

籠。完成交易 (頻道) – 關閉文件

籠。(fchannel、開始、數據 ) – 將位元組字串寫入文件

籠。閱讀 (fchannel、開始、len_data ) – 從檔案中讀取位元組字串

籠。put_pages ( 頻道 ) – 將指定頻道中已修改的所有頁面從緩衝區「推送」到伺服器。 當您需要確保通道上的所有操作都實際保存在伺服器上的檔案中時,請在演算法中的那些點上使用它。

籠。推送全部 () – 將已修改的 Cage 類別實例的所有通道的所有頁面從緩衝區「推送」到伺服器。 當您需要確保所有通道上的所有操作都保存在伺服器上時使用。

來源: www.habr.com

添加評論