尝试执行图形查询时,来自nodejs驱动程序的dse图形连接超时

时间:2017-03-28 11:06:30

标签: datastax datastax-enterprise datastax-enterprise-graph

我正在玩最新版本的DSE Enterprise。我对图表功能很感兴趣。我目前在Titan上运行了一个启动DSE Graph的开源图形数据库项目,并且我试图将DSE Graph评估为替换数据库,因为Titan缺少许多管理和操作功能。

我的问题如下:

尝试使用nodejs驱动程序在数据集群上执行图查询时,我有一种奇怪的行为。查询正在运行(我可以添加或删除顶点),但在客户端(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 studio时,我的查询正在运行。我可以看到新添加的顶点...

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

'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)。

你知道为什么查询有效,但我在成功回调中得到了这个奇怪的信息吗?

此致

Toufic Zayed

2 个答案:

答案 0 :(得分:0)

作为stated in the docs,您不应在执行每个查询后调用shutdown。

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

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

答案 1 :(得分:0)

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

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

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

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

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

现在我的查询正在运行。

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

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