3

我们正在评估是否将基于 PostGres 构建的多租户 EAV 系统迁移到 Cassandra,我希望输入我们的模式方法,看看使用 Cassandra 进行测试是否有意义。我们的多租户系统层次结构由帐户-> 应用程序组成,其中一个帐户可以运行多个应用程序。查询需要按应用或帐户进行隔离(聚合帐户的所有应用数据)。帐户可以在我们的 EAV 模型中使用自己的自定义字段创建自己的数据对象。

我考虑过对 Cassandra 采用两种方法。第一种是在 1 个列族中保存一定数量的应用程序(比如 20 个)(以减少使用的列族数量)。每行将由 accountid->appid->dataobjectid->recordid 的复合列标识。将根据应用程序的需要为每个应用程序的数据对象动态添加列。这意味着如果列族有两个应用程序,第一个应用程序的 1 行可能定义了 20 列,而第二个应用程序可能定义了 30 列。这意味着这两个应用程序总共将有 50 个潜在的列。现在,应用程序的平均列数为 19。这意味着列族中的平均列数为 400。看起来很合理,并利用了 Cassandra 的宽列支持。实际上,我们可能很容易支持每个列族的更多应用程序。缺点是二级索引会很困难,因为我们不允许用户创建自己的索引,因此如果没有 .

第二种方法是让两个列族保存 1000 个应用程序的所有数据。第一个列族将具有与上述相同的复合列,但它将在 JSON 文档中保存该行的整个数据对象。第二个列族将具有相同的复合键,但会向键添加另一个值,即 fieldid 表示 json 文档中的字段(我们的应用程序元数据管理器存储 UUID 以识别 JSON 文档中的每个“字段”),但会每种数据类型都有一个“字段值”列 - 字符串、数字、小数、浮点数(日期和布尔值转换为数字)。这里的好功能是我们可以轻松地索引每个列以进行搜索,并且我们正在最大限度地减少我们创建的列族的数量。

上述两种方法的优缺点是什么?在上述场景中,我是否遗漏了一些明显或误解的 Cassandra(例如,我是否可以首先拥有如此宽的复合列)?对于这种类型的应用程序还有其他更好的架构建议吗?

4

1 回答 1

2

我认为在决定数据模型时需要回答的第一个问题是“我打算如何查询这些数据?” 一般来说,在任何一个模型中,您在 CF、列或组合中的组件数量方面都远远没有达到极限,所以我不会担心这一点。

考虑到您担心第一个模型中缺少辅助节点,这告诉我按值查询功能可能很重要。如果是这样,第二个模型可能会更好地为您服务。需要注意的是,辅助数据在基数较低的情况下效果最好,并且您的数据可能不太适合这种情况。如果没有,您可以很容易地创建自己的索引,在这种情况下,任何一个模型都可以工作。

我的建议是弄清楚您打算如何读取数据,然后规划您的模型以匹配您的读取模式。如果您不确定,请尝试使用这两种模型,看看哪种效果最好。根据我的经验,通常需要不止一次迭代才能得出一个好的模型,而且你不应该害怕以不止一种方式编写数据。标准化不是这里的目标。如果您想更深入地讨论您的模型,请查看 freenode (#cassandra) 上的 Cassandra IRC 频道。

于 2012-08-21T13:38:29.747 回答