我正在探索Aerospike作为键值DB,将数据存储在磁盘上以确保安全。请确认,我理解正确:
->
所有数据仅在磁盘上,"内存大小"仅用于索引(小用量),所有数据将存储在多个16GB文件中(将自动创建),最重要的是 - 每个read
查询将触发从磁盘读取数据?
->
所有数据都在磁盘上,部分在内存中,"内存大小"将像缓存一样,包含4GB最常用的数据,所有数据将存储在多个16GB文件中(将自动创建),最重要的是 - 每个read
查询将触发从内存中检查数据,如果丢失 - >从磁盘读取并添加到内存?什么数据将在内存中 - 最常用或最新创建?
->
所有数据都只在内存中,我限制为4GB的数据,而不是更多?
答案 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-sprigs
和partition-tree-locks
可能会提高内存中命名空间的性能。
(3)是纯粹的内存命名空间,通常用作缓存。 4G限制会影响stop-writes-pct
,high-water-memory-pct
等内容,因为它们被定义为该限制的百分比(请参阅evictions, expirations, stop-writes)。
对于名为data-in-index的计数器,还有(4)特殊情况。请参阅storage engine configuration recipes。