Elasticsearch原理解析與效能調優

2021-10-10 09:09:40 字數 4281 閱讀 7539

類似於insert。例如索引乙個文件到乙個索引

倒排索引

預設每個屬性都會有乙個倒排索引,可以設定屬性不被索引,它只能被覆蓋,不能被修改

型別類似表,同一索引的不同型別,可以擁有不同的字段,但應該擁有大部分相似的字段。它可以包含大小寫,不能包含句號,不能以下劃線開頭,長度限制為256.

id文件的id,可以在生成文件時指定或自動生成,自動生成的id,在大部分情況下多個節點的時候唯一。如果在建立文件時,id衝突,伺服器會返回409

文件類似於記錄,文件只能被替換,而不能被修改,文件的字段型別需要一致,否則無法進行精確匹配

精確值欄位

對於數字,日期,布林和乙個not_analyzed欄位,進行查詢,會適用精確匹配

全文搜尋字段

否則,進行相關性搜尋

put /megacorp/employee/1

例如megacorp是索引

employee是型別

1是文件id

json內容是文件

互動restful api

curl -x 『?/:/

?』 -d 『』

verb 適當的 http 方法 或 謂詞 : get、 post、 put、 head 或者 delete。

protocol http 或者 https(如果你在 elasticsearch 前面有乙個 https **)

host elasticsearch 集群中任意節點的主機名,或者用 localhost 代表本地機器上的節點。

port 執行 elasticsearch http 服務的埠號,預設是 9200 。

path api 的終端路徑(例如 _count 將返回集群中文件數量)。path 可能包含多個元件,例如:_cluster/stats 和 _nodes/stats/jvm 。

query_string 任意可選的查詢字串引數 (例如 ?pretty 將格式化地輸出 json 返回值,使其更容易閱讀)

body 乙個 json 格式的請求體 (如果請求需要的話)

例子request:

}檢索文件功能

獲取乙個文件

get /megacorp/employee/1

簡單查詢

get /megacorp/employee/_search #查詢前十條記錄

get /megacorp/employee/_search?q=last_name:smith #查詢smith的前十條記錄

表示式查詢

get /megacorp/employee/_search}}

get /megacorp/employee/_search

},「filter」: }}

}}}全文檢索

get /megacorp/employee/_search}}

短語查詢

get /megacorp/employee/_search}}

分析(類似於聚合group by)

request:

get /megacorp/employee/_search

,「aggs」 : }}

}}}response:

…「all_interests」:

},},}]

}修改文件

put /website/blog/123

舊文件不會馬上刪掉

新文件會被索引

文件的version會加一

刪除文件

delete /megacorp/employee/123

文件的version依然會加一

集群集群擁有乙個或多個節點,當有節點加入或者退出集群時,集群會重新平均分配所有資料的分布

主節點功能

增加/刪除索引

增加/刪除節點

不涉及文件的變更和搜尋,因此單一的主節點不會成為集群的效能瓶頸

索引分片的元資料在每個es節點都有儲存,每個節點在接到請求後,都知道到哪台es node找到資料,通過**請求到es node所在的機器

乙個分片的最大文件數:(2^31-128)

乙個索引的主分片數在建立時被確定,且無法修改:因為文件的儲存是用shard = hash(routing) % number_of_primary_shards來確定文件的位置的。routing預設是id,也可以自定義

分片的副本數可以隨時修改

建立索引

put /blogs

}es-cluster

故障轉移

增加一台機器到集群

es-addonenode

刪除節點

es-delonenode

分布式寫入衝突

es-datalose

對於多個client的寫入es,有可能造成寫入衝突,導致資料的丟失

在一些場景下,資料丟失是可以接受的

但是在某些場景下,是不允許的。

悲觀控制併發

傳統資料庫的控制方式。通過對記錄加鎖,來實現併發的序列執行

樂觀併發控制

es採用樂觀控制

所謂樂觀控制,就是伺服器假設大部分情況下,是不會發生衝突的,如果發生衝突,則拒絕修改,客戶端可以需要通過重新獲取並重試進行處理。

過程如下圖

es-versionconflict

分布式文件儲存

確定文件位於那個shard

shard = hash(routing) % number_of_primary_shards

api支援帶routing引數,來自定義路由,來確保相關文件路由到同乙個分片

以id新建,寫入和刪除文件

es-writedocbyid

一致性保證

none: 主分片活躍,允許寫入

all: 在所有分片活躍,允許寫入

quorum: 半數以上節點活躍,允許寫入

如果暫時沒有足夠的分片活躍,es會等待,預設等待1分鐘,可以通過引數timeout改變這個值,如果超時,則失敗返回

新索引預設有 1 個副本分片,這意味著為滿足 規定數量 應該 需要兩個活動的分片副本。 但是,這些預設的設定會阻止我們在單一節點上做任何事情。為了避免這個問題,要求只有當 number_of_replicas 大於1的時候,規定數量才會執行。

以id檢索文件

與上圖類似

以id更新文件

與上圖類似,但在更新完文件後,會重建索引

在區域性更新文件的時候,主分片會以整份文件來同步給副本,來保證資料的完整性

通過條件獲取多個文件

es-mget

搜尋返回特殊字段

get /_search

},… 9 results removed …

],「max_score」 : 1

},「took」 : 4,

「_shards」 : ,

「timed_out」 : false

}took

執行的毫秒數

_shards

查詢分片的狀態,例如有幾個分片是失敗的,幾個是成功的

timeout

可以通過在查詢設定超時,如果查詢超過時間,則只返回已經成功獲得的資料,剩餘的資料將丟棄

_index

資料**的lucene索引,文件的每乙個字段,都擁有乙個不同的lucene索引

在查詢中可以指定lucene的索引,預設是不指定的,所以會查詢該文件的所有索引,並彙總結果。如果指定,則會限定僅在指定的lucene索引中查詢資料

分頁get /_search?size=5&from=5

此方式只適用於淺分頁,如果查詢過深,會導致嚴重的效能問題。

因為例如查詢size為5,from=10000。那麼es會從各分片中都查詢10005條記錄,如果有100個shard,那麼就會有10010005條記錄,es再對這10010005排序,並僅返回5條記錄

深分頁使用游標scroll

它在es中建立了乙個有有效期的快照,提供給scroll進行資料的深度查詢

倒排索引

對一下文件進行倒排:

the quick brown fox jumped over the lazy dog

quick brown foxes leap over lazy dogs in summer

得到:倒排面臨的挑戰

quick跟quick,使用者有可能認為它們是相同的,也有可能認為是不同的

dog和dogs非常接近,在相關性搜尋時,它們應該都被搜尋到

jump和leap是同義詞,在相關性搜尋時,它們應該都被搜尋到

亞馬遜測評 www.yisuping.com

Elasticsearch 架構原理

elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...

Elasticsearch 架構原理

elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...

elasticsearch原理分析

集群內部原理 1 主節點 master node 主節點負責集群層面的相關操作,管理集群變更。通過配置 node.master true 預設 使節點具有被選舉為 master 的資格。主節點是全域性唯一的,將從有資格成為master的節點中進行選舉。2 資料節點 data node 負責儲存資料 ...