2

我最近在 Cassandra 上做了很多阅读,特别是如何构造行以利用索引/排序,但有一件事我仍然不清楚;您应该在列族 (CF) 行中包含多少个“索引”项(或过滤器,如果您愿意的话)?

具体来说:我正在构建一个应用程序,并将使用 Cassandra 来归档日志数据,我将使用这些数据进行分析。

分析搜索的示例类型将包括(按日期范围):

  • 对特定站点部分的总访问量
  • 按国家/地区划分的总访问量
  • 流量来源

我打算以 JSON 格式存储整个日志对象,但是为了避免必须通过每个项目来获取基本数据,或者为了获取基本数据而创建多个 CF,我很想知道包含这些是否是个好主意上面的“过滤器”作为列(复合列段)?

例子:

   Row Key       | timeUUID:data | timeUUID:country | timeUUID:source |
                 ======================================================
timeUUID:section |  JSON Object  |       USA        |   example.com   |

因此,从结构中可以看出,行键将是 timeUUID(例如每天)加上我想要获取统计信息的站点部分的复合键。这让我可以很容易地查询日期范围。

接下来,我的困境,列。带有 timeUUID 的复合列名称让我可以排序和做一个基于时间的切片,但是这个概念有意义吗?

当前的“最佳实践”是否可以接受这种类型的结构,还是会不赞成?是否建议为我要查询的每个指标创建一个单独的“索引”CF?(即使它像这样简单?)

我宁愿第一次就做对,而不是以后必须重构数据和重构我的应用程序代码。

4

1 回答 1

1

我认为这背后的想法是可以的。这是一种非常常见的时间切片方式(假设我已经理解了你的模式——创建表片段会很棒)。一些小调整...

您不需要 timeUUID 作为行键。鉴于您建议按天(本质上是唯一的)进行分区,您不需要 UUID 方面。时间戳可能很好,或者更简单的 varchar 格式为 YYYYMMDD(或您喜欢的任何排列)。

您可能还希望将行键组合交换到 section:time。这样做的原因是,如果您需要指定一个 IN 子句(即抓取多天),您只能在密钥的最后一部分执行此操作。这意味着您可以执行 WHERE section = 'foo' 和 time IN (....)。我想这是一个更常见的用例——但显然是你的决定。

如果您的常见情况是查询最新数据,请不要忘记按降序排列您的 timeUUID 列。这将热列保持在头部。

双重存储内容很好(即一次用于 JSON 有效负载,然后再次非规范化以用于您需要查询的数据)。存储很便宜。

我认为您不需要索引,但这取决于您打算运行的查询。如果您的查询很简单,那么您可能希望按(日期:参数)而不是值来存储计数器,并在数据进入时将它们递增。

于 2013-11-12T17:07:21.507 回答