为什么在Aerospike中读取/秒要比写入/秒少得多?

时间:2020-01-28 12:37:40

标签: aerospike aerospike-ce

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

1 个答案:

答案 0 :(得分:3)

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

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

有几种解决方法。例如,您可以在epochDay值上构建二级索引,并且可以使用带有BETWEEN range predicate的二级索引过滤器来代替谓词过滤器。谓词过滤器会更小,只是字符串谓词。

第二,您可以使用一种建模方法,其中将数据以listmap的形式合并到一个较大的记录中,并使用list或map API获取元素的范围想要那种复杂的数据类型。看看Aerospike developer blogAerospike code examples