與Elasticsearch交互的客戶端


1.訪問ES的方式

訪問es的方式有兩種,一種是http方式,還有一種是java客戶端方式。

其中Java客戶端又分為:
1.1.Node client:

節點客戶端實際上是一個集群中的節點(但不保存數據,不能成為主節點)。因為它是一個節點,它知道整個集群狀態(所有節點駐留,分片分布在哪些節點,數據在集群中的具體位置等等),這意味着它可以執行 APIs 而且少了一個網絡躍點。能夠直接轉發請求到對應的節點上。

1.2.Transport Client:

傳輸客戶端作為一種輕量級客戶端,本身不加入集群,只是簡單的發送請求到遠端集群中的節點,作為一個集群和應用程序之間的通信層。它知道 API 並能自動幫你在節點之間輪詢,幫你嗅探集群等等。但它是集群 外部的 ,和 REST 客戶端類似。我們訪問的節點負責收集各節點返回的數據(query fetch merge),最后一起返回給客戶端。

構造transportClient時候,需要指定sniff是否為true。

if (this.settings.getAsBoolean("client.transport.sniff", false)) 
   { this.nodesSampler = new SniffNodesSampler(); } 
else { this.nodesSampler = new SimpleNodeSampler(); } 

 

這里先提一下:節點通信有5種類型:Recovery Bulk Reg State Ping

網絡層  

Elasticsearch 的網絡層抽象很值得借鑒。它抽象出一個 Transport 層,同時兼有client和server功能,server端接收其他節點的連接,client維持和其他節點的連接,承擔了節點之間請求轉發的功能。Elasticsearch 為了避免傳輸流量比較大的操作堵塞連接,所以會按照優先級創建多個連接,稱為channel。

  • recovery: 2個channel專門用做恢復數據。如果為了避免恢復數據時將帶寬占滿,還可以設置恢復數據時的網絡傳輸速度。

  • bulk: 3個channel用來傳輸批量請求等基本比較低的請求。

  • regular: 6個channel用來傳輸通用正常的請求,中等級別。

  • state: 1個channel保留給集群狀態相關的操作,比如集群狀態變更的傳輸,高級別。

  • ping: 1個channel專門用來ping,進行故障檢測。

(3個節點的集群連接示意,來源 Elasticsearch 官方博客)

每個節點默認都會創建13個到其他節點的連接,並且節點之間是互相連接的,每增加一個節點,該節點會到每個節點創建13個連接,而其他每個節點也會創建13個連回來的連接。

 

 

SniffNodesSampler:client會主動發現集群里的其他節點,會創建fully connect(每兩個節點間建立5種連接)。這樣即使手動添加的機器退服,transportClient還可以向其它集群節點發送請求。另外還支持負載均衡,每次請求都會隨機訪問一個集群節點。

SimpleNodeSampler:這里創建的都是light connect(簡單的ping和查詢連接) ,只能在指定的節點間負載均衡,而且如果所有手動添加的機器退服,trnasportClient將無法連接集群進行操作。

 

注意:在ES7中不建議使用Transport Client,在ES8中去除Transport Client用Java High Level REST Client代替

訪問遠端集群,盡量以輪詢方式訪問目標節點

 

2.如何選擇JAVA客戶端
如果要將應用程序和 Elasticsearch 集群進行解耦,傳輸客戶端是一個理想的選擇。例如,如果您的應用程序需要快速的創建和銷毀到集群的連接,傳輸客戶端比節點客戶端”輕”,因為它不是一個集群的一部分。類似地,如果您需要創建成千上萬的連接,你不想有成千上萬節點加入集群。傳輸客戶端( TC )將是一個更好的選擇。
另一方面,如果你只需要有少數的、長期持久的對象連接到集群,客戶端節點可以更高效,因為它知道集群的布局。但是它會使你的應用程序和集群耦合在一起,所以從防火牆的角度,它可能會構成問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM