初識ElasticSearch

前言

Elasticsearch是一個開源的分佈式、RESTful 風格的搜索和數據分析引擎,它的底層是開源庫Apache Lucene。   

Lucene 可以說是當下最先進、高性能、全功能的搜索引擎庫——無論是開源還是私有,但它也僅僅只是一個庫。為了充分發揮其功能,你需要使用 Java 並將 Lucene 直接集成到應用程序中。 更糟糕的是,您可能需要獲得信息檢索學位才能瞭解其工作原理,因為Lucene 非常複雜。   

為了解決Lucene使用時的繁複性,於是Elasticsearch便應運而生。它使用 Java 編寫,內部採用 Lucene 做索引與搜索,但是它的目標是使全文檢索變得更簡單,簡單來說,就是對Lucene 做了一層封裝,它提供了一套簡單一致的 RESTful API 來幫助我們實現存儲和檢索。

當然,Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜索引擎。 它可以被下面這樣準確地形容:

  • 一個分佈式的實時文檔存儲,每個字段可以被索引與搜索;
  • 一個分佈式實時分析搜索引擎;
  • 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據。

由於Elasticsearch的功能強大和使用簡單,維基百科、衛報、Stack Overflow、GitHub等都紛紛採用它來做搜索。現在,Elasticsearch已成為全文搜索領域的主流軟件之一。

Elasticsearch 優點

  • 查詢 : Elasticsearch 允許執行和合並多種類型的搜索 — 結構化、非結構化、地理位置、度量指標 — 搜索方式隨心而變。
  • 分析 : 找到與查詢最匹配的十個文檔是一回事。但是如果面對的是十億行日誌,又該如何解讀呢?Elasticsearch 聚合讓您能夠從大處著眼,探索數據的趨勢和模式。
  • 速度 : Elasticsearch 很快。真的,真的很快。
  • 可擴展性 : 可以在筆記本電腦上運行。 也可以在承載了 PB 級數據的成百上千臺服務器上運行。
  • 彈性 : Elasticsearch 運行在一個分佈式的環境中,從設計之初就考慮到了這一點。
  • 靈活性 : 具備多個案例場景。數字、文本、地理位置、結構化、非結構化。所有的數據類型都歡迎。
  • HADOOP & SPARK : Elasticsearch + Hadoop

Elasticsearch用例

  1. 你經營一個網上商店,你允許你的顧客搜索你賣的產品。在這種情況下,您可以使用Elasticsearch來存儲整個產品目錄和庫存,併為它們提供搜索和自動完成建議。
  2. 你希望收集日誌或事務數據,並希望分析和挖掘這些數據,以查找趨勢、統計、彙總或異常。在這種情況下,你可以使用loghide (Elasticsearch/ loghide /Kibana堆棧的一部分)來收集、聚合和解析數據,然後讓loghide將這些數據輸入到Elasticsearch中。一旦數據在Elasticsearch中,你就可以運行搜索和聚合來挖掘你感興趣的任何信息。
  3. 你運行一個價格警報平臺,允許精通價格的客戶指定如下規則:“我有興趣購買特定的電子設備,如果下個月任何供應商的產品價格低於X美元,我希望得到通知”。在這種情況下,你可以抓取供應商的價格,將它們推入到Elasticsearch中,並使用其反向搜索(Percolator)功能來匹配價格走勢與客戶查詢,並最終在找到匹配後將警報推送給客戶。
  4. 你有分析/業務智能需求,並希望快速調查、分析、可視化,並對大量數據提出特別問題(想想數百萬或數十億的記錄)。在這種情況下,你可以使用Elasticsearch來存儲數據,然後使用Kibana (Elasticsearch/ loghide /Kibana堆棧的一部分)來構建自定義儀表板,以可視化對您來說很重要的數據的各個方面。此外,還可以使用Elasticsearch聚合功能對數據執行復雜的業務智能查詢。

基本概念

Near Realtime (NRT)

Elasticsearch是一個近乎實時的搜索平臺。這意味著從索引文檔到可以搜索的時間只有輕微的延遲(通常是1秒)。

Cluster(集群)

集群是一個或多個節點(服務器)的集合,它們共同保存你的整個數據,並提供跨所有節點的聯合索引和搜索功能。一個集群由一個唯一的名稱標識,默認這個唯一標識的名稱是"elasticsearch"。這個名稱很重要,因為如果節點被設置為按其名稱加入集群,那麼節點只能是集群的一部分。

確保不要在不同的環境中用相同的集群名稱,否則可能導致節點加入到錯誤的集群中。例如,你可以使用"logging-dev", "logging-test", "logging-prod"分別用於開發、測試和正式集群的名字。

Node(節點)

節點是一個單獨的服務器,它是集群的一部分,存儲數據,並參與集群的索引和搜索功能。就像集群一樣,節點由一個名稱來標識,默認情況下,該名稱是在啟動時分配給節點的隨機通用唯一標識符(UUID)。如果不想用默認的節點名,可以定義任何想要的節點名。這個名稱對於管理來說很重要,因為你希望識別網絡中的哪些服務器對應於你的Elasticsearch集群中的哪些節點。

一個節點可以通過配置集群名稱來加入到一個特定的集群中。默認情況下,每個節點都被設置加入到一個名字叫"elasticsearch"的集群中,這就意味著如果你啟動了很多個節點,並且假設它們彼此可以互相發現,那麼它們將自動形成並加入到一個名為"elasticsearch"的集群中。

一個集群可以有任意數量的節點。此外,如果在你的網絡上當前沒有運行任何節點,那麼此時啟動一個節點將默認形成一個單節點的名字叫"elasticsearch"的集群。

Index(索引)

索引是具有某種相似特徵的文檔的集合。例如,你可以有一個顧客數據索引,產品目錄索引和訂單數據索引。索引有一個名稱(必須是小寫的)標識,該名稱用於在對其中的文檔執行索引、搜索、更新和刪除操作時引用索引。

Document(文檔)

文檔是可以被索引的基本信息單元。文檔用JSON表示。

Shards & Replicas(分片)

一個索引可能存儲大量數據,這些數據可以超過單個節點的硬件限制。例如,一個包含10億條文檔佔用1TB磁盤空間的索引可能不適合在單個節點上,或者可能太慢而不能單獨處理來自單個節點的搜索請求。

為了解決這個問題,Elasticsearch提供了將你的索引細分為多個碎片(或者叫分片)的能力。在創建索引時,可以簡單地定義所需的分片數量。每個分片本身就是一個功能完全獨立的“索引”,可以駐留在集群中的任何節點上。

分片之所以重要,主要有兩個原因:

  • 它允許你水平地分割/擴展內容卷
  • 它允許你跨分片(可能在多個節點上)分佈和並行操作,從而提高性能和吞吐量

在一個網絡/雲環境中隨時都有可能出現故障,強烈推薦你有一個容災機制。Elasticsearch允許你將一個或者多個索引分片複製到其它地方,這被稱之為副本。

複製之所以重要,有兩個主要原因:

  • 它提供了在一個shard/node失敗是的高可用性。出於這個原因,很重要的一個點是一個副本從來不會被分配到與它複製的原始分片相同節點上。也就是說,副本是放到另外的節點上的。
  • 它允許擴展搜索量/吞吐量,因為搜索可以在所有副本上並行執行。

總而言之,每個索引都可以分割成多個分片。索引也可以被複制零(意味著沒有副本)或更多次。一旦被複制,每個索引都將具有主分片(被複制的原始分片)和副本分片(主分片的副本)。在創建索引時,可以為每個索引定義分片和副本的數量。創建索引後,您可以隨時動態地更改副本的數量,但不能更改事後分片的數量。

在默認情況下,Elasticsearch中的每個索引都分配了5個主分片和1個副本,這意味著如果集群中至少有兩個節點,那麼索引將有5個主分片和另外5個副本分片(PS:這5個副本分片組成1個完整副本),每個索引總共有10個分片。

ElasticSearch和關係型數據庫的一些術語比較:

初識ElasticSearch

ES和關係型數據庫術語比較


分享到:


相關文章: