Aerospike硬盘/内存使用情况

时间:2017-09-27 10:07:33

标签: memory-management aerospike

我正在探索Aerospike作为键值DB,将数据存储在磁盘上以确保安全。请确认,我理解正确:

  1. 如果在命名空间配置中我设置:
    • 存储引擎设备
    • 内存大小4G
    • file /opt/aerospike/data/namespace.dat
    • filesize 16G
    • 内存中数据 false
  2. ->所有数据仅在磁盘上,"内存大小"仅用于索引(小用量),所有数据将存储在多个16GB文件中(将自动创建),最重要的是 - 每个read查询将触发从磁盘读取数据?

    1. 如果在命名空间配置中我设置:
      • 存储引擎设备
      • 内存大小4G
      • file /opt/aerospike/data/namespace.dat
      • filesize 16G
      • 内存中数据 true
    2. ->所有数据都在磁盘上,部分在内存中,"内存大小"将像缓存一样,包含4GB最常用的数据,所有数据将存储在多个16GB文件中(将自动创建),最重要的是 - 每个read查询将触发从内存中检查数据,如果丢失 - >从磁盘读取并添加到内存?什么数据将在内存中 - 最常用或最新创建?

      1. 如果在命名空间配置中我设置:
        • 存储引擎内存
        • 内存大小4G
        • 内存中数据 true
      2. ->所有数据都只在内存中,我限制为4GB的数据,而不是更多?

1 个答案:

答案 0 :(得分:5)

Aerospike不会像第一代NoSQL数据库那样将数据输入和输出磁盘,而是具有"缓存优先的数据库。建筑。 Aerospike的hybrid memory architecture使得primary index(元数据)始终在内存中。根据命名空间配置,数据完全存储在磁盘或内存中。您为每个命名空间定义存储。如果它在内存中,则所有数据和元数据都完全在内存中。如果命名空间将其数据存储在少数设备(/ dev / sdb,/ dev / sdc)上,则主索引(元数据)完全在内存中,并且数据完全在这些SSD上。

(1)是HDD上的数据,配置正确。如果您使用的是SSD,则可能需要使用device而不是file。在您的问题中,有一件事情是不对的,Aerospike将首先检查读数上的post-write-queue

Aerospike确保block writes优化HDD和SSD的高读/低写性能。块的大小由write-block-size config参数确定(HDD应为1MB)。首先将记录加载到等效大小的流写入缓冲区中。将缓冲区刷新到磁盘上的块后,Aerospike不会立即删除此内存中的副本;它仍然是写后队列(FIFO)的一部分。默认情况下,这些块中的256个在每个设备的队列中,或者每个文件(您可以将多个file行定义为存储设备)。如果您的使用模式是在写入后仔细阅读,那么您将获得内存访问而不是磁盘访问。如果您的cache_read_pct指标不是单个数字且您有备用DRAM,则可能会从提高post-write-queue值(每个设备最多2048个块)中受益。

(2)是内存中的命名空间,持久化到磁盘。对于(1)和(2),您可以使用file(对于基于文件系统的存储)或device(对于原始设备)。主索引(元数据)和存储(数据)都在(2)的内存中。所有读取和写入都来自内存,并且辅助直写进入持久性设备。

filesize保留文件系统上持久层的大小(如果您选择使用file而不是device)。您可以有多个file行,每个行的大小将从开头到filesize给出的数字。 memory-size是命名空间使用的最大内存量。这不是预先保留的。随着时间的推移,Aerospike将在内存使用量方面增长和缩小,命名空间的最大值为memory-size

查看What's New in 3.11,特别是涉及内存性能改进的部分。调整partition-tree-sprigspartition-tree-locks可能会提高内存中命名空间的性能。

(3)是纯粹的内存命名空间,通常用作缓存。 4G限制会影响stop-writes-pcthigh-water-memory-pct等内容,因为它们被定义为该限制的百分比(请参阅evictions, expirations, stop-writes)。

对于名为data-in-index的计数器,还有(4)特殊情况。请参阅storage engine configuration recipes