专栏首页咻咻ing10. Things to Consider in a Multi-Node JanusGraph Cluster

10. Things to Consider in a Multi-Node JanusGraph Cluster

JanusGraph是一个分布式图形数据库,这意味着它可以在多节点集群中进行设置。 但是,在这样的环境中工作时,有一些重要的事情需要考虑。 此外,如果配置正确,JanusGraph会为用户处理一些特殊注意事项。

1. Dynamic Graphs

JanusGraph支持动态创建图形。 这与标准Gremlin Server实现允许访问图形的方式有所不同。 传统上,用户通过gremlin-server.yaml文件进行相应配置,在服务器启动时创建与图形的绑定。 例如,你的yaml文件的graphs部分如下所示:

graphs {
  graph1: conf/graph1.properties,
  graph2: conf/graph2.properties
}

然后,你将使用以下方式访问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来执行此操作:

channelizer: org.janusgraph.channelizers.JanusGraphWebSocketChannelizer

你可以选择以下几种channelizers:

  1. org.janusgraph.channelizers.JanusGraphWebSocketChannelizer
  2. org.janusgraph.channelizers.JanusGraphHttpChannelizer
  3. org.janusgraph.channelizers.JanusGraphNioChannelizer
  4. org.janusgraph.channelizers.JanusGraphWsAndHttpChannelizer

所有的channelizers都与TinkerPop对应的功能完全相同。

1.2.2. 使用TinkerPop的withRemote功能

由于遍历引用绑定在JanusGraph服务上,因此我们可以使用TinkerPop的withRemote功能。 这将允许在远程图形引用的情况下在本地运行gremlin查询。 传统上,通过发送字符串脚本表示来运行对远程Gremlin服务的查询,这些表示在远程服务上处理并且响应被序列化并发回。 但是,TinkerPop还允许使用remoteGraph,如果你正在构建可轻松转移到多个实现的TinkerPop兼容图形基础结构,这可能很有用。

要在JanusGraph中使用此功能,我们必须首先确保在远程JanusGraph集群上创建了一个图:

ConfiguredGraphFactory.create("graph1");

接下来,我们必须等待20秒,以确保遍历引用绑定在远程集群中的每个JanusGraph节点上。

最后,我们可以在本地使用withRemote方法来访问对远程图的本地引用:

gremlin> cluster = Cluster.open('conf/remote-objects.yaml')
==>localhost/127.0.0.1:8182
gremlin> graph = EmptyGraph.instance()
==>emptygraph[empty]
gremlin> g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster, "graph1_traversal"))
==>graphtraversalsource[emptygraph[empty], standard]

为了完成,上面的conf / remote-objects.yaml应告诉Cluster API如何访问远程JanusGraph服务器; 例如,它可能看起来像:

hosts: [remoteaddress1.com, remoteaddress2.com]
port: 8182
username: admin
password: password
connectionPool: { enableSsl: true }
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}

本文分享自微信公众号 - 咻咻ing(gh_d9f867ad7230)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Postman----API接口测试神器

    API是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。 API测试——测试API集合,检查它们的功...

    洛米唯熊
  • 如何用TensorFlow和Swift写个App识别霉霉?

    在很多歌迷眼里,尤其是喜欢乡村音乐的人,“霉霉”Taylor Swift是一位极具辨识度也绝对不能错过的女歌手。在美国硅谷就有一位非常喜欢 Taylor Swi...

    猿哥
  • 用php编写一个以太坊支付系统

    当我第一次考虑通过加密货币实施支付时,我查看了像Stripe这样的可用解决方案。我觉得Stripe的问题在于,它只允许使用美国商家帐户进行比特币支付,所以这对我...

    猿哥
  • C++创建动态库C#调用(二)----回调函数的使用

    上一篇《C++创建动态库C#调用》我们练习了C++写的动态库用C#的调用方法,后来研究回调函数这块,就想练习一下回调函数的使用,学习并巩固一下,话不多说,我们直...

    Vaccae
  • resource-router-middleware项目源码阅读

    resource-router-middleware是一个提供restful API的Express中间件,由preact作者developit开发。 一个简...

    用户1515472
  • fist模板模块介绍

    fist(https://github.com/fanux/fist)是sealyun开源的一款k8s管理软件,不同于其它管理软件的是其奉承的原则是...

    sealyun
  • Android使用Tesseract-ocr进行文字识别

    Tessseract是一款由HP实验室开发由 Google 维护的开源 OCR(Optical Character Recognition , 光学字符识别)引...

    Vaccae
  • 【开源框架】一文道尽主流开源框架中的数据增强

    大家都知道有效的数据对于深度学习的重要性,然而有时能够获取的数据确实有限,为了让模型更加鲁棒,我们可以添加数据或者对已有数据做数据增强。下面我具体阐述四个深度学...

    用户1508658
  • OpenGL 之 GPUImage 源码分析

    GPUImage 是 iOS 上一个基于 OpenGL 进行图像处理的开源框架,后来有人借鉴它的想法实现了一个 Android 版本的 GPUImage ,本文...

    glumes
  • OpenGL 之 帧缓冲 使用实践

    帧缓冲(Framebuffer Object),简称 FBO,在渲染绘制中, 图像最终都是绘制到 FBO 上的,一般都是默认的 FBO 上,也就是我们的屏幕。

    glumes

扫码关注云+社区

领取腾讯云代金券