2016-03-07 16 views
6

私はシールドとトランスポートJavaクライアントを使用して弾性のクラウド(以前は見つかりました)を使用しています。 ESと通信するアプリは英雄で動作します。 1つのノードを持つステージング環境でストレステストを実行しています。マスターノードからランダムに切断されましたNoNodeAvailableException Elastic Cloud/Foundを使用

{ 
    "cluster_name": ..., 
    "status": "yellow", 
    "timed_out": false, 
    "number_of_nodes": 1, 
    "number_of_data_nodes": 1, 
    "active_primary_shards": 19, 
    "active_shards": 19, 
    "relocating_shards": 0, 
    "initializing_shards": 0, 
    "unassigned_shards": 7, 
    "delayed_unassigned_shards": 0, 
    "number_of_pending_tasks": 0, 
    "number_of_in_flight_fetch": 0 
} 

A開始はすべて完璧に機能します。しかし、しばらくして(3〜4分後)、私はいくつかのエラーを出す。私はトレースするログレベルを設定して、これらは私がなってきたエラーがある(私は無関係です...すべてに置き換えられました。

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes were available: [[...][...][...][inet[...]]{logical_availability_zone=..., availability_zone=..., max_local_storage_nodes=1, region=..., master=true}] 
    at org.elasticsearch.client.transport.TransportClientNodesService$RetryListener.onFailure(TransportClientNodesService.java:242) 
    at org.elasticsearch.action.TransportActionNodeProxy$1.handleException(TransportActionNodeProxy.java:78) 
    at org.elasticsearch.transport.TransportService$3.run(TransportService.java:290) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.elasticsearch.transport.SendRequestTransportException: [...][inet[...]][indices:data/read/search] 
    at org.elasticsearch.transport.TransportService.sendRequest(TransportService.java:286) 
    at org.elasticsearch.shield.transport.ShieldClientTransportService.sendRequest(ShieldClientTransportService.java:41) 
    at org.elasticsearch.action.TransportActionNodeProxy.execute(TransportActionNodeProxy.java:57) 
    at org.elasticsearch.client.transport.support.InternalTransportClient$1.doWithNode(InternalTransportClient.java:109) 
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:205) 
    at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106) 
    at org.elasticsearch.client.support.AbstractClient.search(AbstractClient.java:334) 
    at org.elasticsearch.client.transport.TransportClient.search(TransportClient.java:416) 
    at org.elasticsearch.action.search.SearchRequestBuilder.doExecute(SearchRequestBuilder.java:1122) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:91) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:65) 
    ... 
Caused by: org.elasticsearch.transport.NodeNotConnectedException: [...][inet[...]] Node not connected 
    at org.elasticsearch.transport.netty.NettyTransport.nodeChannel(NettyTransport.java:936) 
    at org.elasticsearch.transport.netty.NettyTransport.sendRequest(NettyTransport.java:629) 
    at org.elasticsearch.transport.TransportService.sendRequest(TransportService.java:276) 
    ... 

これらは私の特性

settings = ImmutableSettings.settingsBuilder() 
     .put("client.transport.nodes_sampler_interval", "5s") //Tried it with 30s, same outcome 
     .put("client.transport.ping_timeout", "30s") 
     .put("cluster.name", clusterName) 
     .put("action.bulk.compress", false) 
     .put("shield.transport.ssl", true) 
     .put("request.headers.X-Found-Cluster", clusterName) 
     .put("shield.user", user + ":" + password) 
     .put("transport.ping_schedule", "1s") //Tried with 5s, same outcome 
     .build(); 

Iですまた、すべてのクエリに設定された」VEの私が作る:私は、対応する(同じバージョン)クライアントとElasticSearch 1.7.2Shield 1.3.2を使用してい

max_query_response_size=100000 
timeout_seconds=30 

、私のマシン上の- ノード上のJava 1.8.0_40

ストレステストなしで同じエラーが発生しましたが、エラーが非常にランダムに発生したので、私は再現したいと思いました。そのため、私はこれを1つのノードで実行しています。

私はこのhttp://blog.trifork.com/2015/04/08/dealing-with-nodenotavailableexceptions-in-elasticsearch/を読んだ後

2016-03-07 23:35:52,177 DEBUG [elasticsearch[Vermin][transport_client_worker][T#7]{New I/O worker #16}] ssl.SslHandler (NettyInternalESLogger.java:debug(63)) - Swallowing an exception raised while writing non-app data 
java.nio.channels.ClosedChannelException 
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:433) 
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.close(AbstractNioWorker.java:373) 
    at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.read(NioWorker.java:93) 
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) 
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) 
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 
    at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
    at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
    at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 

ホットスレッド

0.0% (111.6micros out of 500ms) cpu usage by thread 'elasticsearch[...][transport_client_timer][T#1]{Hashed wheel timer #1}' 
10/10 snapshots sharing following 5 elements 
    java.lang.Thread.sleep(Native Method) 
    org.elasticsearch.common.netty.util.HashedWheelTimer$Worker.waitForNextTick(HashedWheelTimer.java:445) 
    org.elasticsearch.common.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:364) 
    org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
    java.lang.Thread.run(Thread.java:745) 

私のログに別のエラーを見つけた私は、全体の通信がどのように機能するか少し良く理解するために来ました。私はまだこれをテストしていないが、問題がそこにあると信じている。問題はクローズドクエリー接続であることを確認しても、どうしたらいいですか?設定をそのまま保ち、再接続するだけですか? keepAliveを無効にしますか?はいの場合、私は他の何かを心配する必要がありますか?

+0

ストレステストは何をしますか? –

+0

また、エラーが発生してストレステストを行った**完全な**ログファイルがありますか? –

+0

@AndreiStefanは、保存、削除、ほとんどの検索を行います。呼び出しの大部分は、検索、一部の一括保存、一部の一括削除、一括削除です。完全なログには機密データが含まれており、共有する自由はありません。 – alkis

答えて

3

このリンクを引用: https://discuss.elastic.co/t/nonodeavailableexception-with-java-transport-client/37702アプリケーションが起動時にIPアドレスを解決することができ

Konrad Beiskeで。 ELBは、いつでもipを変更できます。最高の信頼性のために アプリケーションはELBのすべてのIPをクライアントに追加し、 は定期的にDNSサービスの変更をチェックします。

ELBの接続タイムアウトは5分です。

あなたはそれを修正するのに役立つはずです後:それは は、リクエストごとに新しい接続ハンドシェイクを意味し、これは あなたの応答時間を傷つけるようリクエストごとに新しいのtransportClientを作成する

は理想的ではありません。 を好む場合はTransportClientsのプールを持つことができますが、 クライアントはスレッドセーフであるため、おそらく不必要なオーバーヘッドになります。

がDNSサービスの変更を定期的にチェックし、新しい IPを既存のトランスポートクライアントに追加する小さなシングルトンサービスを作成することをお勧めします。理論的には、 として、 トランスポートクライアントが重複アドレスを破棄し、古いアドレス がもはや到達可能にならないため、チェックするたびにすべてのIPが検出されたことを追加するだけです。

+0

何らかの理由で私は賞金を授与する前に23時間待つ必要があります。私はそれを倍増しました。発見されたサポートさえも、これがクライアントによって自動的に処理されたと主張していたので、これは見つけるのが非常に難しかった。 – alkis

+0

不満を感じていますが、文句なしです。 ありがとうございます。お役に立てて嬉しいです –

関連する問題