1

저는 DSE Enterprise의 최신 버전을 가지고 놀고 있습니다. 그래프 기능에 관심이 있습니다. 현재 Titan에서 DSE Graph에 영감을 준 오픈 소스 그래프 데이터베이스를 실행하는 프로젝트가 하나 있습니다. Titan에는 많은 관리 및 작동 기능이 없기 때문에 DSE Graph를 대체 데이터베이스로 평가하려고합니다.그래프 쿼리를 실행할 때 nodejs 드라이버에서 dse 그래프 연결 시간 초과가 발생했습니다.

nodejs 드라이버를 사용하여 datastax 클러스터에서 그래프 쿼리를 실행하는 동안 나는 이상한 행동을 가지고

내 문제는 다음과 같다. 쿼리 (I 추가 또는 정점을 삭제할 수 있습니다) 노력하고 있습니다 만, 클라이언트 측에서 (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 스튜디오, 내 쿼리가 작동합니다.

'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','[email protected]');").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); 
    }); 
}; 

이 문제가 내 클러스터 구성에있을 수 있습니다 : 여기

코드는 DSE 그래프를 호출하는 데 사용됩니다 ... 새로 추가 된 정점을 볼 수 있습니까? 1 개 노드
  • 을 함께

    • 하나의 클러스터
      • 3 데이터 센터의 그래프에 대한
      • 1 데이터 센터, 2 개 노드 검색
      • 1 데이터 센터
      • 과 : 여기

        내 토폴로지 분석을위한 1 데이터 센터, 1 노드 포함

    모든 설정은 기본값입니다. OpsCenter를 통해 클러스터를 설치했으며 모든 노드는 ec2 인스턴스 (m4.xlarge)입니다.

    쿼리가 작동하는 이유는 모르겠지만 성공 콜백에 이상한 메시지가 표시됩니까? 각 쿼리가 실행 된 후

    감사합니다, stated in the docs으로

  • 답변

    0

    Toufic 자이드, 당신은 종료를 호출하지 않아야합니다.

    일반적으로 응용 프로그램 당 하나의 Client 인스턴스를 사용해야합니다. 응용 프로그램 내의 모듈간에 해당 인스턴스를 공유해야합니다.

    응용 프로그램을 종료 할 때 응용 프로그램의 평생 동안 한 번만 client.shutdown()으로 전화해야합니다. 내가 그 동안 로그에 발견

    client.on ('로그인'을 console.log)

    : 호르헤 도움을

    +0

    네가 맞아.하지만 셧다운 없이도이 오류 메시지가 난다. –

    +0

    ''log'' 이벤트를 듣고 무슨 일이 일어나는지 볼 수 있습니다 :'client.on ('log', console.log)' – jorgebg

    +0

    위대한 팁 호르헤! 고맙습니다. 문제 해결에 도움이되었습니다. 나는 아래의 질문에 답할 것이다. –

    0

    덕분에, 나는 드라이버가 수신 한 모든 이벤트를 기록하려면이 줄을 추가 내 클라이언트가 내 VPC 외부에 있기 때문에 내 EC2 서버의 공개 주소를 호출 했으므로 노드는 이들 사이의 개인 인터페이스를 사용하여 통신하려고했습니다.그리고 공개 주소와 개인 주소가 섞여서 문제가 발생했습니다.

    내가 한 일은이 문제를 해결했지만 올바른 대답인지 여부를 모르겠다.

    각 노드에서 cassandra.yaml 파일을 수정하고 broadcast_rpc_address를 각 인스턴스의 공용 주소로 설정했습니다.

    이제 내 쿼리가 작동합니다.

    남은 질문은 다음과 같습니다. Cassandra를 사용하여 공개 IP와 개인 IP를 혼합하여 처리하는 더 좋은 방법이 있습니까?

    broadcast_rpc_address를 EC2 인스턴스의 공용 IP로 설정하여 잘못된 작업을하고 있습니까?

    +0

    마지막 질문의 상태에 대한 간단한 설명 : 나는 cassandra.yaml 구성을 인스턴스의 개인 주소로 되돌 렸습니다. aws lambda 함수를 통해 외부에서 이러한 인스턴스에 연결합니다. 로컬 테스트를 수행하기 위해 내 AWS VPC 내에 VPN을 구축 했으므로 개발 데스크톱이 방화벽 규칙과 관련한 문제없이 동일한 네트워크의 카산드라 인스턴스에 연결할 수 있습니다. 그래서 나는 두 세계에서 최고입니다. –