取自http://www.ibm.com/developerworks/library/os-apache-cassandra/中的示例。假设我们关注两个实体:书籍和标签。一本书有多个标签,所以它们之间的关系是1:M。
根据这篇文章,我们应该创建两个列族:Books
和Tags2BooksIndex
。前者存储关于一本书的所有信息(包括它的所有标签),而后者是一个从标签映射到书籍的索引,因此对于给定的标签,我们可以快速找到具有该标签的所有书籍。所有这些看起来都很好。但我有一个问题:
考虑如何将新书添加到数据库:(1)将新行添加到列族Books
中,(2)更新Tags2BooksIndex
以将新书添加到与此书关联的所有标记行。
假设在我们完成步骤(1)后2秒,新书行已经复制到它应该运行的所有节点,并且步骤(2)仍在进行中。现在,如果我从books
读取新书行以获取标记,然后使用此标记检查Tags2BooksIndex
,则可能无法从Tags2BooksIndex
找到新书,因为它尚未完全更新,或者更新尚未复制到所有副本节点。
如何处理这种情况?将2秒替换为2毫秒,我们仍然有一个不一致的时间窗口。我想知道处理这种情况的“正确/实际”方法。
发布于 2014-10-22 23:00:32
Cassandra属于CAP的AP一侧。它牺牲了一致性。对于Cassandra2.x中的批处理语句,有一些方法可以提供帮助:http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html
尽管这里真正的问题是,这种不一致的后果会是什么?这是一个2分钟的窗口,在此期间,您的搜索不会返回一个标签的新书?这是灾难性的吗?在容错分布式系统中,您经常不得不接受不一致的情况,或者牺牲可用性,因为分区可以并且将会发生。如果您的数据模型确实需要两个单独的原子突变,那么批处理语句可以提供帮助,但它会占用一些可用性。如果你可以接受一点不一致,那么你仍然是可用的。这归结于您特定的业务需求,即什么是可接受的,什么是不能接受的。
https://stackoverflow.com/questions/26506130
复制相似问题