尝试执行图形查询时来自 NodeJS 驱动程序的 DSE 图形连接超时



我正在使用最新版本的DSE Enterprise。我对图形功能感兴趣。我目前有一个项目在 Titan 上运行,开源图形数据库启发了 DSE Graph,我正在尝试评估 DSE Graph 作为替代数据库,因为 Titan 缺少许多管理和操作功能。

我的问题如下:

在尝试使用 nodejs 驱动程序在 datastax 集群上执行图形查询时,我有一个奇怪的行为。查询正在工作(我可以添加或删除顶点),但在客户端(nodejs 驱动程序)上,我总是在 5 到 7 秒后收到连接超时错误,如下所示:

{
"statusCode": 200,
"body": {
"info": {
"queriedHost": "xx.xx.xx.xx:9042",
"triedHosts": {
"xx.xx.xx.xx:9042": {
"message": "Connection timeout",
"info": "Cassandra Driver Error"
}
},
"achievedConsistency": 10
},
"length": 1,
"pageState": null
}
}

当我查看datastax工作室时,我的查询正在起作用。我可以看到新添加的顶点...

以下是用于调用 dse 图的代码:

'use strict';
const dse = require('dse-driver');
const dseGraph = require('dse-graph');
const client = new dse.Client({
contactPoints: ['xx.xx.xx.xx'] ,
protocolOptions: {port: 9042},
authProvider: new     dse.auth.DsePlainTextAuthProvider("xxx","xxx"),
graphOptions: { name: 'test' }
});

module.exports.create = (event, context, callback) => {
let response = {
statusCode: 200
};
client.executeGraph("graph.addVertex(label,'user','email','c@b');").then(function(users) {
response.body=users;
client.shutdown();
callback(null, response);
}).catch(function(err) {    
response.statusCode=400;
response.body=err;
client.shutdown();
callback(null, response);
});
};

可能是问题出在我的群集配置中?

这是我的拓扑:

  • 一个集群
    • 3 个数据中心
    • 图形的 1 个数据中心,具有 2 个节点
    • 1 个
    • 用于搜索的数据中心,具有 1 个节点
    • 1 个
    • 用于分析的数据中心,具有 1 个节点

所有设置都是默认设置。我已经通过OpsCenter安装了集群,我所有的节点都是ec2实例(m4.xlarge)。

您是否知道为什么查询有效,但我在成功回调中收到此奇怪消息?

问候

图菲克·扎耶德

如文档中所述,不应在执行每个查询后调用 shutdown。

通常,您应该为每个应用程序使用一个Client实例。您应该在应用程序中的模块之间共享该实例。

在应用程序的生存期内,只应调用client.shutdown()一次,通常是在关闭应用程序时调用。

感谢Jorge的帮助,我添加了这一行来记录驱动程序收到的所有事件:

client.on('log', console.log)

我在日志中注意到,当我调用 EC2 服务器的公共地址时(因为我的客户端在我的 VPC 之外),节点尝试使用它们之间的私有接口进行通信。公共地址和私人地址的混合导致了这个问题。

这是我所做的,它解决了问题,但我不知道这是否是正确的答案。

我修改了每个节点上的 cassandra.yaml 文件,并将broadcast_rpc_address设置为每个实例的公共地址。

现在我的查询正在工作。

唯一剩下的问题是:有没有更好的方法来处理使用Cassandra的公共和私有IP的混合?

我是否通过将broadcast_rpc_address设置为 EC2 实例的公有 IP 做错了什么?

最新更新