0

我正在使用 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;
4

1 回答 1

3

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

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

有几种方法可以解决这个问题。一方面,您可以在epochDay值上构建二级索引,而不是谓词过滤器,而是使用带有 BETWEEN范围谓词的二级索引过滤器。谓词过滤器会更小,只是字符串谓词。

其次,您可以使用一种建模方法,将数据合并到一个较大的记录中作为listmap,然后使用 list 或 map API 来获取该复杂数据类型中所需的元素范围。查看Aerospike 开发人员博客Aerospike 代码示例

于 2020-01-28T17:04:38.597 回答