Chapter 7. JanusGraph Server

JanusGraph 使用 Gremlin Server 引擎作为服务器组件来处理和应答客户端查询。 当在 JanusGraph 中打包时,Gremlin Server 被称为JanusGraph Server。

必须手动启动 JanusGraph Server 才能使用它。 JanusGraph Server 提供了一种远程执行 Gremlin 脚本的方法,该脚本针对托管在其中的一个或多个 JanusGraph 实例。 本节将介绍如何使用 WebSocket 配置,以及如何配置 JanusGraph Server 以处理 HTTP 端点交互。

7.1. 入门

7.1.1 使用预编译包

JanusGraph 版本预先配置为开箱即用运行 JanusGraph Server,利用示例 Cassandra 和 Elasticsearch 配置,允许用户快速使用 JanusGraph Server。此配置默认为可通过自定义子协议的 WebSocket 连接到 JanusGraph Server 的客户端应用程序。有许多不同的客户端语言被开发以帮助支持子协议。使用 WebSocket 接口的最被熟知的客户端是 Gremlin 控制台。快速启动包不代表生产安装,而是提供了一种使用 JanusGraph Server 执行开发,运行测试以及查看组件如何连接在一起的方法。 要使用此默认配置:

  • Releases 页面下载当前 janusgraph-$VERSION.zip 文件的副本
  • 解压并进入 janusgraph-$VERSION 目录
  • 执行 bin/janusgraph.sh start。这一步将启动 Gremlin Server 与 Cassandra/ES 分成一个单独的进程。 注意出于安全原因,Elasticsearch 和 janusgraph.sh 必须在非 root 帐户下运行。
$ bin/janusgraph.sh start
Forking Cassandra...
Running `nodetool statusthrift`.. OK (returned exit status 0 and printed string "running").
Forking Elasticsearch...
Connecting to Elasticsearch (127.0.0.1:9300)... OK (connected to 127.0.0.1:9300).
Forking Gremlin-Server...
Connecting to Gremlin-Server (127.0.0.1:8182)... OK (connected to 127.0.0.1:8182).
Run gremlin.sh to connect.

7.1.1.1 连接 Gremlin Server

运行 janusgraph.sh 脚本后,Gremlin Server 就可以监听 WebSocket 连接了。最简单的测试连接的方法是使用 Gremlin 控制台。

使用 bin/gremlin.sh 脚本启动 Gremlin 控制台,然后使用 :remote:> 命令向 Gremlin Server 发送 Gremlin 请求。

$  bin/gremlin.sh
         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.utilities
plugin activated: janusgraph.imports
plugin activated: tinkerpop.tinkergraph
gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Connected - localhost/127.0.0.1:8182
gremlin> :> graph.addVertex("name", "stephen")
==>v[256]
gremlin> :> g.V().values('name')
==>stephen

:remote 命令告诉控制台使用 conf/remote.yaml 文件创建一个连接到 Gremlin Server 的远程连接。该文件指向在 localhost 上运行的 Gremlin Server 实例。 :> 是 “submit” 提交命令,它将该行上的 Gremlin 指令发送到当前活动的远程连接。默认情况下,远程连接是会话较少的,这意味着在控制台中发送的每一行都被解释为单个请求。可以使用分号作为分隔符在一行上发送多个语句。或者,您可以通过在创建连接时指定会话来建立具有会话的控制台。控制台会话允许您跨多行输入重用变量。

gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured localhost/127.0.0.1:8182
gremlin> graph
==>standardjanusgraph[cql:[127.0.0.1]]
gremlin> g
==>graphtraversalsource[standardjanusgraph[cql:[127.0.0.1]], standard]
gremlin> g.V()
gremlin> user = "Chris"
==>Chris
gremlin> graph.addVertex("name", user)
No such property: user for class: Script21
Type ':help' or ':h' for help.
Display stack trace? [yN]
gremlin> :remote connect tinkerpop.server conf/remote.yaml session
==>Configured localhost/127.0.0.1:8182-[9acf239e-a3ed-4301-b33f-55c911e04052]
gremlin> g.V()
gremlin> user = "Chris"
==>Chris
gremlin> user
==>Chris
gremlin> graph.addVertex("name", user)
==>v[4344]
gremlin> g.V().values('name')
==>Chris

7.2 清理数据

如果您想重新开始并删除数据库和日志,可以使用 janusgraph.shclean 命令。 应在运行清理操作之前停止服务器。

$ cd /Path/to/janusgraph/janusgraph-0.2.0-hadoop2/
$ ./bin/janusgraph.sh stop
Killing Gremlin-Server (pid 91505)...
Killing Elasticsearch (pid 91402)...
Killing Cassandra (pid 91219)...
$ ./bin/janusgraph.sh clean
Are you sure you want to delete all stored data and logs? [y/N] y
Deleted data in /Path/to/janusgraph/janusgraph-0.2.0-hadoop2/db
Deleted logs in /Path/to/janusgraph/janusgraph-0.2.0-hadoop2/log

7.3 配置 JanusGraph Server 为 WebSocket 服务

第 7.1节 “入门” 中描述的默认配置已经是 WebSocket 配置。 如果要更改默认配置以使用自己的 Cassandra 或 HBase 环境而不是使用快速启动环境,请按照下列步骤操作:

配置 JanusGraph Server 为 WebSocket 服务

  • 首先使用本地连接测试 JanusGraph 数据库。无论是使用 Gremlin 控制台测试连接还是从程序连接,此步骤都适用。在你的安装环境的 ./conf 目录中的 properties 文件中进行适当的更改。例如,编辑 ./conf/janusgraph-hbase.properties 并确保正确指定了 storage.backend,storage.hostname 和 storage.hbase.table 参数。有关为各种存储后端配置 JanusGraph 的更多信息,请参阅 第III部分“存储后端”。 确保属性文件包含以下行:
gremlin.graph=org.janusgraph.core.JanusGraphFactory
  • 一旦测试本地配置没问题并且您有更改过的属性文件后,将属性文件从 ./conf 目录复制到 ./conf/gremlin-server 目录。
cp conf/janusgraph-hbase.properties conf/gremlin-server/socket-janusgraph-hbase-server.properties
  • 拷贝 ./conf/gremlin-server/gremlin-server.yaml 为新文件 socket-gremlin-server.yaml。做这个操作是为了你可能需要参考原始文件。
cp conf/gremlin-server/gremlin-server.yaml conf/gremlin-server/socket-gremlin-server.yaml
  • 编辑 socket-gremlin-server.yaml 文件,并做下面这些更改:

如果你打算从其它主机远程连接 JanusGraph Server,为 host 更改 IP:

host: 10.10.10.100

更改图形部分以指向新的 properties 文件,以便 JanusGraph 服务器可以找到并连接到您的 JanusGraph 实例:

graphs: {
  graph: conf/gremlin-server/socket-janusgraph-hbase-server.properties
}
  • 启动 JanusGraph 服务器,指定刚刚配置的 yaml 文件:
bin/gremlin-server.sh ./conf/gremlin-server/socket-gremlin-server.yaml

重要:不要使用 bin/janusgraph.sh 脚本,因为这将启动默认配置,从而启动单独的 Cassandra/Elasticsearch 环境。

  • JanusGraph 服务器现在应该在 WebSocket 模式下运行,并且可以按照第 7.1.1.1 节 “连接 Gremlin Server” 中的说明进行测试。

7.4. 配置 JanusGraph Server 为 HTTP 服务

在 7.1 节 入门中的默认配置是 WebSocket 配置,如果要更改默认配置以使用 JanusGraph Server,作为 JanusGraph 数据库的 HTTP 服务,请按照下列步骤操作:

配置 JanusGraph Server 为 HTTP 服务

  • 首先使用本地连接测试 JanusGraph 数据库。无论是使用 Gremlin 控制台测试连接还是从程序连接,此步骤都适用。在你的安装环境的 ./conf 目录中的 properties 文件中进行适当的更改。例如,编辑 ./conf/janusgraph-hbase.properties 并确保正确指定了 storage.backend,storage.hostname 和 storage.hbase.table 参数。有关为各种存储后端配置 JanusGraph 的更多信息,请参阅 第III部分“存储后端”。 确保属性文件包含以下行:
gremlin.graph=org.janusgraph.core.JanusGraphFactory
  • 一旦测试本地配置没问题并且您有更改过的属性文件后,将属性文件从 ./conf 目录复制到 ./conf/gremlin-server 目录。
cp conf/janusgraph-hbase.properties conf/gremlin-server/http-janusgraph-hbase-server.properties
  • 拷贝 ./conf/gremlin-server/gremlin-server.yaml 为一个新文件 http-gremlin-server.yaml,做这个操作是为了你可能需要参考原始文件。
cp conf/gremlin-server/gremlin-server.yaml conf/gremlin-server/http-gremlin-server.yaml
  • 编辑 http-gremlin-server.yaml 文件,并做下面这些更改:

如果你打算从其它主机远程连接 JanusGraph Server,为 host 更改 IP:

host: 10.10.10.100

更改 channelizer 设置以指定 HttpChannelizer:

channelizer: org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer

更改图形部分以指向新的 properties 文件,以便 JanusGraph 服务器可以找到并连接到您的 JanusGraph 实例:

graphs: {
  graph: conf/gremlin-server/http-janusgraph-hbase-server.properties
}
  • 启动 JanusGraph 服务器,指定刚刚配置的 yaml 文件:
bin/gremlin-server.sh ./conf/gremlin-server/http-gremlin-server.yaml
  • JanusGraph 服务器现在应该以 HTTP 模式运行并可用于测试。 curl 可用于验证服务器是否正常工作:
curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V().count()"}' http://[IP for JanusGraph server host]:8182

7.5 配置 JanusGraph 同时为 WebSocket 和 HTTP 服务

从 JanusGraph 0.2.0 开始,您可以配置 gremlin-server.yaml 以通过同一端口接受 WebSocket 和 HTTP 连接。 这可以通过如下改变任何前述示例中的信道器来实现。

channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer

7.6 JanusGraph 服务高级配置

7.6.1 HTTP 认证

重要:在以下示例中,credentialsDb 应与您正在使用的图表不同。 它应配置正确的后端以及适用于配置的后端的不同密钥空间,表或存储目录。 此图表将用于存储用户名和密码。

7.6.1.1 HTTP 基本身份验证

要在 JanusGraph Server 中启用基本身份验证,请在 gremlin-server.yaml 中包含以下配置。

authentication: {
   authenticator: org.janusgraph.graphdb.tinkerpop.gremlin.server.auth.JanusGraphSimpleAuthenticator,
   authenticationHandler: org.apache.tinkerpop.gremlin.server.handler.HttpBasicAuthenticationHandler,
   config: {
     defaultUsername: user,
     defaultPassword: password,
     credentialsDb: conf/janusgraph-credentials-server.properties
    }
 }

验证是否正确配置了基本身份验证。 例如

curl -v -XPOST http://localhost:8182 -d '{"gremlin": "g.V().count()"}'

如果身份验证配置正确,则应返回401。

curl -v -XPOST http://localhost:8182 -d '{"gremlin": "g.V().count()"}' -u user:password

如果验证配置正确,则应返回200,结果为4。

7.6.2 WebSocket 认证

通过简单身份验证和安全层(SASL)机制进行 WebSocket 身份验证。

要启用 SASL 身份验证,请在 gremlin-server.yaml 中包含以下配置:

authentication: {
  authenticator: org.janusgraph.graphdb.tinkerpop.gremlin.server.auth.JanusGraphSimpleAuthenticator,
  authenticationHandler: org.apache.tinkerpop.gremlin.server.handler.SaslAuthenticationHandler,
  config: {
    defaultUsername: user,
    defaultPassword: password,
    credentialsDb: conf/janusgraph-credentials-server.properties
  }
}

重要:在前面的示例中,credentialsDb 应该与您正在使用的图表不同。 它应配置正确的后端以及适用于配置的后端的不同密钥空间,表或存储目录。 此图表将用于存储用户名和密码。

如果您通过 gremlin 控制台进行连接,则远程 yaml 文件应使用适当的值来修改用户名和密码属性。

username: user
password: password

HTTP 和 WebSocket 认证

如果您正在使用组合的信道,同时支持 HTTP 和 WebSocket,则可以使用 SaslAndHMACAuthenticator 进行授权,WebSocket 通过 SASL 进行授权,HTTP 通过基本身份验证进行授权,它使用基于哈希的消息身份验证代码(HMAC)身份验证代码进行授权。 HMAC 是基于令牌的身份验证,被设计为在 HTTP 上使用。 您首先通过 /session 端获取令牌,然后使用它进行身份验证。 它用于分摊使用基本身份验证加密密码所花费的时间。

gremlin-server.yaml 应该包含以下配置:

authentication: {
  authenticator: org.janusgraph.graphdb.tinkerpop.gremlin.server.auth.SaslAndHMACAuthenticator,
  authenticationHandler: org.janusgraph.graphdb.tinkerpop.gremlin.server.handler.SaslAndHMACAuthenticationHandler,
  config: {
    defaultUsername: user,
    defaultPassword: password,
    hmacSecret: secret,
    credentialsDb: conf/janusgraph-credentials-server.properties
  }
}

重要:在前面的示例中,credentialsDb应该与您正在使用的图表不同。 它应配置正确的后端以及适用于配置的后端的不同密钥空间,表或存储目录。 此图表将用于存储用户名和密码。

重要:请注意 hmacSecret。 如果您希望能够在每台服务器上使用相同的 HMAC 令牌,则在所有正在运行的 JanusGraph 服务器上应该相同。

对于 HTTP 上的 HMAC 身份验证,这将创建一个 /session 端点,该端点提供默认情况下在一小时后过期的令牌。 可以通过 authentication.config map 中的 tokenTimeout 配置选项配置令牌的超时。 此值为 Long 值,以毫秒为单位。

您可以使用 curl 通过向 /session 端点发出 get 请求来获取令牌。 例如:

curl http://localhost:8182/session -XGET -u user:password

{"token": "dXNlcjoxNTA5NTQ2NjI0NDUzOkhrclhYaGhRVG9KTnVSRXJ5U2VpdndhalJRcVBtWEpSMzh5WldqRTM4MW89"}

然后,您可以使用 “Authorization: Token” 头将该令牌用于身份验证。 例如

curl -v http://localhost:8182/session -XPOST -d '{"gremlin": "g.V().count()"}' -H "Authorization: Token dXNlcjoxNTA5NTQ2NjI0NDUzOkhrclhYaGhRVG9KTnVSRXJ5U2VpdndhalJRcVBtWEpSMzh5WldqRTM4MW89"

7.6.4 在 JanusGraph 中使用 TinkerPop Gremlin Server

由于 JanusGraph Server 是一个包含 JanusGraph 配置文件的 TinkerPop Gremlin Server,因此可以单独下载兼容版本的 TinkerPop Gremlin Server 并与 JanusGraph 一起使用。 首先下载适当版本的 Gremlin Server,它需要匹配正在使用的 JanusGraph 版本支持的版本(3.3.3)。

注意:除非特别说明,否则本节中对文件路径的任何引用都是指 Gremlin Server 的 TinkerPop 发行版下的路径,而不是带有 JanusGraph 服务器的 JanusGraph 发行版。

配置独立的 Gremlin 服务器以使用 JanusGraph 类似于配置打包的 JanusGraph 服务器。 您应该熟悉图形配置。 基本上,Gremlin Server yaml 文件指向特定于图形的配置文件,这些文件用于实例化它随后将托管的 JanusGraph 实例。 为了实例化这些 Graph 实例,Gremlin Server 要求在其类路径上提供 JanusGraph 的相应库和依赖项。

出于演示目的,这些示例将概述如何在 Gremlin Server 中为 JanusGraph 配置 BerkeleyDB 存储后端。 如前所述,Gremlin Server 需要 JanusGraph 对其类路径的依赖。 调用以下命令,使用 JanusGraph 版本替换 $VERSION:

bin/gremlin-server.sh -i org.janusgraph janusgraph-all $VERSION

当此过程完成时,Gremlin Server 现在应该具有所有可用的 JanusGraph 依赖项,因此能够实例化 JanusGraph 对象。

重要:上面的命令使用 Groovy Grape,如果配置不正确,可能会出现下载错误。 有关设置 ~/.groovy/grapeConfig.xml 的更多信息,请参阅 TinkerPop 文档的这一部分

使用以下内容创建名为 GREMLIN_SERVER_HOME/conf/janusgraph.properties 的文件:

gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=berkeleyje
storage.directory=db/berkeley

其他后端的配置类似。 请参见 第III部分“存储后端”。 如果使用 Cassandra,则在 janusgraph.properties 文件中使用 Cassandra 配置选项。 保持不变的唯一重要部分是 gremlin.graph 设置,它应该始终使用 JanusGraphFactory。 此设置告诉 Gremlin Server 如何实例化 JanusGraph 实例。

接下来创建一个名为 GREMLIN_SERVER_HOME/conf/gremlin-server-janusgraph.yaml 的文件,其中包含以下内容:

host: localhost
port: 8182
graphs: {
  graph: conf/janusgraph.properties}
plugins:
  - janusgraph.imports
scriptEngines: {
  gremlin-groovy: {
    scripts: [scripts/janusgraph.groovy]}}
serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
metrics: {
  slf4jReporter: {enabled: true, interval: 180000}}

这个配置文件有几个重要的部分,因为它们与 JanusGraph 有关。

  1. graphs 映射中,有一个名为 graph 的键,其值为 conf/janusgraph.properties。 这告诉 Gremlin Server 实例化一个名为 “graph” 的 Graph 实例,并使用 conf/janusgraph.properties 文件对其进行配置。 “graph” 键成为 Gremlin Server 中 Graph 实例的唯一名称,可以在提交给它的脚本中引用它。
  2. plugins 列表中,有一个对 janusgraph.imports 的引用,它告诉 Gremlin Server 初始化 “JanusGraph 插件”。 “JanusGraph 插件” 将自动导入 JanusGraph 特定类,以便在脚本中使用。
  3. 请注意 scripts 键和 scripts/janusgraph.groovy 的引用。 这个 Groovy 文件是 Gremlin Server 和特定 ScriptEngine 的初始化脚本。 使用以下内容创建脚本 scripts/janusgraph.groovy
def globals = [:]
globals << [g : graph.traversal()]

上面的脚本创建了一个名为 globals 的 Map,并为其分配一个键/值对。键是 g,它的值是从图生成的 TraversalSource,是在配置文件中为 Gremlin Server 配置的。此时,现在为 Gremlin Server 提供的脚本可以使用两个全局变量 - graphg

此时,Gremlin Server 已配置,可用于连接到新的或现有的 JanusGraph 数据库。 启动服务器:

$ bin/gremlin-server.sh conf/gremlin-server-janusgraph.yaml
[INFO] GremlinServer -
         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----

[INFO] GremlinServer - Configuring Gremlin Server from conf/gremlin-server-janusgraph.yaml
[INFO] MetricManager - Configured Metrics Slf4jReporter configured with interval=180000ms and loggerName=org.apache.tinkerpop.gremlin.server.Settings$Slf4jReporterMetrics
[INFO] GraphDatabaseConfiguration - Set default timestamp provider MICRO
[INFO] GraphDatabaseConfiguration - Generated unique-instance-id=7f0000016240-ubuntu1
[INFO] Backend - Initiated backend operations thread pool of size 8
[INFO] KCVSLog$MessagePuller - Loaded unidentified ReadMarker start time 2015-10-02T12:28:24.411Z into org.janusgraph.diskstorage.log.kcvs.KCVSLog$MessagePuller@35399441
[INFO] GraphManager - Graph [graph] was successfully configured via [conf/janusgraph.properties].
[INFO] ServerGremlinExecutor - Initialized Gremlin thread pool.  Threads in pool named with pattern gremlin-*
[INFO] ScriptEngines - Loaded gremlin-groovy ScriptEngine
[INFO] GremlinExecutor - Initialized gremlin-groovy ScriptEngine with scripts/janusgraph.groovy
[INFO] ServerGremlinExecutor - Initialized GremlinExecutor and configured ScriptEngines.
[INFO] ServerGremlinExecutor - A GraphTraversalSource is now bound to [g] with graphtraversalsource[standardjanusgraph[berkeleyje:db/berkeley], standard]
[INFO] AbstractChannelizer - Configured application/vnd.gremlin-v1.0+gryo with org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
[INFO] AbstractChannelizer - Configured application/vnd.gremlin-v1.0+gryo-stringd with org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
[INFO] GremlinServer$1 - Gremlin Server configured with worker thread pool of 1, gremlin pool of 8 and boss thread pool of 1.
[INFO] GremlinServer$1 - Channel started at port 8182.

以下部分说明如何连接到正在运行的服务器。

7.6.4.1 通过 Gremlin Server 连接到 JanusGraph

Gremlin Server 将在启动时准备好侦听 WebSocket 连接。 测试连接的最简单方法是使用 Gremlin Console。

按照第 7.1.1.1节“连接到Gremlin Server”中的说明验证 Gremlin 服务器是否正常工作。

重要:您应该了解的一点是,在使用JanusGraph Server时,Gremlin控制台是从JanusGraph发行版下面启动的,当遵循此处针对独立Gremlin服务器的测试说明时,Gremlin控制台是从TinkerPop发行版下启动的。

GryoMapper mapper = GryoMapper.build().addRegistry(JanusGraphIoRegistry.INSTANCE).create();
Cluster cluster = Cluster.build().serializer(new GryoMessageSerializerV1d0(mapper)).create();
Client client = cluster.connect();
client.submit("g.V()").all().get();

通过将 JanusGraphIoRegistry 添加到 org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0,驱动程序将知道如何正确反序列化 JanusGraph 返回的自定义数据类型。

7.7 扩展 JanusGraph 服务器

通过实现它提供的接口,可以通过其他通信方式扩展 Gremlin Server,并将其与 JanusGraph 结合使用。 请参阅相应的 TinkerPop 文档中的更多详细信息。


翻译自官方文档原文地址:Chapter 7. JanusGraph Server

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论