最近在知乎上看到了這個問題,自己也搞了半學期的Elasticsearch,於是就想用自己所知道的淺陋知識來回答一下這個問題。
Cluster包含多個node,Indices不應該理解成動詞索引,Indices可理解成關系數據庫中的databases,Indices可包含多個Index,Index對應關系數據庫中的database,它是用來存儲相關文檔的。
Elasticsearch與關系數據的類比對應關系如下:
Relational DB ⇒ Databases ⇒ Tables ⇒ Rows ⇒ Columns
Elasticsearch ⇒ Indices ⇒ Types ⇒ Documents ⇒ Fields
這里的document的可以理解為一個JSON序列對象。每個document可包含多個field。
再來說說Shard,每個Index(對應Database)包含多個Shard,默認是5個,分散在不同的Node上,但不會存在兩個相同的Shard存在一個Node上,這樣就沒有備份的意義了。Shard是一個最小的Lucene索引單元。
當來一個document的時候,Elasticsearch通過對docid進行hash來確定其放在哪個shard上面,然后在shard上面進行索引存儲。
replicas就是備份,Elasticsearch采用的是Push Replication模式,當你往 master主分片上面索引一個文檔,該分片會復制該文檔(document)到剩下的所有 replica副本分片中,這些分片也會索引這個文檔。我個人覺得這種模式很nice,有些時候對於一個document的進行索引可能生成很大的索引文件,會很占帶寬,而只傳輸原始文件會好很多。
當進行查詢是,如果提供了查詢的DocID,Elasticsearch通過hash就知道Doc存在哪個shard上面,再通過routing table查詢就知道再哪個node上面,讓后去node上面去取就好了。如果不提供DocID,那么Elasticsearch會在該Index(indics)shards所在的所有node上執行搜索預警,然后返回搜索結果,由coordinating node gather之后返回給用戶。
配置上需要把握什么樣的原則,應該去看一個ES優化方面的資料,推薦兩本書