4 ノードの Elasticsearch クラスターがあります。SQL からのデータでクラスターを満たすように設計された .net コンソール アプリケーションがあります。レコードが追加 (または削除) される割合をかなり低く抑えている限り、すべてが正常に機能します。最終的にスレッドの数を増やすと、コンソール アプリからタイムアウト エラーが表示されます。クラスターには合計 48 個のコアがあり、レコードのインデックス作成にかかる平均時間は約 0.1 秒です。
毎秒約 7000 件のレコード (ドキュメント) を処理することができました。リソースが少ないことを示すelasticsearch.netから例外がスローされることはありません。インデックス作成キューが過負荷になっていることはありません。サーバーの CPU 使用率が約 10% を超えることはありません。問題はクラスターや構成ではなく、ネスト接続にあるようです。接続用のコードは次のとおりです。
//set up the es client
Uri node = new Uri(ConfigurationManager.AppSettings["ESConnectionString"]);
var connectionPool = new SniffingConnectionPool(new[] { node });
ConnectionSettings settings = new ConnectionSettings(connectionPool);
settings.SetDefaultPropertyNameInferrer(p => p); //ditch the camelcase
settings.SniffOnConnectionFault(true);
settings.SniffOnStartup(true);
settings.SniffLifeSpan(TimeSpan.FromMinutes(1));
settings.SetPingTimeout(3000);
settings.SetTimeout(5000);
settings.MaximumRetries(5);
//settings.SetMaximumAsyncConnections(20);
settings.SetDefaultIndex("dummyindex");
settings.SetBasicAuthentication(ConfigurationManager.AppSettings["ESUser"], ConfigurationManager.AppSettings["ESPass"]);
ElasticClient client = new ElasticClient(settings);
http.basic 認証を使用してクラスターをセットアップしましたが、オンとオフを切り替えて試してみましたが、違いはありません。ES ノードからの関連設定の一部を次に示します。
discovery.zen.minimum_master_nodes: 2
discovery.zen.fd.ping_timeout: 30s
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["CACHE01","CACHE02","CACHE03","CACHE04"]
cluster.routing.allocation.node_concurrent_recoveries: 5
indices.recovery.max_bytes_per_sec: 50mb
http.basic.enabled: true
http.basic.user: "admin"
http.basic.password: "XXXXXXX"
この時点で、問題が .Net クライアントにあるのか、それともサーバーにあるのかわかりません。すべてがクライアントを指していますが、次に何を試すべきか途方に暮れています。私は基本的に SQL サーバーから変更をレプリケートしているだけなので、BulkAPI を使用できるとは思いません。同期を保つために、変更を受信したらすぐに実行します。新しいドキュメントを挿入するときは、更新するときよりもはるかに速いペースで作業できるようです。私は更新ドキュメントを読みましたが、完全な更新よりも部分的な更新の方が優れているように見えますが、すべての更新で発生するように見える get-update-delete-reindex 全体があります。
es docs によると、スレッドプールやパフォーマンス設定を微調整することは想定されていません。いずれにせよ、私はそれらの限界に達しているとは思いません。ES エラー ログも問題を示していません。
接続エラーを追跡するために私ができることについて誰かアドバイスがありますか?
更新:これは実際のエラーです:
エラー: 予期しない結果 (SaveToES)。Elasticsearch.Net.Exceptions.MaxRetryException: クラスター内の既知のノードをスニッフィングすると、独自の maxretry 例外が発生しました ---> Elasticsearch.Net.Exceptions.SniffException: クラスター内の既知のノードをスニッフィングすると、独自の maxretry 例外が発生しました ---> Elasticsearch.Net.Exceptions.MaxRetryException: 再試行タイムアウト 00:00:05 は、1 回再試行した後にヒットしました: 'GET _nodes/_all/clear?timeout=3000'. InnerException: WebException、InnerMessage: 操作がタイムアウトしました、InnerStackTrace: System.Net.HttpWebRequest.GetResponse() at Elasticsearch.Net.Connection.HttpConnection.DoSynchronousRequest(HttpWebRequest リクエスト、Byte[] データ、IRequestConfiguration requestSpecificConfig) InnerException: WebException、 InnerMessage: 操作がタイムアウトしました。InnerStackTrace: System.Net で。Elasticsearch.Net.Connection.HttpConnection.DoSynchronousRequest(HttpWebRequest リクエスト、Byte[] データ、IRequestConfiguration requestSpecificConfig) の HttpWebRequest.GetResponse() ---> System.AggregateException: 1 つ以上のエラーが発生しました。---> System.Net.WebException: Elasticsearch.Net.Connection.HttpConnection.DoSynchronousRequest(HttpWebRequest request, Byte[] data, IRequestConfiguration requestSpecificConfig) の System.Net.HttpWebRequest.GetResponse() で操作がタイムアウトしました ---内部例外スタック トレースの終了 --- --- 内部例外スタック トレースの終了 --- Elasticsearch.Net.Connection.RequestHandlers.RequestHandlerBase.ThrowMaxRetryExceptionWhenNeeded[T](TransportRequestState で) Byte[] data, IRequestConfiguration requestSpecificConfig) ---> System.AggregateException: 1 つ以上のエラーが発生しました。---> System.Net.WebException: Elasticsearch.Net.Connection.HttpConnection.DoSynchronousRequest(HttpWebRequest request, Byte[] data, IRequestConfiguration requestSpecificConfig) の System.Net.HttpWebRequest.GetResponse() で操作がタイムアウトしました ---内部例外スタック トレースの終了 --- --- 内部例外スタック トレースの終了 --- Elasticsearch.Net.Connection.RequestHandlers.RequestHandlerBase.ThrowMaxRetryExceptionWhenNeeded[T](TransportRequestState で) Byte[] data, IRequestConfiguration requestSpecificConfig) ---> System.AggregateException: 1 つ以上のエラーが発生しました。---> System.Net.WebException: Elasticsearch.Net.Connection.HttpConnection.DoSynchronousRequest(HttpWebRequest request, Byte[] data, IRequestConfiguration requestSpecificConfig) の System.Net.HttpWebRequest.GetResponse() で操作がタイムアウトしました ---内部例外スタック トレースの終了 --- --- 内部例外スタック トレースの終了 --- Elasticsearch.Net.Connection.RequestHandlers.RequestHandlerBase.ThrowMaxRetryExceptionWhenNeeded[T](TransportRequestState で)
1 requestState, Int32 maxRetries) at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.RetryRequest[T](TransportRequestState
1 requestState) で Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.DoRequest[T](TransportRequestState1 requestState) at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.RetryRequest[T](TransportRequestState
) 1 requestState) で Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.DoRequest[T](TransportRequestState)1 requestState) at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.Request[T](TransportRequestState
1 requestState, Object data) at Elasticsearch.Net.Connection.Transport.Elasticsearch.Net.Connection.ITransportDelegator.Sniff(ITransportRequestState ownerState) --- 内部例外スタック トレースの終了 --- --- 内部例外スタック トレースの終了 - -- Elasticsearch.Net.Connection.Transport.Elasticsearch.Net.Connection.ITransportDelegator.Sniff(ITransportRequestState ownerState) で Elasticsearch.Net.Connection.Transport.Elasticsearch.Net.Connection.ITransportDelegator.SniffClusterState(ITransportRequestState requestState) で Elasticsearch.Net .Connection.Transport.Elasticsearch.Net.Connection.ITransportDelegator.SniffOnConnectionFailure(ITransportRequestState requestState) で Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.RetryRequest[T](TransportRequestState1 requestState) at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.DoRequest[T](TransportRequestState
1 requestState) で Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.Request[T](TransportRequestState1 requestState, Object data) at Elasticsearch.Net.Connection.Transport.DoRequest[T](String method, String path, Object data, IRequestParameters requestParameters) at Elasticsearch.Net.ElasticsearchClient.DoRequest[T](String method, String path, Object data, IRequestParameters requestParameters) at Elasticsearch.Net.ElasticsearchClient.IndicesCreatePost[T](String index, Object body, Func
2 requestParameters) で Nest.RawDispatch.IndicesCreateDispatch[T](ElasticsearchPathInfo1 pathInfo, Object body) at Nest.ElasticClient.<CreateIndex>b__281_0(ElasticsearchPathInfo
1 p, ICreateIndexRequest d) で Nest.ElasticClient.Nest.IHighLevelToLowLevelDispatcher.Dispatch [D、Q、R](D 記述子、Func3 dispatch) at Nest.ElasticClient.CreateIndex(Func
2 createIndexSelector) DCSCache.esvRepository.CreateIndex(String IndexName、String IndexVersion) at DCSCache.esvRepository.Save(esv ItemToSave、String IndexName、String IndexVersion)