与 Write/sec 相比,为什么 Reads/sec 的 aerospike 少得多?

Why are Reads/sec very less in aerospike then as compared to Write/sec?

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

我的查询是:

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)。你正在做的是一次扫描(如果你还附加了一个二级索引过滤器,它将是一个查询),这是一个多节点操作。即使它只是 returns 一条记录,它也必须转到所有节点,并且在每次遍历整个主索引以匹配您的谓词过滤器时。

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

其次,您可以使用建模方法,将数据合并到单个较大的记录中作为 list or map, and you use the list or map API to get the range of elements you want in that complex data type. Take a look at the Aerospike developer blog and Aerospike code examples