Apache Jackrabbit OAK - 按节点路径跨集群分片 DocumentNodeStore

Posted

技术标签:

【中文标题】Apache Jackrabbit OAK - 按节点路径跨集群分片 DocumentNodeStore【英文标题】:Apache Jackrabbit OAK - Sharding DocumentNodeStore across cluster by node path 【发布时间】:2018-02-18 12:28:01 【问题描述】:

我正在努力寻找足够的文档和示例,以便通过路径分片节点存储在集群环境中构建和使用 Jackrabbit OAK。 我知道这是可能的,因为在一些地方有引用但信息很少,而且 OAK 或 NodeStore API 不够直观,无法找到此功能。

查看此 PDF 中的幻灯片 17,其中列出了各种分片策略。 http://events.linuxfoundation.org/sites/events/files/slides/the%20architecture%20of%20Oak.pdf

我的用例是我需要多个远程服务器都运行相同的 Jackrabbit OAK 应用程序,该应用程序使用由 MongoDB 支持的 DocumentNodeStore 作为节点和 blob 存储。我最终想要的是在整个节点结构中由不同路径组织的这些远程服务器上对我的数据的部分进行分片(或分区)。

例如:

服务器 (A) 负责将内容存储在/a/*

服务器 (B) 负责将内容存储在/b/*

如果服务器 (A) 想要读取或写入 /b/* 的内容,它可以使用正常的 JCR 或 OAK API 访问该路径上的节点,这应该将用户从网络详细信息和与服务器的连接中完全抽象出来 ( B) MongoDB。

是否有与此用例相关的可靠文档?如果没有,学习这个的最好方法是什么?我可以花一整天时间浏览 OAK 源代码,但文档会更好。

【问题讨论】:

我不认为这就是 Oak 中集群的工作方式。集群中的每个节点都需要能够访问所有文档。 @JulianReschke,我认为 OP 想了解如何对支持存储库的 mongo 设置进行分片。 Afaiu,mongo 分片仍然允许所有客户端读取任何文档 - 最好是一个客户端可以从潜在的非常远程的分片实例中读取最少的文档。我的意思是在他的例子中,A 应该主要关注 /a/* (当然也需要读取根目录) 【参考方案1】:

此时Oak 的Mongodb 实现没有分片策略。问题本质上归结为这样一个事实,即由 Oak 存储的 Mongo 文档的 _id 不会将文档放在分片中,这样来自同一子树的一组节点可能会落在同一个分片实例上。曾经有过一些关于添加分片键来处理用例的讨论,但讨论并没有取得很大进展,因为此时我们还没有看到需要分片的引人注目的用例。

也就是说,afaik,您可以设置一个分片实例并相应地提供 mongouri。我上面所说的很可能不会像你想要的那样扩展。此外,我们还没有看到非分片设置无法处理的设置。

我知道它没有回答您的问题,但也许这表明您找不到关于该主题的太多说法。

【讨论】:

感谢您的精彩解释!我在想我可以通过自己“分片”数据来避免集群多个独立的 mongodb 实例。幸运的是,我的用例相当简单,而且我能够轻松地对数据集进行分区。我可以实现某种形式的服务发现来查找并连接到集群中的各种 mongodb 实例。但是,通过这种设置,我很困惑如何将单个 OAK 实例连接到各种 mongodb 实例。我需要为每个创建一个新的存储库实例吗?这是正确的方法吗? 我认为从技术上讲,您的评论是不同的问题,可能违反了 SO 政策:)。无论如何,一个 Oak 集群只能连接到一个 mongo db 设置(单实例、副本、分片等)。您描述的分区类型只能在位于 Oak 上方的应用程序中完成。是的,您需要多个橡木实例,您的应用程序在这些实例之间进行多路复用。关于“这是正确的方法”:我认为您可能正在进行早期优化。我建议不要在一开始就进行复杂的设置。此外,从长远来看,硬编码分区可能会造成伤害。

以上是关于Apache Jackrabbit OAK - 按节点路径跨集群分片 DocumentNodeStore的主要内容,如果未能解决你的问题,请参考以下文章

Apache Jackrabbit Oak 1.5.9 发布

向 ACL 添加限制会在 Jackrabbit Oak 中的查询产生空结果

如何通过 WebDAV 访问 Jackrabbit Oak 存储库?

Jackrabbit Oak 合并不保存更改

使用 Jackrabbit Oak 优于 MongoDB 的优势

Jackrabbit Oak:入门并通过 RMI 连接到独立存储库