0

取自http://www.ibm.com/developerworks/library/os-apache-cassandra/中的示例。假设我们涉及两个实体:书籍和标签。一本书有多个标签,所以它们之间的关系是1:M。

根据文章,我们应该创建两个列族:BooksTags2BooksIndex. 前者存储关于一本书的所有信息(包括它的所有标签),而后者是一个从标签映射到书籍的索引,因此对于给定的标签,我们可以快速找到所有具有该标签的书。所有这些看起来都很好。但我有一个问题:

考虑如何将新书添加到数据库:(1)将新行追加到列族Books中,(2)更新Tags2BooksIndex以将新书添加到与该书关联的所有标签行。

假设在我们完成步骤 (1) 后 2 秒,新书行已被复制到它应该去的所有节点,并且步骤 (2) 仍在进行中。现在如果我从这个新书行中读取books一个标签,然后使用这个标签来检查Tags2BooksIndex,可能会出现我找不到新书的情况,Tags2BooksIndex因为它还没有完全更新,或者更新还没有已复制到所有副本节点。

如何处理这样的情况?将 2 秒替换为 2 毫秒,我们仍然有一个不一致的时间窗口。我想知道处理这种情况的“正确/实用”方法。

4

1 回答 1

0

Cassandra 属于 CAP 的 AP 端。它牺牲了一致性。有一些方法可以帮助,在 cassandra 2.x 中使用批处理语句:http ://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html

尽管这里真正的问题是这种不一致的后果是什么?这是一个 2 分钟的窗口,在此期间您的搜索不会为标签返回一本新书?那是灾难性的吗?在容错分布式系统中,您经常不得不接受一些不一致的地方,或者因为分区可能并且将会发生而牺牲可用性。如果您的数据模型确实需要两个单独的原子突变,那么批处理语句会有所帮助,但它会带走一些可用性。如果您对一些不一致的情况感到满意,那么您仍然可以使用。这取决于您的具体业务要求,什么是可接受的,什么是不可接受的。

于 2014-10-22T15:00:31.507 回答