2013-03-01 30 views
1

有对于处理并发更新二级指标几个滚你自己的策略,这对于例如:如何在PlayORM中实现二级索引并支持/处理并发更新?

http://www.slideshare.net/edanuff/indexing-in-cassandra

它采用3个ColumnFamilies

我的问题是,PlayORM @NoSqlIndexed注释是如何实现的;在什么额外的ColumnFamilies需要/创建?

此外,是否支持并发更新 - 即两个竞争更新不可能使索引从一个更新并从另一个更新到另一个表?

回答

2

您可以在不锁定的情况下进行并发更新。

幻灯片46的问题我不能得到误报吗? PlayOrm也是如此。

一个警告是你可能需要阅读解决。这样的例子。假设你在数据库中有Fred的地址为123。

现在,两台服务器进行更新,以弗雷德

  • 服务器1:Fred的新地址是456(在删除索引123.fred和添加456.fred结果)
  • 服务器2:Fred的新地址是789(导致删除索引123.fred并添加789.fred)

这意味着您的索引可能具有456.fred和789.fred的副本。然后,您可以解读此问题,因为当您询问地址为456的人时,查询将返回Fred。还有另一张票可供我们在您读取时解决此问题;)并取消条目。

我们确实询问了在cassandra中可能做些什么(添加第456.fred列123.fred存在或失败),但不知道他们是否会实现类似的东西。这会将失败传播给失败者(即最后一位作家得到例外)。这将是很好,但我不确定他们会做这样的功能。

BIG注意:与CQL不同,查询不会发送到所有节点。它只会在包含索引的节点上加载负载,而不是全部100台计算机。即。它可以以这种方式更好地扩展。

更多详细信息:在该演示文稿的第27张幻灯片中,您的链接有几乎与我们的索引相似。虽然格式不包含1,2,3。该指数格式

Indexes= 
    {"User_Keys_By_Last_Name":{ 
     {"adams","e5d…"}: null, 
     {"alden","e80…"}: null,   
     {"anderson","e5f…"}: null, 
     {"anderson","e71…"}: null, 
     {"doe","e78…"}: null, 
     {"franks","e66…"}: null, 
      …:…, 
     } 
    } 

这样,我们才能避免读,看看是否需要我们用一个1,2,3,4,5名下半年。相反,我们使用FK,我们知道它是独特的,只需要写一个。卡桑德拉无论如何都是关于解决读取冲突,这就是修复过程存在的原因。这是基于这样一个事实,即冲突发生的时间百分比非常低,只是以那么低的百分比进行冲击。

最后,您可以使用命令行工具来查看索引!它将大约200列的内容批量回传,这样您就可以拥有100万个条目,而命令行工具将会愉快地继续打印它们,直到您按Ctrl-C。

后, 院长

+0

感谢伟大的解释。我没有意识到CQL会查询所有的节点,你能否指出我有关这方面更多信息的方向?还有一个问题,因为索引的行键是“众所周知的”,这大概是否意味着如果命中了很多,你最终可能会在环中出现热点(取决于你的复制因素)? – BigBen 2013-03-01 17:45:41

+0

如果你使用分区,我相信CQL碰到了一个分区......没有分区,它不知道(但是所有的行都在这个节点上,不像这种格式)。另外,是的,在任何设计中,任何人都会想到你,或者有热点或写入会增加系统的负担,因为你必须写更多。通常我们使用RF 3,因此您有3个节点可以用于查询,并且通常会为该查询命中3个节点中的2个节点。我不确定在哪里阅读过这些内容(读过吨),并不总是100%正确,因此请随时仔细检查/更正。 (不知道我在哪里得到的信息) – 2013-03-02 19:19:40

1

截至目前,Playorm中只有3个表格为所有索引创建。即所有索引存储在StringIndice,IntegerIndice和DecimalIndice列族中。

除此之外,还有一个模式正在开发中,如果需要,将为列创建一个新表。请参阅https://github.com/deanhiller/playorm/issues/44的图案细节。

相关问题