儲存
在許多方面,Meilisearch 都是一個資料庫:它儲存已索引的文件以及傳回相關搜尋結果所需的資料。
資料庫位置
Meilisearch 會在您首次啟動執行個體時建立資料庫。預設情況下,您可以在與 meilisearch
二進位檔案相同的目錄中找到 data.ms
資料夾。
資料庫位置可能會因許多因素而異,例如您是否已使用--db-path
執行個體選項設定不同的資料庫路徑,或者您是否正在使用像Docker之類的作業系統虛擬化工具。
LMDB
從頭開始建立資料庫並加以管理是一項艱鉅的任務。嘗試重新發明輪子是沒有意義的,因此 Meilisearch 在底層使用儲存引擎。這讓 Meilisearch 團隊可以專注於提升搜尋相關性和搜尋效能,同時將在磁碟和記憶體中建立、讀取和更新文件的複雜任務抽象化。
我們的儲存引擎稱為閃電記憶體對應資料庫 (簡稱 LMDB)。LMDB 是以 C 語言撰寫的交易式鍵值儲存,為 OpenLDAP 開發,並具有 ACID 屬性。雖然我們考慮過其他選項,例如 Sled 和 RocksDB,但我們選擇 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。
原始 JSON | Meilisearch 在磁碟上的資料庫大小 | RAM 使用量 | 虛擬記憶體使用量 |
---|---|---|---|
9.1 MB | 224 MB | ≃ 305 MB | 205 GB(記憶體映射) |
這表示資料庫正在使用305 MB 的 RAM 和 224 MB 的磁碟空間。請注意,虛擬記憶體僅指您的電腦為 Meilisearch 分配的磁碟空間,並不代表資料庫實際正在使用它。 詳情請參閱記憶體使用量。
警告
這些指標高度依賴於運行 Meilisearch 的機器。在效能明顯不足的機器上運行此測試可能會得到不同的結果。
請務必注意,沒有可靠的方法可以預測資料庫的最終大小。這幾乎適用於市面上任何搜尋引擎——我們只是唯一大聲說出來的。
資料庫大小會受到大量因素影響,包括設定、相關性規則、分面(facets)的使用、存在的不同語言數量等等。