【问题标题】:how are secondary indexes implemented in PlayORM and are concurrent updates supported / handled?PlayORM 中如何实现二级索引以及是否支持/处理并发更新?
【发布时间】:2013-03-01 04:45:03
【问题描述】:

对于处理并发更新的二级索引,有几种滚动您自己的策略,例如:

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

它使用 3 个 ColumnFamilies。

我的问题是,PlayORM @NoSqlIndexed 注解是如何实现的;就需要/创建哪些额外的 ColumnFamilies 而言?

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

【问题讨论】:

    标签: cassandra playorm


    【解决方案1】:

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

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

    需要注意的是,您可能需要在阅读时解决问题。例子是这样的。假设您在数据库中有一个地址为 123 的 Fred。

    现在,两台服务器对 Fred 进行了更新

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

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

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

    注意:与 CQL 不同,查询不会发送到所有节点。它只将负载放在包含索引的节点上,而不是所有 100 台计算机上。 IE。这样可以更好地扩展。

    更多细节:在该演示文稿的第 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 并且只需要进行写入。无论如何,Cassandra 都是关于解决读取冲突的,这就是存在修复过程的原因。这是基于这样一个事实,即冲突发生的时间比例非常低,并且只会在那个低比例时受到打击。

    最后,您可以使用命令行工具查看索引!!!!它将大约 200 列中的内容批处理,每列流回,因此您可以拥有 100 万个条目,并且命令行工具会很高兴地继续打印它们,直到您 ctrl-c 它。

    后来, 院长

    【讨论】:

    • 感谢您的精彩解释。我没有意识到 CQL 会查询所有节点,你能告诉我更多信息的方向吗?还有另一个问题,由于索引的行键是“众所周知的”,这是否意味着如果它受到很多影响,您最终可能会在环中出现热点(取决于您的复制因子)?
    • 如果你使用分区,我相信 CQL 会命中一个分区...没有分区,它不知道(但所有行都在那个节点上,与这种格式也不同)。此外,是的,在任何设计中,任何人都想出你,要么有热点,要么写在系统上的负载变得更多,因为你必须写更多。通常我们使用 RF 3,因此您可以为查询点击 3 个节点,并且通常为该查询点击 3 个节点中的 2 个。我不确定我在哪里读到了那些东西(读过很多次),而且并不总是 100% 正确,所以请随时仔细检查/更正。 (不知道我从哪里得到的信息)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多