我可以始终将整个 ArangoDB 集合保存在内存中吗?

Can I always keep a whole ArangoDB collection in memory?

当我第一次加载一个集合到内存时,它全部在内存中(我可以在任务管理器中看到它),但是随着时间的推移我发现只有原始大小的一部分被占用了arangod 进程。此外,当我执行查询并从该集合中检索数据时,我可以看到磁盘使用量在短时间内增长,并且已用 RAM 的大小也在增长。

我想避免它。我该怎么做? 我看到集合有 属性 isVolatile

isVolatile: If true then the collection data will be kept in memory only and ArangoDB will not write or sync the data to disk.

这几乎是我想要的,但是

Unloading the collection will cause the collection data to be discarded. Stopping or re-starting the server will also cause full loss of data in the collection

我能否以某种方式将整个集合保存在内存中,但在卸载后不会丢失数据?

保证您的 collection 位于 RAM 中的唯一方法是使用 MMFiles 引擎。使用 RocksDB 没有任何保证。两次完整的 collection 扫描也应该导致 RocksDB collections 被加载到 RAM。但是当你耗尽你的内存时,一些数据又被卸载了。

仅仅因为内存数据返回并不表示 collection 数据正在卸载。这是关于 MMF 的维基百科文章:https://en.wikipedia.org/wiki/Memory-mapped_file。因此,只要您的 collection 已加载(当您访问它的数据或专门调用加载方法时会立即发生),它就会驻留在 RAM 中。

关于您关于数据丢失的问题:您有 2 种不同的将数据同步到磁盘的策略,您可以从中选择:wait-for-sync true 或 false。此参数可以在启动时设置 - 然后影响所有数据库和所有 collections - 或者在您最初创建它们时按每个 collection 设置。顾名思义,它指的是数据点被视为已提交并报告给客户端的时间点。对于高性能和较低的安全性,该值可以设置为 false。在这种情况下,如果机器或磁盘突然出现故障,可能会丢失几秒钟的数据。

TLDR 使用 MMFiles 并且你的 loaded collections 存在于 RAM 中,只要你还有内存。超出这一点,您最终会进入 swap space,并对性能造成可怕的后果。