取自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毫秒,我们仍然有一个不一致的时间窗口。我想知道"对/实用"处理这种情况的方法。
答案 0 :(得分:0)
Cassandra落入CAP的AP方面。它牺牲了一致性。有些方法可以提供帮助,使用cassandra 2.x中的批处理语句:http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html
虽然这里真正的问题是这种不一致的后果是什么?这是一个2分钟的窗口,在此期间您的搜索不会为标签提供新书吗?这是灾难性的吗?在容错的分布式系统中,您经常必须接受不一致的内容,或牺牲可用性,因为分区可以并且将会发生。如果你的datamodel确实需要两个独立的原子突变,那么批处理语句可以提供帮助,但它会带来一些可用性。如果你有一点不一致,那么你仍然可用。它取决于您的具体业务要求是什么是不可接受的。