【问题标题】:Why are Reads/sec very less in aerospike then as compared to Write/sec?为什么与写入/秒相比,aerospike 的读取/秒非常少?
【发布时间】:2020-01-28 12:37:40
【问题描述】:

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


【解决方案1】:

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

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

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

其次,您可以使用一种建模方法,将数据合并到一个较大的记录中,如 listmap,然后使用列表或映射 API 来获取您想要的复杂元素范围数据类型。看看Aerospike developer blogAerospike code examples

【讨论】:

  • 很好,但是在代码 sn-p 中,您没有将查询设置为对其进行过滤。它不是自动的,您明确指定它。尝试将范围谓词移出谓词过滤器。假设您使用的是 Node.js,请使用 whereaerospike.com/apidocs/nodejs/Query.html#where
  • 我必须在两个二级索引上运行查询,在第一个索引上我必须运行一个简单的相等查询,第二个我想运行一个范围查询,所以我可以在一个请求中这样做这些条件在“AND”子句中??
  • 如果这些谓词在谓词过滤器内,它们根本不参与二级索引。您应该考虑两者的基数,并使用where 中剔除最多记录的二级过滤器。然后谓词过滤器仅应用于匹配的结果。例如,对于 gender='m' 和 age > 18,您会想要使用性别 SI,因为这会消除一半不是“m”的记录。
  • 很好地使用您刚才描述的方法,性能有所提高,但仍然没有达到预期,因为我在查询时接近 1600 TPS,所以如果您能说出还有什么可以改进的性能。
  • 我已经大致描述了它。具有可预测键名和批量读取的键值方法每次都会击败查询。查看开发者博客中的 IoT 文章以及相关的代码示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2012-11-25
  • 1970-01-01
相关资源
最近更新 更多