1

我正在使用最新版本的 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 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)。

您知道为什么查询有效,但我在成功回调中收到这条奇怪的消息吗?

问候,

图菲奇·扎耶德

4

2 回答 2

0

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

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

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

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

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

现在我的查询正在工作。

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

通过将 broadcast_rpc_address 设置为 EC2 实例的公共 IP,我做错了吗?

于 2017-03-28T22:11:17.850 回答
0

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

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

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

于 2017-03-28T13:20:00.180 回答