1

私はDSE Enterpriseの最新バージョンで遊んでいます。私はグラフの機能に興味があります。 TitanにはDSEグラフに触発されたオープンソースのグラフデータベースが1つあり、DSE Graphを代替データベースとして評価しようとしています。Titanには多くの管理機能と操作機能がありません。グラフクエリを実行しようとすると、ノードjsドライバからのdseグラフ接続のタイムアウトが発生する

nodejsドライバを使用してdatastaxクラスタ上のグラフのクエリを実行しようとしているときに、私は奇妙な行動を持っている:

私の問題は次のようです。

{ 
    "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 
    } 
} 

私が見たとき:クエリが、私はこのように、5〜7秒後に、常に接続タイムアウトエラーが発生します(ドライバnodejs)(私は頂点を追加または削除することができます)作業が、クライアント側にあります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つのノード

  • で2つのノード
  • 1検索用データセンターと

    • 1クラスタ
      • 3データセンターグラフの
      • 1データセンターを分析のための1データセンター、1ノード付き

    すべての設定はデフォルトです。私はOpsCenterを介してクラスタをインストールし、すべてのノードはec2インスタンス(m4.xlarge)です。

    なぜクエリが機能しているのか分かりませんが、成功コールバックにこの奇妙なメッセージが表示されますか?

    よろしく、stated in the docsとして

    Touficザイード

  • 答えて

    0

    各クエリが実行された後、あなたがシャットダウンを呼び出すべきではありません。

    通常、アプリケーションごとに1つのClientインスタンスを使用する必要があります。そのインスタンスをアプリケーション内のモジュール間で共有する必要があります。

    通常、アプリケーションを終了するときは、アプリケーションの有効期間内に一度だけclient.shutdown()に電話する必要があります。私はしばらくのログに気づい

    client.on(「ログイン」、にconsole.log)

    :ホルヘ・ヘルプに

    +0

    あなたはそうですが、シャットダウンを使わなくてもこのエラーメッセージが表示されます。 –

    +0

    '' log''イベントを聞いて、何が起こっているのかを知ることができます: 'client.on( 'log'、console.log)' – jorgebg

    +0

    大きなヒントJorge!ありがとう、それは私が問題を解決するのを助けた。私は以下の質問に答えます。 –

    0

    おかげで、私は、ドライバが受信したすべてのイベントをログに記録するには、この行を追加しました私のEC2サーバのパブリックアドレスを(私のクライアントが私のVPCの外にいるので)呼んだところ、ノードはそれらのプライベートインタフェースを使って通信しようとしました。そして、公的な住所と私的な住所の混在が問題を引き起こしました。

    これは私がやったことですが、それは問題を解決しましたが、それが正しい答えかどうかわかりません。

    各ノードでcassandra.yamlファイルを変更し、broadcast_rpc_addressを各インスタンスのパブリックアドレスに設定しました。

    私のクエリは機能しています。

    唯一残っている質問は、Cassandraを使用して公開IPと非公開IPの組み合わせを処理するより良い方法はありますか?

    broadcast_rpc_addressをEC2インスタンスのパブリックIPに設定して何か問題がありますか?

    +0

    最後の質問のステータスに関する簡単なコメント:私はcassandra.yaml設定をインスタンスのプライベートアドレスに戻しました。私は外部からawsラムダ関数を通してこれらのインスタンスに接続します。ローカルテストでは、AWS VPC内にVPNを構築したので、開発デスクトップはファイアウォールルールに関する問題なしに同じネットワーク内の私のcassandraインスタンスに接続できます。だから私は両方の世界のベストがあります。 –

    関連する問題