10. Things to Consider in a Multi-Node JanusGraph Cluster
JanusGraph是一个分布式图形数据库,这意味着它可以在多节点集群中进行设置。 但是,在这样的环境中工作时,有一些重要的事情需要考虑。 此外,如果配置正确,JanusGraph会为用户处理一些特殊注意事项。
1. Dynamic Graphs
JanusGraph支持动态创建图形。 这与标准Gremlin Server实现允许访问图形的方式有所不同。 传统上,用户通过gremlin-server.yaml文件进行相应配置,在服务器启动时创建与图形的绑定。 例如,你的yaml文件的graphs部分如下所示:
1 | graphs { |
然后,你将使用以下方式访问Gremlin Server上的图:String graph1将根据其对应的属性文件绑定到服务器上打开的图形,对于graph2也是如此。
但是,如果我们使用ConfiguredGraphFactory动态创建图,那么这些图将由JanusGraphManager管理,图配置由ConfigurationManagementGraph管理。 这特别有用,因为它允许你在服务启动后定义图配置,并允许在JanusGraph集群中以持久化和分布式方式管理图配置。
要正确使用ConfiguredGraphFactory,在集群中必须使用JanusGraphManager和ConfigurationManagementGraph来配置每个Gremlin Server。这里有详细说明。
1.1. 图的一致性
如果你使用ConfiguredGraphFactory配置所有的JanusGraph服务,JanusGraph将确保所有图的表示在群集中的所有JanusGraph节点上都是最新的。
例如,如果你在一个JanusGraph节点上更新或删除图的配置,那么我们必须从集群中每个JanusGraph节点的缓存中清除该图。 否则,我们的集群中可能会出现不一致的图表示。 JanusGraph通过后端系统使用消息日志队列自动处理此清除。
如果你的某个服务配置不正确,则可能无法从缓存中成功删除该图。
注意:
对TemplateConfiguration的任何更新都不会导致更新先前使用所述模板配置创建的图形/图形配置。 如果要更新单个图配置,则必须使用可用的更新API执行此操作。 然后,这些更新API将导致跨群集中所有JanusGraph节点的graph缓存清除。
1.2. 动态图和遍历绑定
JanusGraph能够分别在集群中的所有JanusGraph节点上绑定动态创建的图形及其对<graph.graphname>和<graph.graphname> _traversal的遍历引用,最多20秒滞后以使绑定生效在群集中的任何节点上。在这里阅读更多相关信息。
JanusGraph通过让集群中的每个节点轮询ConfigurationManagementGraph以获取已为其创建配置的所有图形来实现此目的。然后,JanusGraphManager将使用其持久化配置打开所述图形,将其存储在其图形缓存中,并将<graph.graphname>绑定到GremlinExecutor上的图形引用,并将<graph.graphname> _traversal绑定到图形的遍历参考上。 GremlinExecutor。
这允许你在JanusGraph集群中的每个节点上通过字符串绑定访问动态创建的图形及其遍历引用。这对于能够使用Gremlin Server客户端并使用TinkerPops的withRemote功能尤为重要。
1.2.1. 设置
要设置集群以绑定动态创建的图形及其遍历引用,您必须:
- 配置每个节点以使用ConfiguredGraphFactory。
- 配置每个节点使用JanusGraphChannelizer,它将较低级别的Gremlin Server组件(如GremlinExecutor)注入到JanusGraph项目中,使我们能够更好地控制Gremlin Server。
要将每个节点配置为使用JanusGraphChannelizer,我们必须更新gremlin-server.yaml来执行此操作:
1 | channelizer: org.janusgraph.channelizers.JanusGraphWebSocketChannelizer |
你可以选择以下几种channelizers:
- org.janusgraph.channelizers.JanusGraphWebSocketChannelizer
- org.janusgraph.channelizers.JanusGraphHttpChannelizer
- org.janusgraph.channelizers.JanusGraphNioChannelizer
- org.janusgraph.channelizers.JanusGraphWsAndHttpChannelizer
所有的channelizers都与TinkerPop对应的功能完全相同。
1.2.2. 使用TinkerPop的withRemote功能
由于遍历引用绑定在JanusGraph服务上,因此我们可以使用TinkerPop的withRemote功能。 这将允许在远程图形引用的情况下在本地运行gremlin查询。 传统上,通过发送字符串脚本表示来运行对远程Gremlin服务的查询,这些表示在远程服务上处理并且响应被序列化并发回。 但是,TinkerPop还允许使用remoteGraph,如果你正在构建可轻松转移到多个实现的TinkerPop兼容图形基础结构,这可能很有用。
要在JanusGraph中使用此功能,我们必须首先确保在远程JanusGraph集群上创建了一个图:
1 | ConfiguredGraphFactory.create("graph1"); |
接下来,我们必须等待20秒,以确保遍历引用绑定在远程集群中的每个JanusGraph节点上。
最后,我们可以在本地使用withRemote方法来访问对远程图的本地引用:
1 | gremlin> cluster = Cluster.open('conf/remote-objects.yaml') |
为了完成,上面的conf / remote-objects.yaml应告诉Cluster API如何访问远程JanusGraph服务器; 例如,它可能看起来像:
1 | hosts: [remoteaddress1.com, remoteaddress2.com] |
欢迎扫码关注公众号,更好的交流
原文作者: xiuxiuing
原文链接: https://xiuxiuing.gitee.io/blog/2019/04/01/jgcluster/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议