使用 Cassandra 在 JanusGraph 中进行持久存储
Persistent storage in JanusGraph using Cassandra
我正在使用 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 查询 returns 为空。为什么?
我是否需要将后端存储数据加载到内存或类似的东西中?我想了解它是如何工作的。
编辑
这是我添加项目的方式:
Vertex vertex = g.addV("User")
.property("username", username)
.property("email", email)
.next();
并获取全部:
List<Vertex> all = g.V().toList()
提交您的交易
您现在正在 embedded as a library in your application which gives you access to the full API of JanusGraph. This means that you have to manage transactions 自己使用 JanusGraph,这还包括必须提交您的交易以持久保存对图表的修改。
您只需调用即可完成此操作:
g.tx().commit();
在你用修改迭代你的遍历之后(在你的例子中是 addV()
遍历)。
如果没有提交,更改仅在您的事务中本地可用。当您重新启动 Docker 容器时,所有数据都将丢失,因为您尚未提交。
推荐方法:通过远程连接
如果您没有充分的理由将 JanusGraph 作为库嵌入到您的 JVM 应用程序中,那么建议将其独立部署为 JanusGraph 服务器,您可以将遍历发送到该服务器以供执行。
这样做的好处是您可以独立于您的应用程序扩展 JanusGraph,并且您可以通过非 JVM 语言使用它。
JanusGraph Server 还通过在其自己的事务中执行每个遍历来透明地为您管理事务。如果遍历成功,则提交结果,如果出现异常,也会自动回滚。
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。
鉴于对我的第一版答案的评论,下面的部分与这个问题不再直接相关。我仍然把它留在这里,以防其他人有类似的问题,而这实际上可能是原因。
具有 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 中进行了解释
我正在使用 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 查询 returns 为空。为什么?
我是否需要将后端存储数据加载到内存或类似的东西中?我想了解它是如何工作的。
编辑
这是我添加项目的方式:
Vertex vertex = g.addV("User")
.property("username", username)
.property("email", email)
.next();
并获取全部:
List<Vertex> all = g.V().toList()
提交您的交易
您现在正在 embedded as a library in your application which gives you access to the full API of JanusGraph. This means that you have to manage transactions 自己使用 JanusGraph,这还包括必须提交您的交易以持久保存对图表的修改。
您只需调用即可完成此操作:
g.tx().commit();
在你用修改迭代你的遍历之后(在你的例子中是 addV()
遍历)。
如果没有提交,更改仅在您的事务中本地可用。当您重新启动 Docker 容器时,所有数据都将丢失,因为您尚未提交。
推荐方法:通过远程连接
如果您没有充分的理由将 JanusGraph 作为库嵌入到您的 JVM 应用程序中,那么建议将其独立部署为 JanusGraph 服务器,您可以将遍历发送到该服务器以供执行。 这样做的好处是您可以独立于您的应用程序扩展 JanusGraph,并且您可以通过非 JVM 语言使用它。
JanusGraph Server 还通过在其自己的事务中执行每个遍历来透明地为您管理事务。如果遍历成功,则提交结果,如果出现异常,也会自动回滚。
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。
鉴于对我的第一版答案的评论,下面的部分与这个问题不再直接相关。我仍然把它留在这里,以防其他人有类似的问题,而这实际上可能是原因。
具有 Docker 个容器的持久存储
JanusGraph 将数据存储在您的存储后端中,在您的情况下是 Cassandra。这意味着您必须确保 Cassandra 持久保存数据。如果您在 Docker 容器中启动 Cassandra,那么您必须在 Cassandra 存储数据的位置挂载一个卷,以在容器重启后持久保存数据。 否则,一旦停止 Cassandra 容器,数据就会丢失。
为此,您可以像这样启动 Cassandra 容器:
docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra
其中 /my/own/datadir
是您希望存储 Cassandra 数据的主机系统目录。
这在 注意事项 > 数据存储位置.