Indexing 为什么在Cassandra上创建自定义索引时使用第三列族?

Indexing 为什么在Cassandra上创建自定义索引时使用第三列族?,indexing,cassandra,Indexing,Cassandra,正如我常说的,对不起我的英语。我正在为Cassandra中的一些列族创建一些手动索引。我已经读了所有我能读到的关于这个的东西,但是我发现了一些我不能正确理解的东西 在Ed Anuff完成的本演示中,我看到了他为Users列族创建索引的简单示例。他使用两个明显的CFs和另一个CFs来处理并发性。第三个CF是“我的问题”。如果我没有错的话,Cassandra将始终存储每个列的最新值。如果这个值被索引,我必须在索引CF中更新它(删除旧索引并创建新索引),但是为什么需要第三个CF呢?当我考虑到这一点和并

正如我常说的,对不起我的英语。我正在为Cassandra中的一些列族创建一些手动索引。我已经读了所有我能读到的关于这个的东西,但是我发现了一些我不能正确理解的东西

在Ed Anuff完成的本演示中,我看到了他为Users列族创建索引的简单示例。他使用两个明显的CFs和另一个CFs来处理并发性。第三个CF是“我的问题”。如果我没有错的话,Cassandra将始终存储每个列的最新值。如果这个值被索引,我必须在索引CF中更新它(删除旧索引并创建新索引),但是为什么需要第三个CF呢?当我考虑到这一点和并发性时,我的理解是:好的,很多人都在更新一个被索引的值。这意味着需要大量的工作来更新索引,但最后一个值将出现在Users CF和index CF中,这就是为什么每列都有一个时间戳,那么并发性又有什么问题呢?更重要的是,如果值只能由一个用户(数据的所有者)更新,那么将不会有并发性

我知道我对卡桑德拉事件一无所知,但我不明白第三个CF背后的原因。Ed Anuff解释说,使用第三列族可以将索引恢复到一致的状态,但是,为什么它们会陷入不一致的状态?如果发生这种情况,用户CF可能足以恢复索引,还是我错了

请有人给我解释一下好吗?我的错误是什么


多谢各位

因为我认为其他人可能会有和我一样的怀疑,我将用我发现的东西来回答我自己的问题:

正如我所想,主要问题是并发性。如果我们假设许多用户可以同时更改相同的索引值,因为您必须在更新之前读取索引,那么在读取值和更新索引中的值之间,另一个用户可能再次更改该值。此外,从更新值到更新索引,系统可能会崩溃。然后,在一些并发更改之后,索引可能会有旧值,这些值指向没有该值的行

通过添加第三列族,此过程更安全,但并非100%安全

最后一件事:根据我的理解,如果在更新值时没有并发性,那么肯定没有问题。假设您正在索引一些用户数据。如果只允许数据所有者修改数据,则根本不存在并发性。唯一的风险是,在完成将索引与值对齐的过程之前,系统会崩溃,但此操作是幂等的,因此可以重复此操作直到成功


希望这能解释我的理解并帮助他人

实际上,我认为它更多的是关于幂等性而不是并发性。 如果有两个或三个列族,并发用户可能会产生误报结果,即索引列族中指向不再具有该值的行的键。。。但使用双栏族设计时,如果重复更新过程的任何部分,最终可能会丢失索引栏族的正确行中的某一行的键。。。但是,使用三列族设计,您可以确保在索引列族中的正确位置具有每行的键。。。 过滤结果将解决假阳性问题,但如果您没有在正确的位置设置密钥,则无法简单地获取行,整个索引机制将是徒劳的

在两柱族设计中考虑以下示例: 用户1更新位置,Cassandra返回错误,但写入成功。 用户2更新位置,读取用户1写入的结果,并在列族中写入其位置 用户1重试并写入其在列族中的位置,并更新索引列族 用户2更新索引列族,删除用户1的位置并插入自己的位置

最后,用户具有用户1的位置,但行键仅存在于用户2输入索引行中

我现在就举一个例子,它可能有一些问题,或者你可以通过改变更新过程来解决在正确的位置丢失密钥的问题,但是你应该理解背后的概念。你可以想出一个更好的例子

但是我不确定,但是这个解释对我来说很有意义,希望我能向你们解释