【问题标题】:Persistent storage in JanusGraph using Cassandra使用 Cassandra 在 JanusGraph 中进行持久存储
【发布时间】:2020-06-22 06:21:10
【问题描述】:

我正在使用 JanusGraph 和 Cassandra 后端,但我有一些疑问。

我的机器上运行了一个 Cassandra 服务器(使用 Docker),在我的 API 中我有以下代码:

 GraphTraversalSource g = JanusGraphFactory.build()
        .set("storage.backend", "cql")
        .set("storage.hostname", "localhost")
        .open()
        .traversal();

然后,通过我的 API,我使用 Gremlin 保存和获取数据。它工作正常,我看到数据保存在 Cassandra 数据库中。

当我重新启动 API 并尝试获取数据时,问题就出现了。数据仍存储在 Cassandra 中,但 JanusGraph 查询返回空。为什么?

我是否需要将后端存储数据加载到内存或类似的东西中?我正在尝试了解它是如何工作的。

编辑

这是我添加项目的方式:

 Vertex vertex = g.addV("User")
          .property("username", username)
          .property("email", email)
          .next();

并获取所有内容:

List<Vertex> all = g.V().toList()

【问题讨论】:

    标签: cassandra janusgraph


    【解决方案1】:

    提交您的交易

    您现在正在使用 JanusGraph embedded as a library in your application,这使您可以访问 JanusGraph 的完整 API。这意味着您必须自己管理transactions,这还包括提交事务以保持对图表的修改的必要性。

    您可以通过调用简单地做到这一点:

    g.tx().commit();
    

    在您使用修改迭代遍历之后(在您的情况下为 addV() 遍历)。

    没有提交,更改仅在您的事务中本地可用。当您重新启动 Docker 容器时,所有数据都将丢失,因为您尚未提交。

    推荐的方法:通过远程连接

    如果您没有充分的理由将 JanusGraph 作为库嵌入到您的 JVM 应用程序中,那么建议将其独立部署为 JanusGraph 服务器,您可以将遍历发送到该服务器以供执行。 这样做的好处是您可以独立于您的应用程序扩展 JanusGraph,并且您可以从非 JVM 语言中使用它。

    JanusGraph 服务器还通过在其自己的事务中执行每个遍历来透明地为您管理事务。如果遍历成功,则提交结果,如果发生异常也会自动回滚。

    JanusGraph 文档包含一个关于 how to connect to JanusGraph Server from Java 的部分,但重要的部分是这段代码,用于创建连接到您的 JanusGraph 服务器的图形遍历源 g

    Graph graph = EmptyGraph.instance();
    GraphTraversalSource g = graph.traversal().withRemote("conf/remote-graph.properties");
    

    您当然也可以将 JanusGraph Server 作为 Docker 容器启动:

    docker run --rm janusgraph/janusgraph:latest
    

    有关 JanusGraph Docker 映像以及如何将其配置为连接到 Cassandra 后端的更多信息,请访问 here


    考虑到我第一个版本的答案的 cmets,下面的部分不再与这个问题直接相关。我仍然把它留在这里,以防其他人有类似的问题,而这实际上可能是原因。

    使用 Docker 容器实现持久存储

    JanusGraph 将数据存储在您的存储后端,在您的情况下是 Cassandra。这意味着您必须确保 Cassandra 保留数据。如果您在 Docker 容器中启动 Cassandra,那么您必须在 Cassandra 存储数据的位置上挂载一个卷,以便在容器重新启动后将其持久保存。 否则,一旦停止 Cassandra 容器,数据就会丢失。

    为此,您可以像这样启动 Cassandra 容器:

    docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra
    

    其中/my/own/datadir 是您希望存储 Cassandra 数据的主机系统目录。 这在the docs of the official Cassandra Docker image 中的警告 > 在哪里存储数据 中进行了解释。

    【讨论】:

    • 是的,当然。我已经运行了带有卷的 Cassandra 容器。但是当我重新启动我的服务器(不是 Cassandra 容器,而是我的 API)并执行一些 Gremlin 查询时,没有返回数据;不过,它存在于 Cassandra 数据库中。
    • 您能否分享一下您如何添加数据的示例代码?
    • 我更新了我的答案。希望它现在能真正解决您的问题。
    • 嗨,我可以以某种方式启动transaction 并且所有相关的遍历都将计为一次transaction,如果transaction 中的一次遍历失败,则所有遍历都会发生回滚
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2020-09-22
    • 2016-09-12
    • 2021-04-18
    • 1970-01-01
    • 2016-10-21
    • 2016-11-22
    • 2012-07-30
    相关资源
    最近更新 更多