代码之家  ›  专栏  ›  技术社区  ›  natevw

couchdb 2.x下局部序列的行为是什么?

  •  0
  • natevw  · 技术社区  · 6 年前

    在couchdb 1.x中,文档有一个“隐藏的” ._local_seq 跟踪数据库的 update sequence 在编写文档修订版时的状态。这可以由视图使用,包括 {local_seq:true} 设计文档中的选项,或由客户端使用 ?local_seq=true 文档获取请求的查询选项。

    这个字段在CouCHDB 2 .x中仍然可用,但目前还不清楚它是如何运行的。由于集群的缘故, database update sequence 现在是“一个不透明的标记”,而本地序列仍然是一个普通整数,在实践中似乎并不总是匹配。

    是否存在任何关系,特别是如果我将自己限制在单个节点群集上?

    1 回复  |  直到 6 年前
        1
  •  0
  •   natevw    6 年前

    到目前为止,我发现:

    首先,目的是 local_seq 在CouCHDB 2。x中,实际上已经不太清楚了。正如在这个问题中已经提到的,在数据库/改变级别上,序列号已经被一个“不透明的令牌”所取代,这个“不透明令牌”与LoalalSeq没有任何关系。

    更糟的是,看起来 LoalalSeq 与[或至少可从]存储的值不是 数据库 但对 碎片 !(每个数据库在内部被分成多个部分;您可以阅读更多关于 Shards and Replicas 在文档中获取详细信息。)

    因此,在CouCHDB 1 .x中,例如,可以通过将LoalAlxSeq作为Map Reduce索引的一部分发出,并与之匹配,来进行自定义更改提要。 ?since=N 数据库的Y值在集群集中的CouCHDB 2 x中变化,这样的视图将倾向于发出多个文档(每个碎片中有一个)。 ._local_seq 场为对方!

    从另一个角度来看,在couchdb 2.x下,甚至 "seq" 与数据库级的特定文档相关联的更改提要可以从一个请求更改为同时请求前缀和/或之后的长而大的混乱。我不确定是否有一种方法,或者任何有用的优势,视图引擎可以提供一个“非本地序列”值给 map 函数的作用类似于它对本地序列的作用。


    也就是说,我找到了一种“巧合”的方式,从couchdb 2.3.0开始,保留了一些有用性:

    1. 通过 creating a database 具有 PUT /newdb?n=1&q=1 也就是说,配置一个副本,只配置一个shard,本地seq值最终在数据库中是唯一的。
    2. 在这种情况下 seq 数据库级别的令牌更改源 似乎与每个更改文档的本地顺序相匹配。也就是说,如果你在 '-' 把第一部分转换成一个数字,你似乎得到了局部序列。

    我会谨慎地相信这一点,因为:

    • 如果你 需要扩展,并选择使用多节点集群特性来扩展,任何依赖于上述特性的代码都将中断
    • 它绝不是官方认可的,理论上可能会突破点释放。CouCHDB开发人员已经很清楚地知道, 不透明的 你应该这样对待他们。

    所以 警告黑客 所有这些,上面的“巧合”都符合 how these tokens work 目前:

    前面的数字是在第二部分中编码的单个更新序列的总和,只存在于哄骗旧版本的复制器进行检查。

    如果只有一个更新序列,那么总和应该只是原始序列。

    对于给定的碎片 [更改订阅源] 完全有序(shard与2.0之前的数据库相同,具有一个整数序列),couchdb不洗牌输出。

    只有一个碎片 碎片 ,不只是一个 结点 / 复制品 你几乎可以保留前-2.0数据库的行为类型。

    推荐文章