Тайм-аут подключения графа dse от драйвера nodejs при попытке выполнить запросы графа

Играю с последней версией DSE Enterprise. Меня интересуют особенности графика. В настоящее время у меня есть один проект, работающий на Titan, графической базе данных с открытым исходным кодом, которая вдохновила DSE Graph, и я пытаюсь оценить DSE Graph как заменяющую базу данных, поскольку в Titan отсутствуют многие функции администрирования и работы.

Моя проблема в следующем:

У меня странное поведение при попытке выполнить графические запросы в кластере datastax с использованием драйвера 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, мои запросы работают. Я вижу только что добавленные вершины ...

Вот код, используемый для вызова графика 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);
  });
};

Может проблема в конфигурации моего кластера?

Вот моя топология:

  • One cluster
    • 3 datacenters
    • 1 центр обработки данных для графа с 2 узлами
    • 1 датацентр для поиска, с 1 узлом
    • 1 датацентр для аналитики с 1 узлом

Все настройки по умолчанию. Я установил кластер через OpsCenter, и все мои узлы являются экземплярами ec2 (m4.xlarge).

Вы хоть представляете, почему запросы работают, но я получаю это странное сообщение в обратном вызове успеха?

С уважением,

Туфик Зайед


person Toufic Zayed    schedule 28.03.2017    source источник


Ответы (2)


Как указано в документации, вы не должны вызывать завершение работы после выполнения каждого запроса.

Обычно вы должны использовать один Client экземпляр для каждого приложения. Вы должны поделиться этим экземпляром между модулями в вашем приложении.

Вы должны вызывать client.shutdown() только один раз за время существования вашего приложения, обычно при завершении работы приложения.

person jorgebg    schedule 28.03.2017
comment
Вы правы, но даже без вызова выключения я просто получаю это сообщение об ошибке. - person Toufic Zayed; 28.03.2017
comment
Вы можете прослушать 'log' события, чтобы узнать, что происходит: client.on('log', console.log) - person jorgebg; 28.03.2017
comment
Отличные советы Хорхе! Спасибо, это помогло мне решить проблему. Я отвечу на вопрос ниже. - person Toufic Zayed; 29.03.2017

Благодаря помощи Хорхе я добавил эту строку для регистрации всех событий, полученных драйвером:

client.on ('журнал', console.log)

В журналах я заметил, что пока я звонил на публичный адрес своего сервера EC2 (поскольку мой клиент находится за пределами моего VPC), узел пытался общаться, используя свой частный интерфейс между ними. И сочетание публичного и частного адресов вызвало проблему.

Вот что я сделал, это решило проблему, но я не знаю, правильный ли это ответ.

Я изменил файл cassandra.yaml на каждом узле и установил broadcast_rpc_address на публичный адрес каждого экземпляра.

Теперь мои запросы работают.

Единственный оставшийся вопрос: есть ли лучший способ справиться с сочетанием публичного и частного IP с помощью Cassandra?

Я что-то делаю неправильно, установив broadcast_rpc_address на общедоступный IP-адрес экземпляра EC2?

person Toufic Zayed    schedule 28.03.2017
comment
Быстрый комментарий к статусу последнего вопроса: я вернул конфигурацию cassandra.yaml на частный адрес экземпляров. Я подключаюсь к этим экземплярам извне через лямбда-функцию aws. Для локального тестирования я только что построил VPN внутри своего AWS VPC, чтобы мой рабочий стол для разработки мог подключаться к моим экземплярам cassandra в той же сети без проблем с правилами брандмауэра. Так что у меня есть лучшее из обоих миров. - person Toufic Zayed; 31.03.2017