1. 程式人生 > >Elastic Search初識之吐槽

Elastic Search初識之吐槽

摘要

對於Elastic Search的初始印象就是全文字搜尋,與SOLR是競品。它與其他的儲存型資料庫有何區別,為什麼其他資料庫已經能夠提供文字搜尋功能了,還需要ES等一系列問題都是心中的困惑。這篇文章主要就是總結這些問題以及Elastic Search的概括介紹

ES資源

ES介紹

Elastic 是一個基於ApacheV2的開源系統,能夠提供分散式,實時的文件索引並提供線上分析。Schema free.

專有名詞

對映(Mappings)

就是關係型資料庫中的schemas,不同的地方在於ES不用提前明確的指定資料的型別。

索引(indexes)

這邊的索引與通常意義上的索引有些不同,這邊的索引是ES的專業名詞,表示的意義就是關係型資料庫中database,是一個邏輯命名。

型別(Types)

就是關係型資料中的表的意思

叢集架構

主節點

叢集中只有1個,是整個叢集的協調節點。down掉以後,會自動從選舉出一個。負責叢集level的操作,比如建立刪除一個索引。跟蹤哪些節點時叢集的一部分,決定哪個shard分配給哪個節點。

資料節點

儲存Lucene的索引分片,構成ES的分散式索引

接待節點(ingest node)

這個是可以執行預處理的pipeline工作,

只協調節點

只負責路由,處理search reduce 階段

預設情況下,一個節點這些角色都有,當叢集擴大了,想劃分職責了,可以disable到某些角色,讓某個節點只做一件事。

吐槽:
覺得這方面是ES做的不好,沒有一個清晰明確的叢集擴充套件拓撲圖。比如說在資料規模比較小的時候,所有的節點都是各個角色都有,到資料量大的時候再劃分特定的角色,這個實際操作不切實際,什麼時候就可以確定資料量大,什麼時候特定的角色就比所有角色都有效率高。而且在切換過程中需要怎麼切換,ES不支援resharding,和分片分裂。所以索引也沒辦法遷移了,如何能夠進行角色轉換。而且一旦劃分出coordinate node,客戶端連線節點還得更新。

ES初識

分片

沒有基於節點層面的分片,這點與mongo不同,與cassandra的partition類似。通過id hash來分片的。shard number 需要在建立index一開始去指定,後期如果要更改需要reindex

{
  "settings": {
    "number_of_shards":   5, 
    "number_of_replicas": 2
  }
}

分散式查詢

分散式查詢就是查詢各個shard,然後對結果進行組合,在各個shard上的查詢可以並行進行,但是如果shard number 比節點數多的,在同一個節點上就必須得序列執行了,效率就會降低。一般單個節點上的shard不要超過2個,也就是說index 的shard number 設定為10,節點水平擴充套件到20個就差不多了。

官方對於不支援shard分裂理由

  1. shard分裂就是一個reindex data,這個過程相比較從一個將shard從一個節點copy到另外一個節點會更重
  2. 分裂是指數性,1分2,2分4,4分8,不會允許只擴容50%
  3. shard 分裂要求你有足夠的能力去儲存第二份索引,通常當你意識到你需要擴充套件時,你可能沒有足夠的空間去支援分片了。

ES的reindex過程也是一個比較重的過程,同樣需要有足夠的空間去完成,但是至少你能夠控制新的索引中的索引數量。

吐槽:這個分片機制,ES設計的實在是太爛了,對於使用者來說,需要的是自動分片,而不是像MySQL那樣的自己實現,自動分片的含義不僅僅是初始的分片,當然也包括對擴充套件的要求。使用者怎麼知道自己的資料規模增長的上限,怎麼知道在開始的時候使用多少分片,reindexing在資料量大的情況下,完全是災難,當然應該把這部分工作放在日常解決。

索引

ES的索引是倒排索引,這個與一般的B-Tree索引不同,這也是為什麼ES是全文字搜尋引擎,B-Tree索引的話是針對欄位的一個排序,對於模糊查詢比如說like,沒法進行查索引,而倒排索引的話,是一個反向索引,首先是進行分詞,然後記錄詞會哪些欄位中出現,這是為什麼一般的資料庫提供不了全文字搜尋引擎的原因。

NoSQL資料庫

ES也有人拿來作為NoSQL資料庫,因為預設儲存了原始資料,而且有transaction log,保證不丟資料,另外的query比較豐富,一些group by都可以通過aggregation 來實現。所以有些使用者拿來做BI分析

總結

ES使用起來比較簡單,容易上手。提供RESTFUL API介面,JSON文件儲存,呼叫起來方便。作為全文字搜尋是一個選擇,與solr的區別暫時不清楚。作為NoSQL資料庫儲存,查詢豐富在資料量不多,叢集規模不大的情況下可以選用,但是叢集擴充套件能力不行,分片策略有缺陷。不易在大規模資料儲存時使用。

參考