儲存

    在許多方面,Meilisearch 都是一個資料庫:它儲存已索引的文件以及傳回相關搜尋結果所需的資料。

    資料庫位置

    Meilisearch 會在您首次啟動執行個體時建立資料庫。預設情況下,您可以在與 meilisearch 二進位檔案相同的目錄中找到 data.ms 資料夾。

    資料庫位置可能會因許多因素而異,例如您是否已使用--db-path 執行個體選項設定不同的資料庫路徑,或者您是否正在使用像Docker之類的作業系統虛擬化工具。

    LMDB

    從頭開始建立資料庫並加以管理是一項艱鉅的任務。嘗試重新發明輪子是沒有意義的,因此 Meilisearch 在底層使用儲存引擎。這讓 Meilisearch 團隊可以專注於提升搜尋相關性和搜尋效能,同時將在磁碟和記憶體中建立、讀取和更新文件的複雜任務抽象化。

    我們的儲存引擎稱為閃電記憶體對應資料庫 (簡稱 LMDB)。LMDB 是以 C 語言撰寫的交易式鍵值儲存,為 OpenLDAP 開發,並具有 ACID 屬性。雖然我們考慮過其他選項,例如 SledRocksDB,但我們選擇 LMDB,因為它為我們提供了效能、穩定性和功能的最佳組合。

    記憶體對應

    LMDB 將其資料儲存在記憶體對應檔案中。從 LMDB 擷取的所有資料都直接從記憶體對應傳回,這表示在資料擷取期間沒有記憶體配置或記憶體複製。

    當 Meilisearch 要求時,磁碟上儲存的所有文件都會自動載入記憶體中。這確保 LMDB 始終能充分利用可用的 RAM 來擷取文件。

    為了獲得最佳效能,建議提供與資料庫在磁碟上佔用的大小相同的 RAM,以便所有資料結構都能放入記憶體中。

    了解 LMDB

    選擇 LMDB 會帶來一些優缺點,尤其是在資料庫大小和記憶體使用方面。我們在此總結 LMDB 最重要的方面,但請查看這篇LMDB 開發人員撰寫的部落格文章,以取得更深入的資訊。

    資料庫大小

    從 Meilisearch 索引中刪除文件時,您可能會注意到磁碟空間使用量保持不變。發生這種情況是因為 LMDB 在內部將該空間標示為可用,但不會讓作業系統廣泛使用。這種設計選擇可帶來更好的效能,因為不需要定期執行壓縮操作。因此,LMDB (以及 Meilisearch) 佔用的磁碟空間往往會隨著時間的推移而增加。無法計算 Meilisearch 執行個體可佔用的精確最大空間量。

    記憶體使用量

    由於 LMDB 是記憶體對應的,因此由作業系統管理配置給 Meilisearch 的實際記憶體 (或不配置)。

    因此,如果您在伺服器上以獨立程式執行 Meilisearch,LMDB 會使用它可以使用的最大 RAM。一般來說,您應該擁有與 Meilisearch 在磁碟上佔用空間相同的 RAM,以獲得最佳效能。

    另一方面,如果您同時執行 Meilisearch 和其他程式,作業系統會根據每個人的需求管理記憶體。這使得 Meilisearch 在開發中使用時記憶體使用量相當彈性。

    提示

    虛擬記憶體 != 實際記憶體 虛擬記憶體是程式從作業系統要求的磁碟空間。這不是程式實際會使用的記憶體。

    Meilisearch 一律會要求一定量的空間來用作記憶體對應。此空間將用作虛擬記憶體,但實際使用記憶體 (RAM) 的量會小得多。

    測量的磁碟使用量

    以下測量值是使用movies.json這個 8.6 MB JSON 資料集(包含 19,553 個文件)所取得。

    索引建立後,LMDB 中的資料集大小約為 122MB。

    原始 JSONMeilisearch 在磁碟上的資料庫大小RAM 使用量虛擬記憶體使用量
    9.1 MB224 MB≃ 305 MB205 GB(記憶體映射)

    這表示資料庫正在使用305 MB 的 RAM 和 224 MB 的磁碟空間。請注意,虛擬記憶體僅指您的電腦為 Meilisearch 分配的磁碟空間,並不代表資料庫實際正在使用它。 詳情請參閱記憶體使用量

    警告

    這些指標高度依賴於運行 Meilisearch 的機器。在效能明顯不足的機器上運行此測試可能會得到不同的結果。

    請務必注意,沒有可靠的方法可以預測資料庫的最終大小。這幾乎適用於市面上任何搜尋引擎——我們只是唯一大聲說出來的。

    資料庫大小會受到大量因素影響,包括設定、相關性規則、分面(facets)的使用、存在的不同語言數量等等。