使用 DynamoDB Storage Backend for Titan 的 DynamoDB 定价

DynamoDB pricing using DynamoDB Storage Backend for Titan

我想深入了解使用 DynamoDB Titan 后端的价格(以美元计)。为此,我需要能够理解 DynamoDB Titan 后端何时进行读写。我现在一头雾水

理想情况下,我想 运行 一个测试用例,它添加了一些顶点、边,然后进行相当简单的遍历,然后查看完成了多少读写操作。关于如何实现这一目标的任何想法?可能通过指标?

如果事实证明我自己无法提取此信息,我将非常感谢您提供有关 DynamoDB Titan 后端何时执行读取和写入的第一个简短说明。

对于所有 Titan 后端,为了理解和估计写入次数,我们依赖于估计给定 KCVStore 的列数。您还可以测量使用 Titan 的 DynamoDB 存储后端时使用指标写入的列数。

要启用指标,请启用列出的配置选项 here。 具体来说,启用第 7-11 行。 请注意特定 tx.commit() 调用的 max-queue-length configuration property. If the executor-queue-size metric 命中 max-queue-length,那么您就知道队列/存储。buffer-size 不够大。一旦 executor-queue-size 指标在未达到 max-queue-length 的情况下达到峰值,您就知道您已经捕获了在 tx.commit() 调用中写入的所有列,因此这将为您提供在 tx.commit() 中更改的列数=10=]。您可以查看 edgestore 和 graphindex 的 UpdateItem 指标,以了解两个 table 之间的列分布。

所有 Titan 存储后端都实现了 KCVStore,键和列根据存储的种类具有不同的含义。假设您没有打开 user-defined 事务日志,则有两个存储获得大量写入。它们是 edgestore 和 graphindex。

无论您是否配置复合索引,始终写入边缘存储 KCVStore。每条边和该边的所有边属性都由两列表示(除非您将该边标签的架构设置为单向)。边列的键是正列边的out-vertex,反列边的in-vertex。同样,边的列是正列中边的 in-vertex,反向列中边的 out-vertex。每个顶点由至少一列表示 VertexExists 隐藏 属性,一列表示顶点标签(可选),一列表示每个顶点 属性。顶点的键是顶点id,列对应顶点属性、隐藏顶点属性和标签。

如果您在Titan 管理系统中配置了复合索引,那么graphindex KCVStore 只会被写入。您可以索引顶点和边属性。对于每一对索引值和具有该索引值的 edge/vertex,将在图形索引 KCVStore 中有一列。键将是索引 ID 和值的组合,列将是 vertex/edge ID。

既然您知道如何对列进行计数,那么在使用 DynamoDB Storage Backend for Titan 时,您可以使用这些知识来估计写入 edgestore 和 graphindex 的大小和次数。如果您对 KCVStore 使用 multiple-item 数据模型,您将获得每个 key-column 对的一个项目。如果您对 KCVStore 使用 single-item 数据模型,您将在一个键上获得所有列的一项(启用图形分区时不一定如此,但这是我现在不会讨论的细节)。只要每个顶点 属性 小于 1kb,并且一条边的所有边属性的总和小于 1kb,当使用 edgestore 数据模型 multiple-item 时,每列将花费 1 WCU 来写入.同样,如果您使用 multiple-item 数据模型,则 graphindex 中的每一列都将花费 1 WCU 来写入。

假设您进行了估算,并且始终使用 multiple-item 数据模型。假设您估计每秒将 750 列写入 edgestore,每秒写入 750 列到 graphindex,并且您希望驱动此负载一天。您可以将两个 table 的读取容量设置为 1,这样您就知道每个 table 将从一个物理 DynamoDB 分区开始。在 us-east-1 中,每 10 个写入容量单位的写入成本为每小时 0.0065 USD,因此每个 table 的写入成本为 24 * 75 * 0.0065 USD 每天 11.70 USD。这意味着 edgestore 和 graphindex 的写入容量每天将花费 23.40 美元。每个 table 的读取可以设置为每秒 1 次读取,使得两个 table 每天的读取成本为 2 * 24 * $0.0065 = $0.312。如果您的 AWS 账户是新账户,读取将属于免费套餐,因此实际上您只需为写入付费。

DynamoDB pricing 的另一个方面是存储。如果每秒写入 750 列,即每天 6480 万个项目到一个 table,这意味着每月 19 亿(约 20 亿)个项目。 table 中一个月的平均项目数为 10 亿。如果每个项目平均为 412 字节,并且有 100 字节的开销,那么这意味着一个月存储 10 亿个 512 字节的项目,一个月大约 477 GB。 477 / 25 四舍五入为 20,因此在此负载下第一个月的存储费用为每月 20 * 0.25 美元。如果您继续以这种速度添加项目而不删除它们,每月存储成本将增加大约 5 美元。

如果您的图中没有超级节点,或者具有相对大量属性的顶点,那么对边缘存储的写入将均匀分布在整个分区键 space 中。这意味着您的 table 将在达到 10GB 时分成 2 个分区,然后当这些分区中的每一个达到 10GB 时,它们将分成总共 4 个分区,依此类推。 2 到 477 GB /(10 GB / 分区)的最接近幂是 2^6=64,这意味着您的 edgestore 在第一个月内将拆分 6 次。在第一个月结束时,您可能会有大约 64 个分区。最终,您的 table 将拥有如此多的分区,以至于每个分区的 IOPS 将非常少。这种现象称为 IOPS 饥饿。您应该制定解决 IOPS 匮乏问题的策略。两种常用的策略是 1. 批处理 cleanup/archival 旧数据和 2. 滚动 (time-series) 图。在选项 1 中,您启动一​​个 EC2 实例来遍历图形并将旧数据写入较冷的存储(S3、Glacier 等)并将其从 DynamoDB 中删除。在选项 2 中,您直接写入对应于某个时间段(周 - 2015W1,月 - 2015M1 等)的图表。随着时间的流逝,您会在较旧的 tables 上减少写入,当需要将它们迁移到较冷的存储时,您会读取该时间段的整个图表并删除相应的 DynamoDB tables .这种方法的优点是它允许您以更高的粒度管理您的写入配置成本,并且它允许您避免删除单个项目的成本(因为您免费删除 table 而不是至少 1您删除的每个项目的 WCU)。