2017-10-13 88 views
1

我已經建立了一個由三個彈性搜索節點組成的集羣,所有符合條件的master都是最低要求的2。我已經配置了一個客戶端,然後使用下面的代碼使用帶有靜態連接池的低級客戶端進行批量上傳。如何處理使用低級別.net Elasticsearch客戶端的羣集節點的突然丟失?

我試圖測試的是場景的實時故障,即有三個節點可用的啓動客戶端,然後隨機丟棄一個(關閉虛擬機),但保持兩個。但是,我沒有看到我期望的行爲,它不斷嘗試死亡節點。實際上,它在移動到下一個節點之前似乎需要大約六十秒。

我所期望的是做一個失敗的嘗試,並將該節點標記爲可能已經死亡,但至少移動到下一個節點。奇怪的是,如果我在我的列表中只有三個節點中的兩個節點啓動我的應用程序,或者如果我在測試期間停止彈性搜索服務,而不是斷電,則會出現這種情況。

是否有正確的方法來處理這種情況,並儘快將其移動到下一個可用節點?或者在嘗試重新發布之前,我需要在我的代碼中延期多達六十秒?

var nodes = new[] 
     { 
      new Node(new Uri("http://172.16.2.10:9200")), 
      new Node(new Uri("http://172.16.2.11:9200")), 
      new Node(new Uri("http://172.16.2.12:9200")) 
     }; 

     var connectionPool = new StaticConnectionPool(nodes); 

     var settings = new ConnectionConfiguration(connectionPool) 
      .PingTimeout(TimeSpan.FromSeconds(10)) 
      .RequestTimeout(TimeSpan.FromSeconds(20)) 
      .ThrowExceptions() 
      .MaximumRetries(3); 

     _lowLevelClient = new ElasticLowLevelClient(settings); 

然後我已經包裹在一個嘗試捕捉,我再試最多的前三次我認爲這是一個失敗的嘗試,並恢復到一個錯誤的策略下。

ElasticsearchResponse<Stream> indexResponse = _lowLevelClient.Bulk<Stream>(data); 

任何投入表示讚賞,

謝謝。

+0

您是否試圖用SniffingConnectionPool替換StaticConnectionPool(一個嗅探連接池允許自己在運行時重新調用)?請參考:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/connection-pooling.html –

回答

0

客戶端的測試包括故障轉移方案的測試,其中the API conventions documentation is generated。具體來說,看一看的retryfailover文檔

隨着StaticConnectionPool,對此可以提出的要求是靜態的,永遠不會刷新節點,以反映可能加入和離開集羣,它們將被標記的節點爲如果不良反應返回,並將於連接設置取出旋轉執行的請求的配置時間,控制由DeadTimeoutMaxDeadTimeout

響應的審計追蹤應提供給定請求發生的事件的時間表,這是response.DebugInformation最容易看到的事件。作爲Tests項目一部分的Virtual Clustering測試工具(an example)可能有助於確定您所處行爲的正確設置。

+0

謝謝,我玩過這些超時設置,默認回到60秒超時。除了擁有我自己的try catch/retry邏輯之外,我可以讓我的請求最終在突然的節點丟失上成功。但是,我有些感覺到背景中有什麼東西可以確定節點已經死亡,而不是失敗的發佈嘗試,因爲時間與我無關。我注意到超時將在60秒後發生,並且成功發佈將在我重試約20秒後發生。也許在節點允許之前必須進行一些談判? – wtarr

相關問題