2012-01-10 60 views
4

我需要實現儘可能最快的方式來將密鑰/值對存儲在Linux上的分佈式系統中。數據庫記錄很小,平均爲256字節。我打算使用open(),write()和read()系統調用,並直接在文件中的某個偏移量處編寫鍵值對。我可以省略fdatasync()系統調用,因爲我將使用帶有電池的SSD磁盤,所以如果發生意外的系統關閉,我不必擔心ACID兼容性問題。 Linux已經提供了磁盤緩存實現,所以在已經加載到內存中的扇區上不會發生讀/寫操作。這(我認爲)將是存儲數據的最快方式,比任何其他緩存數據庫引擎(例如GT.M或Intersystem的Globals)要快得多。如果我有2個數據服務器(1個本地服務器和1個遠程服務器),那麼這個數據服務器就可以使用NFS來掛載另一個Linux服務器的文件系統, ,我會發出2 open(),2 write()和2 close()調用。如果遠程服務器上的事務失敗,我會將其標記爲「不同步」,並在遠程服務器恢復時再次複製正確的文件。實現高性能分佈式文件系統/數據庫

您如何看待這種方法?它會很快嗎?我可以在UDP上使用NFS,這樣我就可以避免TCP Stack的開銷。

優勢列表到目前爲止是這樣的:

  • Linux磁盤高速緩存中重用
  • 的幾行代碼
  • 高性能

我會用C語言來編寫此要找到在文件中的記錄我將保留一個指向物理位置的指針。

+0

等等,你爲什麼需要寫這個?這是爲了一個班級什麼的? – chrisaycock 2012-01-10 17:59:01

+0

不,它適用於Web應用程序 – Nulik 2012-01-10 18:03:00

+0

您是否考慮將GDBM用作基本庫? – 2012-01-10 20:33:30

回答

1

您可能會看到一個真正的分佈式文件系統,而不是使用NFS,正如您所指出的那樣,它仍然提供單點故障和不復制。

最初由CMU開發的Andrew File System(AFS)可能是您的解決方案。這是一個商業產品,但你可能會檢查出在Linux(和其他系統)上工作的OpenAFS

雖然警告:AFS有學習曲線。

3

想到一些建議。

  • 是否需要爲每個事務打開()/ write()/ close()? open()的系統調用開銷尤其可能不是微不足道的

  • 您可以使用mmap()而不是顯式write()s嗎?

  • 如果您爲每個事務執行2個write()調用(1個本地,1個NFS),那麼看起來像任何類型的網絡問題(延遲,丟棄的數據包等)都有可能使您的應用程序如果您正在等待NFS write()調用成功,那麼會發出尖銳的停頓。如果你不在等待,例如通過從一個單獨的線程執行NFS寫入,你的複雜性將迅速增長(我不認爲「幾行代碼」將保持真實。)

一般情況下,我建議你真正證明自己,可用的工具不要選擇重新發明這個特定的車輪前,滿足您的性能需求。

+0

謝謝!是的,我可能省略open()close()並且只發出write()read(),但我不確定你用mmap()替換write()的含義,你能解釋一下嗎? – Nulik 2012-01-10 18:25:13

+0

我同意,在這裏需要一點複雜性來暫停遠程服務器,然後再重新同步它。 – Nulik 2012-01-10 18:26:30

+0

好吧,我瞭解了mmap,但我想我必須使用write()/ read(),因爲它需要內存,而且我的應用程序中將使用2MB頁面,而不是標準4K。 – Nulik 2012-01-10 18:52:20