【发布时间】:2020-12-15 07:38:00
【问题描述】:
我将描述数据和案例。
record {
customerId: "id", <---- indexed
binaryData: "data" <---- not indexed
}
期望:
- customerId 是随机的 10 位数字
- 二进制记录数据的平均大小 - 1-2 KB
- 每个 customerId 最多可以有 100 条记录
- 记录总数 - 500M
- 写入模式 #1:一次插入一条记录
- 写入模式 #2:批处理,可能是并行的,速度至少为每小时 20M 记录
- 搜索模式 #1:按 customerId 查找所有记录
- 搜索模式 #2:按 customerId 组并行查找所有记录,速度至少为每小时 1000 万个 customerId
- 数据并不太重要,我们可以用可靠性来换取速度
- 我们假设在 AWS / GCP 中工作 - 最好我们的键值存储由云管理
- 我们希望每月在此解决方案的云成本上花费不超过 1000 美元
我们尝试过的:
我们在 AWS RDS MariaDB 中的关系数据库中实施了这种方法。服务器是 32GB RAM,2TB GP2 SSD,8 个 CPU。我发现 IOPS 使用率很高,插入速度也不尽如人意。经过调查,我得出结论,由于 customerId 的随机性,对索引的不同写入率很高。在此之后,我做了以下事情:
- 输入数据按customerId ASC排序
- 进行了额外的交易以减小索引大小,而单条记录读取速度几乎没有下降。为此,我做了一些存储桶,其中记录 1111111185 和 1111111186 进入相同的“存储桶”11111111。这样存储桶不能包含超过 100 个 customerId,因此读取速度可以,并且写入速度会提高。
即使这样,我每小时的写入记录也不能超过 1-3M。测试了不同的写入并发,当前值为 4 个并发写入。在所有修改之后,我们还不清楚还有什么可以改进的:
- IOPS 未达到最高使用率(每秒约 4K),
- CPU使用率不高,
- 网络未充分利用,
- 写入和读取吞吐量没有上限。
显然,ACID 原则阻碍了我们。我正在寻找可扩展的键值存储,很高兴听到任何想法和粗略估计。
【问题讨论】:
-
3M 写入/小时是 ~833 写入/秒。这很快,但我听说 Aurora 的性能非常好。你是一个人写的吗?如果这些是 INSERT,您是否尝试过将插入批量插入到多行 INSERT 中?我发现 RDS 的性能非常出色。
-
我通过 jdbcTemplate.batchUpdate 进行批量插入,它应该会自动完成。不,我不做多行插入,谢谢提示。
-
多行插入非常快。即使您不在其中,它们也像小交易一样。如果您的语句中有语法错误,那么您的任何行都不会写入;我不确定如果您的一行出现 FK 故障(或类似故障)会发生什么 - 您需要确定是否插入了一些并失败了一些,或者是否所有行都失败了。但是,尽管如此,这还是值得一试的。
标签: nosql key-value key-value-store