跳至内容

Deployment Scenarios

JanusGraph提供了多种存储和索引后端选择,这使得其部署方式具有极大的灵活性。本章介绍几种可能的部署场景,以帮助应对这种灵活性带来的复杂性。

在讨论不同的部署场景之前,理解JanusGraph本身和后端的作用非常重要。 首先,应用程序仅直接与JanusGraph通信,主要通过发送Gremlin遍历来执行。然后JanusGraph 与配置的后端通信以执行接收到的遍历。当以JanusGraph Server形式使用JanusGraph时, 不存在所谓的JanusGraph服务器。因此应用程序可以连接到任何JanusGraph服务器实例。 它们也可以使用负载均衡器来调度对不同实例的请求。JanusGraph服务器实例本身不直接相互通信, 这使得在需要处理更多遍历时能够轻松扩展它们。

注意

本章展示的场景仅是JanusGraph部署方式的示例。每个部署都需要考虑具体用例和生产需求。

Getting Started Scenario

这个场景是大多数用户在刚开始使用JanusGraph时可能想要选择的场景。它提供了可扩展性和容错性,且所需服务器数量最少。JanusGraph服务器与存储后端实例一起运行,并且可以选择性地在每个服务器上同时运行索引后端实例。

Getting started deployment scenario diagram

这样的设置可以通过简单地添加更多相同类型的服务器或将其中一个组件迁移到专用服务器上来进行扩展。后者描述了一条将部署转变为高级场景的增长路径。

任何可扩展的存储后端都可以在此场景中使用。 但请注意,对于Scylla当它与其他服务共址托管时需要进行一些配置 如此场景所示。当在此场景中需要使用索引后端时,它也需要是可扩展的。

高级场景

高级场景是入门场景的演进版本。 不同于将JanusGraph 服务器实例与存储后端以及可选的索引后端部署在同一服务器上,现在它们被分离到不同的服务器上。将不同组件(JanusGraph Server、 存储/索引后端)部署在不同服务器上的优势在于,它们可以独立进行扩展 和管理。这提供了更高的灵活性,但代价是需要维护更多服务器。

Advanced deployment scenario diagram

由于此场景提供了不同组件的独立可扩展性,因此当然最有意义的是也使用可扩展的后端。

极简场景

也可以将JanusGraph Server与后端服务共同部署在一台服务器上。这对于测试目的尤其具有吸引力,或者例如当JanusGraph仅支持单个应用程序时,该应用程序也可以在同一台服务器上运行。

Minimalist deployment scenario diagram

与之前的场景相反,对于此场景,使用不可扩展的后端最为合理。内存后端可用于测试目的,或使用Berkeley DB用于生产环境,以及Lucene作为可选的索引后端。

嵌入式 JanusGraph

除了从应用程序连接到JanusGraph服务器外,也可以将JanusGraph作为库嵌入基于JVM的应用程序中。虽然这减少了管理和网络开销,但使得无法独立于应用程序扩展JanusGraph。 嵌入式JanusGraph可以作为任何其他场景的变体进行部署。JanusGraph只是从服务器直接移动到应用程序中,因为它现在仅作为库使用,而不是独立服务。您需要将janusgraph-core依赖项引入您的项目,以及所选后端所需的模块。例如, 如果您有一个Maven项目,并且使用Cassandra和Lucene作为后端,您应该在pom.xml中添加以下依赖项:

<dependencies>
    <dependency>
        <groupId>org.janusgraph</groupId>
        <artifactId>janusgraph-core</artifactId>
        <version>${janusgraph.version}</version>
    </dependency>
    <dependency>
        <groupId>org.janusgraph</groupId>
        <artifactId>janusgraph-cql</artifactId>
        <version>${janusgraph.version}</version>
    </dependency>
    <dependency>
        <groupId>org.janusgraph</groupId>
        <artifactId>janusgraph-lucene</artifactId>
        <version>${janusgraph.version}</version>
    </dependency>
</dependencies>

然后你可以在应用程序代码中启动一个JanusGraph实例,类似于你在gremlin控制台中的操作:

import org.janusgraph.core.JanusGraph;
import org.janusgraph.core.JanusGraphFactory;
import org.janusgraph.core.schema.JanusGraphManagement;

public class MyGraphApp {
    public static void main(String[] args) {
        JanusGraph graph = JanusGraphFactory.open("/path/to/your/config/file");
        JanusGraphManagement mgmt = graph.openManagement();
        mgmt.printSchema();
        mgmt.commit();
        graph.close();
    }
}

Gremlin 解析器

JanusGraph server 可以接受纯字符串格式的即席 gremlin 查询,而嵌入式 JanusGraph 则需要您为任何查询编写 Java 代码。您可以在 JanusGraph 之上开发自己的 DSL(领域特定语言),将图查询能力暴露给最终用户。或者,您可以利用内置的 Gremlin 解析器来接收任何纯字符串格式的 gremlin 查询,解析它们并在您的应用程序中使用嵌入式 JanusGraph 执行它们。要利用 gremlin 解析器,请查看graph.script-eval。一旦您开启脚本评估选项,您就可以使用JanusGraph::eval方法来评估 gremlin 查询:

graph.eval(/* gremlin script */ "g.V().count().next()",                 /* commit */ false);
graph.eval(/* gremlin script */ "g.addV().next();g.V().count().next()", /* commit */ true)

如上所示,你可以传入一个单独的gremlin查询或纯字符串格式的gremlin脚本。可选地,你可以在执行后提交或回滚脚本。当你想要防止最终用户更新图时,这很有用。