需要Cassandra架构建议

时间:2014-09-07 22:58:56

标签: cassandra schema bigdata

我正在为浏览器事件收集系统设计一个Cassandra架构,我希望能够理智地检查我的方法。系统在浏览器中收集用户事件,如鼠标移动,点击等。存储和处理事件以在网页上创建用户活动的热图。我选择Cassandra来保持持久性,因为我的用例比写入更重要:每50毫秒,ajax调用将聚合事件转储到我的服务器,并进入数据库。我正在将node.js用于服务器,并且JSON事件在服务器上看起来像这样:

{ uuid: dsf86ag487hadf97hadf97, type: 'MOVE', time: 12335234345, pageX: 334, pageY:566, .... }

正如您所看到的,每个用户都有一个唯一的uuid,与他们在浏览器上生成的每个事件相关联,存储在cookie中。我的阅读案例将是一些map-reduce工作。每个顶级域都是一个键空间,我计划使用uuid作为我的分区键。主表将是事件表,其中每一行将是一个事件,使用复合主键,由浏览器生成的uuid和cassandra生成的timeuuid组成。主键必须具有timeuuid组件,因为在某些浏览器上两个事件可能具有相同的时间戳。事件的数据类型将是字符串,整数,时间戳。分区的总数据不应超过几百兆字节。那么......这样理智吗?我应该问自己什么问题?我认识到这个用例在传感器数据收集等方面有很多类比,所以请指出我现有的例子。提前致谢。

1 个答案:

答案 0 :(得分:3)

选择分区键

虽然在某些情况下记录用户ID对于区分可能同时发生的不同用户的事件可能很重要,但用户ID可能不是分区键的最佳选择。也就是说,除非您计划分析特定用户的行为。

您可能更关心热图如何随着时间的推移而改变 ,特别是涉及页面的区域。这些可能是您的分区键的更好考虑因素,但可能不会存储为时间戳或X / Y坐标,我将在稍后介绍。

您通常希望选择一个具有(1)大量值分布的分区键,以便在整个群集中创建均匀负载,并且(2)由相对"众所周知的值组成#&# 34 ;.通过"众所周知的",我指的是你事先知道的东西或者可以容易和确定地计算的东西。例如,您将拥有许多用户,并将收集多天的统计信息。虽然可以根据已知的开始/结束日期范围或查询输入轻松确定特定日期(编码为,例如,YYYY-MM-DD字符串),但是所有有效用户ID的集合(假设UUID或其他非如果不对整个集群进行扫描,则很难确定增量值或散列值。避免进行分区密钥扫描;目标是"确切"随机访问您的分区。

分区键的格式

在许多示例中,分区键传统上显示为单个列,但可以具有多列分区键。当使用日期/时间信息作为全部或部分键时,这可能很有用。您的目标是尽可能减少每列的唯一值,以便您需要枚举的值集尽可能小,但需要多少值(或其他列)来平衡I / O负载和数据整个集群的分布。

例如,如果您使用时间戳作为分区键,则在64位Java时间戳格式中,每秒有<1,000>个可能的分区。即使您可以在技术上迭代它们,这可能比您需要或想要的更精细。另一方面,如果您的分区密钥只是4位数年份,则该年度的所有事件将转到同一分区(使其非常大)并且相同一组副本节点(热点,低效的群集使用)。通过选择在这些极端之间取得平衡的密钥,您可以控制分区的大小以及为了满足查询而必须访问的分区数。

还要考虑在您想要删除旧数据时要执行的操作。最简单的方法(在单个列族/表中)是删除整个分区,因为这有助于避免累积单个列逻辑删除。如果您想要运行类似&#34的操作,请删除早于2013年的所有数据&#34;那么你肯定不要想要将数据深埋在数据中,而宁愿将其作为分区键的一部分。

选择行(群集)键

主键中分区键的任何其他列成为分区中的行键,并且行是 clustered (ordered)排序第一列的顺序。

这种聚类/排序很重要,因为它通常是您与Cassandra一起获得的唯一本地排序。即使分区键低至特定日期的特定小时或分钟级别,您也可以选择按毫秒时间戳或时间UUID对行进行聚类,以按时间顺序保留该分区中的所有内容。

您的行键中仍然可以有其他列,例如您的X / Y坐标或用户ID - 如果它听起来像我建议您将时间(仅)放在分区和群集键。

使用X / Y坐标

这部分与Cassandra无关,但如果您要对页面进行热量映射,请注意人们使用不同分辨率的不同屏幕和设备。除非您在自己的网站上进行像素完美的布局(并希望您使用流畅的响应式布局),否则一个用户的X / Y坐标不会匹配X / Y坐标来自另一个用户。如果该用户切换设备,它们甚至可能不匹配同一用户。

考虑不是通过鼠标的X / Y坐标进行映射,而是考虑DOM中元素的ID。为您的&#34;侧边栏&#34;,&#34;主菜单&#34;,&#34;主体div&#34;以及您要映射的任何特定元素。这些是字符串键,而不是坐标对,虽然它们仍然在鼠标输入/离开/点击时被触发,但是记录的信息并不依赖于或假设任何特定的屏幕几何形状。

也许您决定将元素ID包含在行或分区键的一部分中。