Elasticsearch 6.x 的基本概念及特點

Elasticsearch 6.x 的基本概念及特點

每一個成功人士的背後,必定曾經做出過勇敢而又孤獨的決定。

放棄不難,但堅持很酷~

本章節主要是對 Elasticsearch 的入門講解篇,包括 Elasticsearch 是做什麼的,有什麼特點,優秀使用案例,還有和 Mysql 等關係型數據庫的對比等進行了一定的講解。

本文以 Elasticsearch 6.4.0 的角度來講解其基本概念。

一、簡介

Lucene:簡單來說,就是一個 jar 包,裡面包含了封裝好的各種建立倒排索引,以及進行搜索的代碼,包含各種算法,我們用java開發的時候,引入 lucene.jar 就可以進行開發了。

ElasticSearch 是一個基於 Lucene 的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於 RESTful web 接口。ElasticSearch 是用 Java 開發的,並作為 Apache 許可條款下的開放源碼發佈,是當前流行的企業級

搜索引擎。設計用於雲計算中,能夠達到近實時搜索,穩定,可靠,快速,安裝使用方便。

Elasticsearch 有如下幾個特點:

  • 分佈式存儲,每個字段都被索引並可被搜索

  • 分佈式的近實時分析搜索引擎

  • 可以擴展到上百臺服務器,處理 PB 級結構化或非結構化數據

二、ES國內外使用優秀案例

1) 2013 年初,GitHub 拋棄了 Solr,採取 ElasticSearch 來做 PB 級的搜索。“GitHub 使用 ElasticSearch 搜索 20TB 的數據,包括 13 億文件和 130

0 億行代碼”。

2)維基百科:啟動以 Elasticsearch 為基礎的核心搜索架構。

3)SoundCloud:“SoundCloud 使用 ElasticSearch 為 1.8 億用戶提供即時而精準的音樂搜索服務”。

4)百度:百度目前廣泛使用 ElasticSearch 作為文本數據分析,採集百度所有服務器上的各類指標數據及用戶自定義數據,通過對各種數據進行多維分析展示,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部 20 多個業務線(包括 casio 、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單集群最大 100 臺機器,200 個 Elasticsearch 節點,每天導入 30 TB+數據。

5) 淘寶等電商網站,新聞網站,OA 辦公系統等。

三、基本概念

參考官方文檔:

https://www.elastic.co/guide/en/elasticsearch/reference/6.4/getting-started-concepts.html

1. 節點(Node) 和 集群(Cluster)

集群是一個或多個 Elasticsearch 節點(服務器)的集合, 這些節點共同保存整個數據,並在所有節點上提供聯合索引和搜索功能。一個集群由一個唯一集群 ID 確定,並指定一個集群名(默認為 “elasticsearch” )。該集群名非常重要,因為節點可以通過這個集群名加入集群,一個節點是集群的一部分。

2. Index(索引)

索引是具有相似特徵的文檔的集合。例如,您可以為客戶數據創建索引,為產品目錄創建另一個索引,為訂單數據創建另一個索引。索引由名稱標識(必須全為小寫,不能以下劃線開頭,不能包含逗號)。

在一個 Elasticsearch 集群中,您可以定義任意數量的索引。

3. Type(類型)

在 Elasticsearch 6.0.0 或更高版本中創建的索引只能包含一個映射類型。類型將在 Elasticsearch 7.0.0 中的 API 中棄用,並在 8.0.0 中完全刪除。

詳情可參考:

https://www.elastic.co/guide/en/elasticsearch/reference/6.4/removal-of-types.html#_why_are_mapping_types_being_removed

4. Document(文檔)

文件是可以建立索引的基本信息單位,以 json 表示。你可以用其來定義單個產品信息或是員工信息。我們可以把文檔理解為 Mysql 表中的行級數據。在 Index(索引) 中,您可以存儲大量文檔。文檔中有幾個公共不可或缺的屬性,分別為 _index、_type、_id、_source。

  • _index:表示所在的 index 名。

  • _type:在 6.x 版本只能指定一個類型,在 6.4.0 版本中默認為 “doc”。

  • _id:文檔的唯一標識,類似於 Mysql 數據庫的主鍵 id 。

  • _source:文檔數據以 json 的形式保存在該字段內。

針對特定一個或一類文檔進行操作時,必須指定這些屬性。

5. Mapping(映射)

模式映射(schema mapping,或簡稱為映射)用於定義 Index(索引) 的元數據,指定要索引並存儲文檔的字段類型。Elasticsearch 在 Mapping 中存儲有關字段的信息。Mapping 在文件中以 json 表示。

6. Field(字段)

Elasticsearch 裡最小單元,相當於 Mysql 表的某個字段,類似於 json 裡一個鍵。

7、Shards(分片)

索引可能會存儲大量數據,這些數據可能超過單個節點的硬件限制。例如,十億個文檔的單個索引佔用了 1 TB的磁盤空間,可能不適合單個節點的磁盤,或者可能太慢而無法單獨滿足來自單個節點的

搜索請求。

為了解決此問題,Elasticsearch 提供了 Shards(分片) 的概念。每個 Shards(分片) 本身就是一個功能齊全且獨立的 Lucene “索引”,可以存儲在 Elasticsearch 集群中的任何節點上,這就是分佈式存儲。

分片的好處?

  • 當你查詢的索引分佈在多個分片上時,Elasticsearch 會把查詢發送給每個相關的分片,並將結果合併在一起。所以,多個分片可以加快查詢,提高吞吐量。

  • 通過將分片放在不同節點,可以存儲超過單節點容量的數據。

8、Replica(副本)

當集群某節點宕機了,為了防止數據丟失,Elasticsearch 還提供了 Replica(副本) 概念。副本分片(Replica Shards)是一個分片的精確複製,每個分片可以有零個或多個副本。換句話說,Elasticsearch 可以有許多相同的分片,其中之一被自動選擇去更改索引操作,這種特殊的分片稱為主分片(primary shards),其餘稱為副本分片(replica shards)。在主分片丟失時,例如該分片數據所在服務器不可用,集群則將副本分片提升為新的主分片。

Replica(副本)的好處:

  • 提供高可用性。當主分片節點故障時,可升級一個副本分片為新的主分片來應對節點故障。需要特別說明的是:副本分片(Replica Shards) 永遠不會與 主分片(primary Shards) 分配在同一節點上。

  • 由於每個 Shards(分片) 本身就是一個功能齊全且獨立的 Lucene “索引”,所以也可以在所有的副本分片(Replica Shards)上並行執行搜索,從而加快 Elasticsearch 查詢,提高吞吐量。

  • 增加副本分片,可以將數據存儲到更多節點上,更好地處理併發請求。

可以在創建 索引(Index)時定義主分片(Primary Shards)副本分片(Replica Shards)的數量。創建索引後,您還可以動態更改副本數,但要更改分片數就不那麼輕鬆了。因此,預先規劃正確的分片數量是最佳方法。

默認情況下,Elasticsearch 中的每個索引分配有 5 個主分片和 1 個副本分片,這意味著如果集群中至少有兩個節點,則索引將具有 5 個主分片和另外 5 個副本分片(1個完整副本),總計每個索引 10 個分片。

四、關係型數據庫和ElasticSearch中的對應關係

在 6.4.x 的官方文檔中表示,“ 索引 ”類似於SQL數據庫中的“ 數據庫 ”,而“ 類型 ”等同於 “ 表 ”,這是一個不好的類比。但為了方便理解,其它概念還是有一些對應關係的。如下表所示:

<table><thead>關係型數據庫Elasticsearch/<thead><tbody>數據行 Row文檔 Document,但不需要固定結構,不同文檔可以具有不同字段集合模式 Schema映射 Mapping
數據列 Column字段 Field/<tbody>/<table>

歡迎大家留言討論


分享到:


相關文章: