为什么与写入/秒相比,航空峰值中的读取/秒非常少?



>我正在使用 aerospike v4.8,我正在向 aerospike 发出读写请求,在我的写入请求中,我获得的吞吐量为 4000 次写入/秒,而在读取中,吞吐量仅为 10-15 次读取/秒,非常低。

我的查询是:

let query = aerospikeClient.query(nameSpace, set)
query.select('count', 'targetKey')
query.predexp = [
predexp.stringBin('campaignKey'),
predexp.stringValue(Id1 + ':' + Id2 + ':' + Id3 + ':' + channel),
predexp.stringEqual(),
predexp.integerBin('epochDay'),
predexp.integerValue(epochDay),
predexp.integerGreaterEq(),
predexp.integerBin('epochDay'),
predexp.integerValue(epochDay),
predexp.integerLessEq(),
predexp.and(3)
]

无法理解这里出了什么问题,需要帮助。

我的配置是:

namespace test {
replication-factor 2
memory-size 8G
default-ttl 7d 
storage-engine device {
device /dev/xvdf
scheduler-mode noop
write-block-size 16K
data-in-memory false
}
}

索引包括:

CREATE INDEX campaignIndex ON antiSpamming.userTargetingMatrix (campaignKey) string;
CREATE INDEX targetIndex ON antiSpamming.userTargetingMatrix (targetKey) string;
CREATE INDEX epochDayIndex ON antiSpamming.userTargetingMatrix (epochDay) NUMERIC;

首先,这根本不是真的。Aerospike 读取总是比写入更快。要执行写入,需要更长的代码路径和更多的 IO。除非您声明您的操作是REPLACE否则它将表现为更新插入,这意味着它将首先尝试读取相同的记录,合并您的数据,然后将其写出。

你上面所做的不是比较苹果和苹果。写(put(是单个记录操作。您应该将写入与单个记录读取进行比较 (get(。您正在执行的是扫描(如果还附加了二级索引筛选器,则为查询(,这是一个多节点操作。即使它只返回一条记录,它也必须转到所有节点,并且在每次遍历中,整个主索引都与您的谓词筛选器匹配。

有几种方法可以解决这个问题。首先,您可以根据epochDay值构建二级索引,而不是谓词筛选器,而是使用具有 BETWEEN 范围谓词的二级索引筛选器。谓词筛选器会更小,只有字符串谓词。

其次,您可以使用建模方法,将数据合并到单个较大的记录中作为列表或映射,并使用列表或映射 API 获取该复杂数据类型中所需的元素范围。查看 Aerospike 开发者博客和 Aerospike 代码示例。

相关内容

  • 没有找到相关文章