为什么ElasticSearch应用开发者需要了解cluster state
原文鏈接:?https://www.loggly.com/blog/p...
在前面的文章(ES vs Solr)中我們提到, ES構建了Loggly的很多核心功能. 在把這項通用搜索技術用于我們的日志管理系統, 并為超過5000多客戶提供準實時服務的過程中, 我們在技術上成長頗多. 按照我們對開源社區的尊重, 在此希望能把我們所學到的知識回饋到社區.
本文將探討對ES擴展過程中的性能有深遠影響的關鍵概念:?cluster state.
什么是cluster state
ES的一個突出優點是其無模型規則約束. 起初, 你可以把一個包含任意字段數目的文檔添加到索引中, 而并不需要提前在ES中定義這些字段的類型. 能把這些字段添加到索引并隨后進行搜索是件讓人興奮的事情. 但這些字段的名稱, 類型以及它們被添加到的索引信息則會自動添加到ES的cluster state信息中(假設你使用了默認的動態mapping設置. 當然像ES的其他配置一樣, 你可以調整或禁用該行為).
當然,這里還有些秘密: 如果你向一個已存在的字段(例如integer)中試圖添加另外一種類型(例如string)的字段值時, ES將會失敗.?同一個索引中的相同字段不能同時具有兩種不同類型. 這稱為mapping沖突. ES的處理取決于涉及的具體類型. 例如:
-
如果向一個字符串類型中添加整數值, 則會進行強制類型轉換
-
如果向一個整數類型中添加字符串值, 則會遇到異常, ES拒絕接收該文檔.
所以關注下你的ES響應,尤其在使用bulk做批量索引時.
cluster state是你的重要參考
像其他倒排索引一樣, 當你搜索數據時, ES需要知道這些數據的元信息及其存儲位置. 當節點接收到查詢請求, 首先要做的就是你要查詢的對象在哪些分片上, 然后判斷這個索引上有哪些字段以及它們的類型.(你不能在一個字符串類型的字段上進行數字范圍查詢). 而這些信息都記錄在cluster state之中.
顧名思義, cluster state是全局性信息, 包含了整個群集中所有分片的元信息(規則, 位置, 大小等信息), 并保持每個每節的信息同步.
在一個包含眾多節點的集群中, ES是如何做到信息同步的呢? 原來ES的cluster state信息是由master節點維護的, 當它收到data節點的狀態更新變化后, 就把這些信息依次廣播到其他節點, 僅此而已.
假如你的cluster state每2?分鐘更新300磅
請記住: cluster state是你的群集中每個節點上的每個索引包含的每個分片的所有字段信息. 如果你有大量的字段, 例如把ES作為大量易變且無固定規則文檔的存儲, 那么cluster state將會變得龐大. 在Loggly服務中恰恰如此. 因為客戶發送給我們的文檔格式隨意, 包含任意數據的唯一字段, 并且數量跨度較大. 我們每秒處理數十萬次請求, 所以Loggly的cluster state可達數百兆大小.
希望你看到光明之門
也許警告聲已在你腦海中響起: "你是說當有任何變化時, ES會廣播數百兆的數據到不同節點?". 也許事實并不像你想像的那么糟糕. 在cluster state管理方面, ES已經做了幾個優化:
-
從ES2.0以來, 只有變化的cluster state信息才會被廣播. 相比以前的版本, 這帶來了巨大的性能提升.
-
在ES節點前傳遞信息之前, ES對cluster state做了效果顯明的壓縮.
-
ES在合并cluster state更新以及批量處理上相當明智, 特別是最近的ES版本中.(在后面的文章Pending Tasks會介紹前期版本中未做這些優化時的內部處理)
即便如此, 經常關注你的cluster state也是很有必要的. 另外, 我們發現在規模化運行ES集群早期, 索引大量數據之前要做的第一件事, 就是為ES的cluster state數據量設置上限, 以避免超出ES處理能力而導致集群故障. 關于cluster state更嚴重的問題--以及在Loggly, 我們是如何解決cluster state問題的--將會在以后的文章出介紹, 希望能對你有所幫助.
cluster state示例
下面是一個具有兩個節點的集群, 其中包含了只有一條文檔的一個索引的cluster state信息. 當然這與我們真實場景中的數據有很大區別, 因為在我們的集群中有很多機器和大量的索引節點以及超出你想象的mapping數量. 但這個例子已經足夠讓你了解cluster state所包含的信息了.
{"cluster_name" : "elasticsearch","version" : 11,"master_node" : "-mq1SRuuQoeEq-3S8SdHqw","blocks" : { },"nodes" : {"sIh5gQcFThCcz3SO6txvvQ" : {"name" : "Max","transport_address" : "inet[/162.245.23.194:9301]","attributes" : { }},"-mq1SRuuQoeEq-3S8SdHqw" : {"name" : "Llyron","transport_address" : "inet[/162.245.23.194:9300]","attributes" : { }}},"metadata" : {"templates" : { },"indices" : {"blog" : {"state" : "open","settings" : {"index" : {"uuid" : "UQMz5vbXSBqFU_8U3u4gYQ","number_of_replicas" : "1","number_of_shards" : "5","version" : {"created" : "1030099"}}},"mappings" : {"user" : {"properties" : {"name" : {"type" : "string"}}}},"aliases" : [ ]}}},"routing_table" : {"indices" : {"blog" : {"shards" : {"4" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 4,"index" : "blog"} ],"0" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 0,"index" : "blog"} ],"3" : [ {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 3,"index" : "blog"} ],"1" : [ {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 1,"index" : "blog"} ],"2" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 2,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 2,"index" : "blog"} ]}}}},"routing_nodes" : {"unassigned" : [ ],"nodes" : {"sIh5gQcFThCcz3SO6txvvQ" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 2,"index" : "blog"} ],"-mq1SRuuQoeEq-3S8SdHqw" : [ {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 2,"index" : "blog"} ]}},"allocations" : [ ] }?
?
總結
以上是生活随笔為你收集整理的为什么ElasticSearch应用开发者需要了解cluster state的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html laber上下居中,CSS未知
- 下一篇: 在linux怎样删除文件夹里,linux