ElasticSearch 2 (7) - 基本概念
ElasticSearch 2 (7) - 基本概念
摘要
ElasticSearch的一些基本核心概念,理解這些概念有助于ElasticSearch的學習
- 準實時NRT(Near Realtime)
- 集群
- 節點
- 索引
- 類型
- 文檔
- 分片與副本(Shards & Replicas)
版本
elasticsearch版本: elasticsearch-2.2.0
概念
準實時NRT(Near Realtime)
ElasticSearch是一個準實時的搜索平臺。準實時的意思是說它的延遲非常小,從為一個文檔建索引到這個文檔可以搜索出來,只需要1秒的時間。
集群(Cluster)
一個ES集群可以由一個或者多個節點(nodes or servers)組成。所有這些節點用來存儲所有的數據以及提供聯合索引,為我們提供跨節點查詢的能力。一個ES集群的名稱是唯一的,默認情況下為“elasticsearch”。這個名稱非常重要,因為一個節點(node)會通過這個名稱來判斷是否加入已有的集群。
必須保證在不同環境下使用不同的集群名稱,否則節點可能會加入錯誤的集群。比如我們可以為開發環境(development)、測試環境(staging)、產品環境(production)分別給出不同的集群名稱:logging-dev、logging-staging、logging-prod。
需要注意的是我們也可以使用一個只有一個節點的集群,或者我們也可以有不同的集群,每個集群都有自己唯一的名稱。
節點(Node)
一個節點是一個集群中的一臺服務器,它用來存儲數據,參與集群的索引以及提供搜索能力。如ES集群,一個節點也是由它的唯一名稱來標識,默認狀態下,ES會為在啟動時隨機為一個節點給定一個以漫威Marvel人物的名字為之命名,當然我們也可以為節點指定任何我們想指定的名稱。這個名稱對于管理ES集群非常重要,我們用它來定位網絡或集群中的某一節點。
一個節點可以通過指定集群名稱讓它加入某個集群,默認情況下,每個節點都會加入到一個名為“elasticsearch”的集群中,也就是說,當我們在某一網絡下啟動一定數量的ES節點時,我們認為他們可以相互發現同一網絡下的其他節點。
在單集群下,我們可以有任意數量的節點,如果當前網絡下沒有任何ES節點,那么在啟動節點后,當前節點會默認形成一個單節點集群,名稱為“elasticsearch”。
索引(Index)
一個索引是一組具有相似特性的文檔的集合。例如,可以為客戶數據(customer data)建立索引一個索引,也可以為產品目錄(product catalog)建立另一個索引,還可以為訂單數據(order data)建立另一個索引。一個索引由它的名稱唯一標識(必須所有字母為小寫字母),這個名稱會在進行索引(indexing)、搜索(search)、修改(update)和刪除(delete)操作的時候使用。
在一個單集群下,我們可以定義任意多的索引。
類型(Type)
在一個索引下,我們可以定義一個或多個類型(types)。一個類型是一個索引邏輯分類或分區(category/partition),而分類或分區的劃分方法由我們自己決定。通常情況下,我們會為具有相類似的字段的一組文檔定義類型。比如,如果我們運行一個博客平臺,所有的數據都使用同一索引,我們為用戶數據定義一種類型,為博客數據定義另一種類型,同時為評論數據定義另一種類型。
文檔(Document)
一個文檔是一個可以被索引的基本信息單元。比如,一個用戶可以是一個文檔,一個產品可以是一個文檔,一個訂單同樣也可以成為一個文檔。這個文檔以JSON格式表示。
分片與副本(Shards & Replicas)
一個索引可能會存儲大量數據從而超過單個節點硬件的限制。例如,單個索引可能會有上億的文檔占用1TB的磁盤空間,這對于單個節點來說太大,同時使用單個節點也會是搜索變慢。
為了解決這個問題,ES提供了一種分片(shard)能力,讓我們將一個索引切分成片。當我們創建一個索引時,我們可以為它指定分片的數量。每個分片自己都能獨立工作,并且存在與集群的任一節點中。
分片的重要性主要體現在以下兩個原因:
- 可以水平分割或擴展內容體量。
- 可以分布式和并行的方式在多個分片上進行操作(多個節點)從而提高性能和吞吐量。
一個分片是如何散發的,如何將它的文檔聚合并返回個查詢是對用戶透明的,這個過程完全由ES來管理。
在網絡或云的環境下,錯誤可以在任何時候發生,當一個分片或節點因為某種原因下線或消失時,一個錯誤恢復機制就非常重要。為了解決這個問題,ES讓我們可以為一個索引分片創建一個或多個拷貝,這個拷貝稱作副本分片,簡稱為副本。
副本的重要性主要體現在以下兩個原因:
- 當一個分片或者節點出錯時,集群任然可用。正因如此,我們會發現一個分片副本從來不會在它的原始分片或主分片所在的節點出現。
- 橫向擴展搜索體量和吞吐量,因為搜索可以在所有副本上并行執行。
總之,每個索引都可以分為多個分片,一個索引也可以被復制到零個或多個副本。一旦發生復制,每個索引都會有主分片(primary shards)和多個副本分片(replica shards)。分片數和副本數可以在一個索引創建時指定。當索引創建以后,可以動態的改變副本數,但是不能改變分片數。
默認情況下,每個ES索引都有5個主分片(primary shards)和1個副本(replica),也就是說當我們的集群有兩個節點時,我們的索引會有5個主分片和另外5個副本分片,也就是說每個索引有總共10個分片。
注意
每個ES分片都是一個Lucene索引。對于單個Lucene索引,文檔的最大數有一個限制,2,147,483,519。即(= Integer.MAX_VALUE - 128)。可以通過
_cat/shards來查看。
Each Elasticsearch shard is a Lucene index. There is a maximum number of documents you can have in a single Lucene index. As of LUCENE-5843, the limit is 2,147,483,519 (= Integer.MAX_VALUE - 128) documents. You can monitor shard sizes using the _cat/shards api.
參考
參考來源:
https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
圖片來源:
https://www.youtube.com/watch?v=LDyxijDEqj4
結束
總結
以上是生活随笔為你收集整理的ElasticSearch 2 (7) - 基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Platforms/iPhoneSimu
- 下一篇: _extend用法总结