【问题标题】:How can I choose the right key-value store for my use case?如何为我的用例选择正确的键值对存储?
【发布时间】: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


【解决方案1】:

如果我理解你的话……

  • 2kb * 500m 条记录 ≈ 1 TB 数据
  • 20m 写入/小时 ≈ 5.5k 写入/秒

这在 NoSQL 中是完全可行的。

规模不是问题。这是你的成本。

1 TB 数据每月 1000 美元听起来是一个合理的目标。我只是认为公共云还没有相当

让我举一个我推荐的例子:Scylla Cloud 和 Scylla Open Source。 (披露:我为 ScyllaDB 工作。)

我会提醒您,您每月 1,000 美元的成本支出可能会导致您考虑并做出一些权衡。

与高可用性部署中的典型情况一样,为确保节点故障时的数据冗余,您可以在 AWS 上使用 3 个 i3.2xlarge 实例(每个实例可存储 1.9 TB)。

您需要额外的容量来运行压缩。我们使用增量压缩,这可以节省空间放大,但您不想使用 i3.xlarge(每个 0.9 tb),除非真的需要成本,否则它低于 1 tb 的限制。在这种情况下,您必须进行某种数据驱逐(如 TTL)以将数据保持在

即使 Scylla Cloud(请参阅此处:https://www.scylladb.com/product/scylla-cloud/#pricing)的年度预订价格为 764.60 美元/服务器,运行三个 i3.2xlarge 的费用仍为 2,293.80 美元/月。超过您预算的两倍。

现在,如果您避开托管服务并希望运行自助服务,则可以使用 Scylla 开源,只需查看按需实例定价(参见此处:https://aws.amazon.com/ec2/pricing/on-demand/)。对于 3x i3.2xlarge,您的运行速度为每小时 0.624 美元。这是每个 449.28 美元的原始按需成本,其中不包括备份、数据传输等杂费。但您可以花 1,347.84 美元购买三个实例。开源。未管理。

仍然超出您的预算,但更接近。如果你能得到保留价格,那可能就成功了。

编辑:找到底价:

3x i3.2xlarge 会让你付出代价

  • 按月定价 $312.44 x 3 = $937.32,或
  • 1 年预付 $3,482 每年/12 = $290.17/月/服务器 x 3 = $870.50。

因此,备份、监控和其他成本再次高于此。但是您应该能够使用 Scylla Open Source 将原始服务器成本

但管理负担在您的团队身上(而且他们的时间并不是完全零成本)。

例如,如果您想对系统进行监控,则需要设置 Prometheus、Grafana 或 Datadog 之类的东西。那将是其他服务器或服务,它们不是免费的。 (我们团队的备份和监控成本由 Scylla Cloud 承担。该服务的一部分溢价。)

另一种省钱的方法是只进行 2 次复制。如果您丢失服务器,这会将您的数据置于真正危险的地方。 不推荐

所有这些都是基于对您的数据的最大假设。你的记录都在 2k 左右(不是 1k)。你没有从 ScyllaDB 内置的数据压缩中获得太多效用 - 请参阅第一部分 (https://www.scylladb.com/2019/10/04/compression-in-scylla-part-one/) 和第二部分 (https://www.scylladb.com/2019/10/07/compression-in-scylla-part-two/)。

在我看来,如果您采用保留定价和开源的方式,您应该能够以每月 1000 美元的预算勉强度日。虽然增加监控和备份以及其他附带成本(我没有在这里计算)可能会让你再次回到这个数字。

否则,完全托管的云企业套餐每月 230 美元,您可以在晚上安然入睡。

【讨论】:

  • 您好!我很晚才发现 AWS 上的保留价格 (aws.amazon.com/ec2/pricing/reserved-instances/pricing)。所以让我们做这个计算。 3x i3.2xlarge 每月的价格为 312.44 美元 x 3 = 937.32 美元,或每年 3,482 美元 – 每台服务器 290.17 美元 x 3 = 870.50 美元。因此,备份、监控和其他成本再次高于此。但是您应该能够使用 Scylla Open Source 将原始服务器成本
  • 是的,您可以同时拥有多个写入器(客户端节点)。您可以使用任何现成的 Apache Cassandra 驱动程序。 Scylla 专为高并发和每核分片而设计,因此我们有分片感知驱动程序,可以实现更高的吞吐量。此外,Scylla 以高度异步的方式实现,因此不应该有阻塞操作。 (如果这就是你所指的。)
  • 我想在最后一次更新中重新审视这个:特别是@snowindy 正在询问并发性。虽然并发存在一个饱和点,但您实际上可以拥有数百甚至数千个与 Scylla 的并发连接。您可以从此博客中了解如何在不显着影响性能的情况下扩展到 1,300 多个线程:scylladb.com/2019/11/20/…
  • Scylla 是否以某种方式支持 devops?现在我们使用 Terraform 以声明方式管理 AWS / GCP 资源。我想知道 Scylla corp 管理的 ScyllaDB 实例如何映射到我们的使用模式..
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2023-03-28
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多