janus 图形 ID 生成逻辑是否会与扩展应用程序冲突

will janus graph id generation logic conflict with scaling the application

在探索 JanusGraph-core 库时,我看到了 id 生成部分 (StandardIDPool.nextID()),它似乎是由应用程序逻辑生成的 janus 顶点的 id。在这种情况下,我如何水平扩展一个使用janusGraph的应用程序,我不能在扩展应用程序时遇到id冲突问题吗?

扩展使用 JanusGraph 的应用程序的最佳方法是什么?

图的 JanusGraph 实例 select 一个维护 ID 池管理器的实例。 JanusGraph 参考文档说明了以下关于 optimizing ID allocation:

ID 块大小

每个新添加的顶点或边都被分配了一个唯一的 ID。 JanusGraph 的 ID 池管理器为特定的 JanusGraph 实例获取块中的 ID。 id 块获取过程是昂贵的,因为它需要保证全局唯一的块分配。增加 ids.block-size 会减少获取的数量,但可能会留下许多未分配的 id,从而造成浪费。对于事务性工作负载,默认块大小是合理的,但在批量加载期间,顶点和边的添加更加频繁且快速连续。因此,通常建议将块大小增加 10 倍或更多,具体取决于每台机器要添加的顶点数。

经验法则:将 ids.block-size 设置为您希望每个 JanusGraph 实例每小时添加的顶点数。

重要提示:所有 JanusGraph 实例必须配置相同的 ID 值。block-size 以确保正确分配 ID。因此,在更改此值之前请小心关闭所有 JanusGraph 实例。

ID获取过程

当id块被多个JanusGraph实例频繁并行分配时,实例之间的分配冲突将不可避免地出现并减慢分配过程。此外,由于批量加载而增加的写入负载可能会进一步减慢进程,以至于 JanusGraph 认为它失败并抛出异常。可以调整三个配置选项来避免这种情况。

  1. ids.authority.wait-time 配置 id 池管理器等待存储后端确认 id 块应用程序的时间(以毫秒为单位)。这个时间越短,应用程序在拥挤的存储集群上失败的可能性就越大。

经验法则:将此设置为在负载下的存储后端集群上测量的第 95 个百分位读取和写入时间的总和。重要提示:此值在所有 JanusGraph 实例中应该相同。

  1. ids.renew-timeout 配置 JanusGraph 的 ID 池管理器在失败前尝试获取新 ID 块时总共等待的毫秒数。

经验法则:将此值设置得尽可能大,这样就不必为不可恢复的故障等待太久。增加它的唯一缺点是 JanusGraph 将在不可用的存储后端集群上尝试很长时间。