2014-10-22 126 views
0

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

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

考虑如何将新书添加到数据库:(1)将新行添加到列家族Books,(2)更新Tags2BooksIndex将新书添加到所有与这本书。

假设我们完成步骤(1)2秒后,新的书籍行已被复制到它应该去的所有节点,并且步骤(2)仍在继续。现在,如果我从books读取这个新书籍以获取标签,然后使用此标签检查Tags2BooksIndex,则可能发生以下情况:我无法从Tags2BooksIndex中找到新书,因为它尚未完全更新,或者更新尚未被复制到所有副本节点。

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

回答

0

Cassandra落入CAP的AP一侧。它牺牲了一致性。在cassandra 2.x中有批处理语句可以提供帮助:http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html

虽然这里真正的问题是这种不一致的后果是什么?这是一个2分钟的窗口,在这个窗口期间,您的搜索不会为标签返回新书吗?这是灾难性的吗?在容错分布式系统中,通常不得不接受不一致的口袋,否则会牺牲可用性,因为分区可能会发生。如果您的数据模型确实需要两个独立的原子突变,那么批处理语句可以提供帮助,但是它会消耗一些可用性。如果你有一点不一致,那么你仍然可用。这归结于您的具体业务要求,即什么是和不可接受。