Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

在 DynamoDB 中的 Titan 图形建模

Titan 会将边缘和属性存储为与顶点和唯一键相关联的列值对。适用于 Titan 的 DynamoDB 存储后端 会将各个列值对存储在 DynamoDB 中的单个属性中。有关如何序列化列值对的信息,请转至 Titan Data Model 文档中的 Individual Edge Layout 部分。

以下部分介绍 适用于 Titan 的 DynamoDB 存储后端 中的图形建模。

Titan 使用 KeyColumnValueStore 接口将列值对存储在后端数据库中。适用于 Titan 的 DynamoDB 存储后端 附带此接口的以下两种具体实施:

实施类 配置属性 说明
DynamoDBSingleRowStore SINGLE 将某个键的所有列值对存储在一个项目中。
DynamoDBStore MULTI 将某个键的各个列值对存储在具有复合主键(分区键和排序键)的表的不同项目中。

两类实施均将信息存储在名为 edgestore 的 DynamoDB 表中。

Titan 版本 0.4.4 使用以下 DynamoDB 表(包括 edgestore)进行存储:

说明
edgestore 存储所有属性和边缘(列值对)。每个顶点一个项目。
edgeindex 边缘的索引。
vertexindex 所有顶点的索引。
titan_ids 该插件的各个实例的客户端 ID。
system_properties 存储后端属性。

Titan 版本 0.5.4 及更高版本使用不同的后端表。Titan 版本 0.5.4 及更高版本使用以下 DynamoDB 表(包括 edgestore)进行存储:

说明
edgestore 存储所有属性和边缘(列值对)。每个顶点一个项目。
graphindex 边缘和顶点的索引。
systemlog Titan 系统日志。
txlog 事务日志。
titan_ids 该插件的各个实例的客户端 ID。
system_properties 存储后端属性。

注意

Titan 版本 0.5.4 及更高版本还支持用户定义的事务日志(均存储在表中)。

您可以在 适用于 Titan 的 DynamoDB 存储后端 属性文件中选择单项目存储选项或多项目存储选项。以下部分介绍这两类实施。

单项目数据模型

单项目数据模型将特定键的所有列值对存储在一个 DynamoDB 项目中。 edgestore 表将顶点的所有属性和边缘存储在单个项目中,其中分区键是 KeyColumnValueStore 存储区或 KCV 的键。有关详细信息,请参阅 KeyColumnValueStore

下表演示了如何将之前使用图形数据库部分中的社交网络图形存储在采用单项目数据模型的 edgestore DynamoDB 表中,并演示了隐藏属性。Titan 会将隐藏属性添加到各个节点以表明它的存在。

注意

这是存储在表中的数据的一种表示。实际数据通过压缩的元数据实现序列化,无法人为读取。

分区键 (pk) 属性 属性 属性 属性 属性
Vertex id 1 Property - Name: Justin Edge (out) - Friend: Anna Edge (out) - Friend: Kris Edge (out) - Likes: Movies Hidden Property - Exists
Vertex id 2 Property - Name: Anna Edge (in) - Friend: Justin Edge (out) - Likes: Books Hidden Property - Exists
Vertex id 3 Property - Name: Kris Edge (in) - Friend: Justin Edge (out) - Likes: Movies Hidden Property - Exists
Vertex id 4 Property - Name: Movie Edge (in) - Likes: Justin Edge (in) - Likes: Kris Hidden Property - Exists
Vertex id 5 Property - Name: Books Edge (in) - Likes: Anna Hidden Property - Exists

此表并未显示存储在各个属性中的所有数据。有关存储在属性中的边缘和属性的数据及数据格式的信息,请参阅 Titan 数据模型页面。

此模型的局限在于,将所有内容存储在单个项目中会限制各个顶点的属性和边缘事件数,这是因为 DynamoDB 存在 400 KB 的项目大小限制。

多项目数据模型

为避免 400 KB 的项目大小限制,适用于 Titan 的 DynamoDB 存储后端 提供了多项目存储作为替代模型。如果您的图形具有以下任何一种特征,则您需要使用多项目存储:

  • 每个顶点都有大量边缘

  • 存在大量顶点属性

  • 某个属性值的大小接近项目大小限制

在这些情况下,我们建议您至少对 edgestore 和索引存储(0.4.4 中的 edgeindex 和 vertexindex,0.5.4 中的 graphindex)使用多项目模型。edgestore 和索引存储是最可能受项目大小限制影响的表。

多项目数据模型将各个列值对分别存储在单独的 DynamoDB 项目中。各个列值对均会存储为项目,其中分区键是 KCV 的键,排序键是 KCV 的列。特定键的所有列值对均存储在 edgestore 表的不同项目中。

下表演示了如何将之前使用图形数据库部分中的社交网络图形存储在采用多项目数据模型的 edgestore DynamoDB 表中。并演示了隐藏属性。Titan 会将隐藏属性添加到各个节点以表明它的存在。

注意

这是存储在表中的数据的一种表示。实际数据通过压缩的元数据实现序列化,无法人为读取。

分区键 (pk) 排序键 (sk) 值 (v)
Vertex id 1 排序键
Vertex id 1 Property id Property - Name: Justin
Vertex id 1 Edge id Edge (out) - Friend: Anna
Vertex id 1 Edge id Edge (out) - Friend: Kris
Vertex id 1 Edge id Edge (out) - Likes: Movies
Vertex id 1 Property id Hidden Property - Exists
Vertex id 2 排序键
Vertex id 2 Property id Property - Name: Anna
Vertex id 2 Edge id Edge (in) - Friend: Justin
Vertex id 2 Edge id Edge (out) - Likes: Books
Vertex id 2 Property id Hidden Property - Exists
Vertex id 3 排序键
Vertex id 3 Property id Property - Name: Kris
Vertex id 3 Edge id Edge (in) - Friend: Justin
Vertex id 3 Edge id Edge (out) - Likes: Movies
Vertex id 3 Property id Hidden Property - Exists
Vertex id 4 排序键
Vertex id 4 Property id Property - Name: Movies
Vertex id 4 Edge id Edge (in) - Likes: Justin
Vertex id 4 Edge id Edge (in) - Likes: Kris
Vertex id 4 Property id Hidden Property - Exists
Vertex id 5 排序键
Vertex id 5 Property id Property - Name: Books
Vertex id 5 Edge id Edge (in) - Likes: Anna
Vertex id 5 Property id Hidden Property - Exists

此表并未显示存储在各个属性中的所有数据。有关存储在属性中的边缘和属性的数据及数据格式的信息,请转至 Titan 数据模型页面。

虽然采用多项目模型可以避免 400 KB 项目限制问题,但是会带来性能损失。相比于单项目数据模型,在多项目数据模型中,通过扫描基表来迭代 edgestore 表中的顶点需要花费更长时间。

多项目数据模型通过将存储区中的一个实体非规范化到某个键的各列对应的一个项目中,克服了 400 KB 限制问题。此功能意味着一个键在多项目数据存储中仅对各列显示一次。此模型的扫描时间更长,这是因为在此模型中,各个边缘标签、顶点属性和边缘属性都有一个单独的项目。edgestore_key 表用于存储该存储条目的键及修订号,因此一次扫描只能通过每项更改操作访问 KCV 键一次。此功能意味着,对 KCV 存储区进行任何更改都需要至少进行两次 HTTP 往返,一次针对键表,以及至少一次针对基表;如果更改仅限删除列,则需要进行多次往返。

Titan 版本 0.5.4 及更高版本中的存储变更

适用于 Titan 的 DynamoDB 存储后端 版本 0.5.4 及更高版本采用与版本 0.4.4 相同的方式存储图形数据,但有以下区别:

  • 分区化顶点可用。顶点的分区均可并行读取和写入。

  • vertexindex 和 edgeindex 表会合并到一个名为 graphindex 的索引存储中。

  • Titan 0.5.4 支持用户定义的事务日志。每个用户定义的事务日志均与需要在 .properties/rexster.xml 中配置的额外 DynamoDB 表对应。

  • Titan 1.0.0 也支持用户定义的事务日志。每个用户定义的事务日志均与需要在 dynamodb-properties 文件中配置的另一个 DynamoDB 表对应。

适用于 Titan 的 DynamoDB 存储后端 中的限制

DynamoDB 会强制限制分区键的大小 (2048 字节) 和排序键的大小 (1024 字节) 以及总项目的大小 (400 KB)。因此,Titan DynamoDB BigTable 实施存在一些如下表所述的限制。BigTable 是 Titan 后端的抽象存储名称。有关 Titan BigTable 抽象概念的详细信息,请参阅 BigTable

  • 使用内置索引时,有索引的属性值不得超过分区键的大小上限,即 2048 字节。如果需要索引更大的值,例如文档,您应使用混合索引器(如 Elasticsearch、Solr 或 Lucene)以启用全文搜索。

  • 列值的大小上限因 Titan 中的变量 ID 编码模式和压缩对象序列化而异,但不得超过项目表示中的 400 KB,因为这是 DynamoDB 的项目上限。在单项目数据模型中,这意味着,存储在 KCV 存储区的一个键(edgestore 中的一个外顶点)上的所有列必须小于 400 KB。在多项目数据模型中,存储在一个列中的所有内容(一个键列对,如顶点属性或边缘)的大小必须小于或等于 400 KB。在单项目数据模型中,顶点的所有边缘均存储在一个项目中,因此单项目模型只能用于小型图形。

  • 使用 DynamoDB 表前缀,您可以在版本 0.4.4 中为每个区域建模 51 个图形,可以在版本 0.5.4 及更高版本中为每个区域建模 42 个图形(只要不存在用户定义的事务日志即可)。如果您使用了用户定义的事务日志,则每个日志会有另一个表,因此您可以在某个区域内存储的图形数量将会减少。有关更多信息,请参阅 Titan 文档中的用户定义的事务日志。默认情况下,每个区域内的 DynamoDB 表限制在 256 个。如果您想在区域内添加更多图形,则可以请求提高您的账户限制。有关账户限制的更多信息,请参阅 DynamoDB 中的限制页面。

前面的限制是对 Titan 限制的补充。有关 Titan 限制的信息,请转至 Titan 文档中的技术限制页面。

后端数据使用情况

TitanDB 后端存储的配置取决于图形设计(例如,多个顶点对多个属性)、使用情况(读取、写入与更新)以及存储数据模型(单项目与多项目)。

在所有图形中,edgestore 表拥有的数据最多,使用也最频繁。

下表可以帮助您评估 edgestore 表的配置成本。您需要估算您每秒要处理(读取、写入或更新)的以下图形对象数:

  • 顶点数:顶点的数量。适用于单项目模型和多项目模型。

  • 每个顶点的属性数:每个顶点上的属性的数量。适用于多项目模型。

  • 每个顶点的外边缘数:从某个顶点到其他顶点的边缘的数量。适用于单项目模型和多项目模型。>

    注意

    默认情况下,边缘是双向的。除非您创建的是单向边缘(仅限外边缘),否则外边缘和内边缘的数量将会相等。

  • 每个顶点的内边缘数:从其他顶点到该顶点的边缘的数量。

  • 隐藏属性:Titan 存储的属性。每个顶点至少有一个 exists 属性。在 Titan 版本 0.4.4 中,每个顶点至少有 1 个隐藏属性;在 Titan 0.5.4 中,每个顶点至少有 2 个隐藏属性。

注意

在单项目数据模型中,很多图形对象均会通过相关顶点序列化到一个项目中,因此无需估算其使用情况。

Type 对 edgestore 发起的 Update/DeleteItem 调用,单项目模型 对 edgestore 发起的 Update/DeleteItem 调用,多项目模型
创建 vertices * edgesOutOfVertex vertices * (vertexProperties + edgesIntoVertex + edgesOutOfVertex + titanHiddenProperties)
正在更新 vertices * edgesOutOfVertex vertices + vertexProperties + edgesIntoVertex + edgesOutOfVertex + titanHiddenProperties
读取 vertices vertices + vertexProperties + edgesIntoVertex + edgesOutOfVertex + titanHiddenProperties

上表按存储模型和操作类型分别估算容量。下表针对不同操作类型列出了有关 DynamoDB 活动的更多信息,并讨论了索引的影响。

加载数据

批量加载数据属于写入密集度非常高的操作。将新数据加载到图形中需要在后端数据库中创建项目。在多项目模型中,各个顶点、属性和边缘将作为单独的项目写入,因此创建操作的密集度更高。

更新数据

在多项目存储模型中,更新数据只需针对要更新的特定属性或边缘更新对应项目,因此该操作的密集度较低。在单项目存储模型中,必须更新整个项目。

读取数据

相比于单项目模型,在多项目模型中能够更高效地读取属性或边缘的子集,这是因为系统只会读取您请求的项目,而非整个项目。

graphindex 表上的操作

在单项目模型中,graphindex 表中的项目会被键入唯一顶点/边缘属性名称和值组合,并且其他项目属性(列)用于表示具有此属性值的顶点/边缘标识符。在多项目模型中,graphindex 中的项目仍会被键入属性名称/值组合,但是具有该属性名称/值组合的各个顶点/边缘具有单独的项目。因此,在单项目模型中,您需要将一个项目按属性/值组合写入 graphindex。在多项目模型中,您需要将 vertices * vertexProperties + edges * edgeProperties 项目写入 graphindex

指标

Titan 使用 Metrics-core 程序包来记录和发送指标。Metrics-core 支持通过 JMX、HTTP、STDOUT、CSV、SLF4j、Ganglia 和 Graphite 报告指标。还有很多报告器均可作为第三方插件。您可以从 Metrics 网站了解有关 Metrics-core 程序包的更多信息。

您可以通过使用以下属性打开 Metrics:

Copy
metrics.enabled=true # prefix for metrics from titan-core. Optional. If not specified, com.thinkaurelius.titan will be used. # Currently, the prefix for Titan system stores (system log, txlog, titan_ids, system_properties, and all user logs) # is set to com.thinkaurelius.titan.sys and cannot be changed. metrics.prefix=titan # polling interval in milliseconds metrics.csv.interval=500 # the directory where to write metrics in CSV files metrics.csv.directory=metrics # The metrics prefix in titan-dynamodb allows you to change what gets prepended to the codahale metric names. #storage.dynamodb.metrics-prefix=dynamodb

注意

属性可以在类路径中的属性文件中进行设置,也可以直接在 Gremlin shell 中使用配置对象,或在 rexster.xml 文件中进行设置。

要在 Gremlin shell 中设置指标配置属性,请键入以下内容:

Copy
conf = new BaseConfiguration() conf.setProperty("metrics.enabled", "true") conf.setProperty("metrics.prefix", "titan") conf.setProperty("metrics.csv.interval", 1000) conf.setProperty("metrics.csv.directory", "metrics") conf.setProperty("storage.dynamodb.metrics-prefix", "dynamodb")

Metrics core 支持多种定量测量方法。计时器是一种测量速率的计量器,也是一种显示代码段延迟情况的直方图。直方图用于衡量特定值的分布情况以及发送计数值、最大值、平均值、最小值、标准偏差、p50、p75、p95、p98、p99 和 p999。计量器用于测量调用率 (tps) 并发送计数值、mean_rate、m1_rate、m5_rate 和 m15_rate。测量仪用于测量不同线程中的值并发送值。计数器用于计算代码段的调用次数并发送计数值。

Titan 会发送在 Titan 指标 页面的表中列出的指标。

适用于 Titan 的 Amazon DynamoDB 存储后端 会发送 Titan 不发送的指标。它们与统计数据(低级 DynamoDB 操作)相关,在其他 适用于 Titan 的 Amazon DynamoDB 存储后端 指标上的表中有所介绍。