存储
从很多方面来说,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包含 19,553 个文档的 8.6 MB JSON 数据集进行。
索引后,LMDB 中的数据集大小约为 122MB。
原始 JSON | Meilisearch 数据库磁盘大小 | RAM 使用情况 | 虚拟内存使用情况 |
---|---|---|---|
9.1 MB | 224 MB | ≃ 305 MB | 205 Gb(内存映射) |
这意味着数据库正在使用305 MB 的 RAM 和 224 MB 的磁盘空间。请注意,虚拟内存仅指您的计算机为 Meilisearch 分配的磁盘空间,并不意味着数据库实际正在使用它。有关更多详细信息,请参阅内存使用。
警告
这些指标高度依赖于运行 Meilisearch 的机器。在功能明显不足的机器上运行此测试可能会产生不同的结果。
需要注意的是,无法可靠地预测数据库的最终大小。对于市场上的几乎所有搜索引擎来说都是如此——只是我们唯一一个公开说出来的人。
数据库大小受许多标准的影响,包括设置、相关性规则、方面使用、存在的不同语言数量等等。