## 查詢命令的execution preference
<div style="text-indent:2em;">
<p>暫時先忘記分片分配以及分配方式,ElasticSearch不僅提供了關于分片和分片副本各式各樣的設置方式,同時也提供了指定查詢命令(還有其它的操作,比如real time get)執行位置的功能。在詳細了解該功能之前,先看看樣例集群:</p>
<center><img src="../44_cluster.png" /></center>
<p>通過上圖可以看到,樣例集群有3個節點和一個名稱為<b>Mastering</b>的索引。索引拆分成兩個主分片,每個分片都有一個分片副本。</p>
<h4>preference參數簡介</h4>
<p>為控制客戶端發送的查詢(及其它操作)命令在集群中執行的位置,我們用到了preference參數,該參數可指定如下的值:
<ul>
<li>\_primary: 使用該屬性值,發送到集群的相關操作請求只會在主分片上執行。如果發送查詢命令到mastering索引時附帶了值為\_primary的preference參數,該命令將只在名字為node1和node2的節點上執行。比如,如果用戶集群的主分片在一個機架中,分片副本在另一個機架中,用戶就可能希望命令只在主分片中執行以避免使用網絡流量。 </li>
<li>\_primary\_first:該屬性值與\_primary屬性值導致相似的集群行為,但是具有容錯機制。如果發送查詢命令到mastering索引時附帶了值為\_primary\_first的preference參數,該命令將在名稱為node1和node2的節點上執行,但是如果有一個(或者更多)的主分片失效,查詢命令將轉到其它的分片上執行,在本例中會轉到node3上執行。正如我們所說,該屬性值與\_primary屬性值相似,但是如果由于某些原因主分片失效了,那么命令就會回轉到分片副本上執行。</li>
<li>\_local: ElasticSearch會優先在本地的節點上執行相關操作。比如,如果我們向node3發送附帶一條preference參數值為\_local的查詢命令,最終該查詢命令會在node3上執行。但是,如果我們把相同的命令發送到node2節點,那么最終該命令不僅會在編號為1的分片(分片位于本地節點)上執行,同時也會分發到node1或者node3上執行,這兩個節點上有編號為0的分片。該屬性值在減小網絡傳輸時間上特別有用。只要用到了\_local preference參數值,我們就能確保查詢命令會盡可能地在本地的節點上執行。(比如,從本地節點運行一個客戶端連接或者發送一個查詢命令到節點上)</li>
<li>\_only\_node:wJq0kPSHTHCovjuCsVK0-A:這類的操作只會在指定標識(本例中是wJq0kPSHTHCovjuCsVK0-A)的節點上執行。所以在本例中,查詢命令只會在node3節點上的兩個分片副本上執行。需要注意的是,如果指定節點中的分片不足以覆蓋到整個索引的數據,那么命令就只會在指定節點的相關分片上執行。比如,如果我們將查詢命令的preference參數值設置為 \_only\_node:6GVd-ktcS2um4uM4AAJQhQ,我們就只會獲取到一個分片的數據。這個屬性值在如下的應用場景中非常有用:用戶已經知道某個節點所在的服務器處理能力強大,希望一些特定的查詢命令只在該節點上執行。</li>
<li>\_prefer\_node:wJq0kPSHTHCovjuCsVK0-A:這個選項用來把preference參數值設置成\_prefer\_node:,后面附帶的值是一個節點Id(本例中就是wJq0kPSHTHCovjuCsVK0-A) ,這會導致ElasticSearch優先選擇指定的節點來執行查詢命令,但是如果該節點上缺少索引數據的一些分片,那么查詢命令會發到含有欠缺分片的節點上。這與\_only\_node選項是類似的,\_prefer\_node也可以用來選擇特定的節點,但是具備容錯機制。</li>
<li>\_shards:0,1:這個preference值用來指定相關操作執行的某類分片(在本例中就是所有的分片,因為整個mastering索引只有id為0和1的分片)。這是唯一的一個可以結合其它屬性使用的preference值。比如,如果希望命令只執行在本地節點的id為0或者1的分片上,我們可以把0,1兩個值和\_local值用“;”連接起來,最終得到的preference參數值就是這樣了:0,1:_local。允許用戶發出的命令只在某個分片上執行這一特性用于診斷集群問題是非常有幫助的。</li>
<li>custom,字符串值:這個自定義值會確保附帶相同custom值的查詢命令會在同樣的分片上執行。比如,如果我們的查詢命令附帶preference參數值為mastering_elasticsearch,那么命令會在node1和node2的主分片上執行。如果我們又發送了另一個附帶同樣preference參數值的查詢命令,該命令也只會在node1和node2的分片上執行。該功能用于應對以下應用場景:假如集群中的各個節點刷新速率不一樣,我們不希望用戶在重復同一個命令時看到不同的結果,就應該使用該功能。</li>
</ul>
最后還有一點沒有提到,就是ElasticSearch的默認操作。默認情況下,ElasticSearch會將相關操作隨機分發到分片或者分片副本上。如果往集群中發送大量的查詢命令,最終每個分片和分片副本上執行的查詢命令數量會大致相同。
</p>
</div>
- 前言
- 第1章 認識Elasticsearch
- 認識Apache Lucene
- 熟悉Lucene
- 總體架構
- 分析你的文本
- Lucene查詢語言
- 認識 ElasticSearch
- 基本概念
- ElasticSearch背后的核心理念
- ElasticSearch的工作原理
- 本章小結
- 第2章 強大的用戶查詢語言DSL
- Lucene默認打分算法
- 查詢重寫機制
- 重排序
- 批處理
- 查詢結果的排序
- Update API
- 使用filters優化查詢
- filters和scope在ElasticSearch Faceting模塊的應用
- 本章小結
- 第3章 索引底層控制
- 第4章 探究分布式索引架構
- 選擇恰當的分片數量和分片副本數量
- 路由功能淺談
- 調整集群的分片分配
- 改變分片的默認分配方式
- 查詢的execution preference
- 學以致用
- 本章小結
- 第5章 管理Elasticsearch
- 選擇正確的directory實現類——存儲模塊
- Discovery模塊的配置
- 索引段數據統計
- 理解ElasticSearch的緩存
- 本章小結
- 第6章 應對突發事件
- 第7章 優化用戶體驗
- 第8章 ElasticSearch Java API
- 第9章 開發ElasticSearch插件