如何为我的用例选择正确的键值存储?

sno*_*ndy 5 key-value nosql key-value-store

我将描述数据和案例。

record {
    customerId: "id", <---- indexed
    binaryData: "data" <---- not indexed
}
Run Code Online (Sandbox Code Playgroud)

期望:

  • customerId 是随机的 10 位数字
  • 二进制记录数据的平均大小 - 1-2 KB
  • 每个 customerId 最多可能有 100 条记录
  • 记录总数 - 500M
  • 写入模式#1:一次插入一条记录
  • 写入模式#2:批处理,可能是并行的,速度至少为每小时 20M 记录
  • 搜索模式 #1:按 customerId 查找所有记录
  • 搜索模式 #2:按 customerId 组并行查找所有记录,速度至少为每小时 10M 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 原则阻碍了我们。我正在寻找完全可扩展的键值存储,很高兴听到任何想法和粗略估计。

Pet*_*ess 5

所以如果我理解你...

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

这在 NoSQL 中是完全可行的。

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

1 TB 数据每月 1 千美元听起来是一个合理的目标。我只是不认为公共云已经完全存在。

让我举一个例子来说明我的建议:Scylla Cloud 和 Scylla Open Source。(披露:我为 ScyllaDB 工作。)

我会告诫您,您每月 1000 美元的成本费用可能会导致您考虑并做出一些权衡。

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

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

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

现在,如果您避开托管服务,并希望运行自助服务,您可以使用 Scylla Open Source,只需查看按需实例定价(请参阅此处:https : //aws.amazon.com/ec2/pricing /按需/)。对于 3 个 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 美元。

因此,备份、监控和其他成本再次高于此。但是您应该能够使原始服务器成本 <1,000 美元来满足使用 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 美元,您可以在晚上轻松入睡。