内存数据库如何在 GemfireXD 中存储大于 RAM 内存的数据?

How in-memory databases store data larger than RAM memory in GemfireXD?

如果我使用的集群有 4 个节点,每个节点有 4GB RAM,那么总 RAM 内存为 16GB。而且我必须在 table 中存储 20 GB 的数据。 那么内存数据库将如何容纳这些数据呢?我在某处读到数据在 RAM 和磁盘之间交换,但这不会使数据访问变慢。请解释

HANA 提供了从主内存卸载数据的可能性。由于数据随后存储在硬盘上,因此访问该数据的查询当然会 运行 变慢。如果您还没有听说过 hot/warm/cold 数据概念,请查看它。

本文为您提供有关此主题的更多信息:http://scn.sap.com/community/bw-hana/blog/2014/02/14/sap-bw-on-hana-data-classification-hotwarmcold

虽然这个问题只针对 SQLITE,但 HANA 想分享一些关于 Oracle Database Inmemory. It achieves loading huge tables into inmemory area by using various compression algorithms. Data populated into the IM column store is compressed using a new set of compression algorithms 的见解,这些见解不仅有助于节省 space,还可以提高查询性能。例如,当使用 capacity high 压缩到 3GB 时,table 的大小为 10GB。这允许,table 其大小大于 RAM 以压缩格式存储在内存区域中。

OP 特别询问了集群,因此排除了 SQLite(至少开箱即用)。您需要一个能够:

的 DBMS
  1. 将 4 X 4GB 内存视为 16GB "storage"(IOW 将数据分布在集群的各个节点上,但将其视为一个整体)
  2. 压缩数据以将 20GB 的原始数据压缩到可用的 16GB

eXtremeDB 就是这样一种解决方案。 Oracle 的内存中数据库(带有 RAC)也是如此。我确定还有其他人。

GemFire 或 GemFireXD evicts 如果在容纳更多数据时感到内存压力,则将数据写入磁盘。 它可能会对性能产生一些影响。但是,用户可以控制驱逐的方式和时间。所有算法都使用最近最少使用算法来驱逐数据。 此外,当一行被逐出时,主键值将保留在内存中,而剩余的列数据将被逐出。这使得从磁盘中获取行的速度更快。

您可以通过以下链接了解 GemFireXD 中的逐出: http://gemfirexd.docs.pivotal.io/1.3.0/userguide/developers_guide/topics/cache/cache.html

如果你这样配置你的表,GemFireXD 可以使用堆外内存来在内存中存储更多的数据,从而推迟将数据逐出到磁盘上的需要(尽管对逐出数据的读取进行了优化为了更快地查找,因为查找键在内存中)

http://gemfirexd.docs.pivotal.io/1.3.1/userguide/data_management/off-heap-guidelines.html