1. 程式人生 > >Es學習第一課,瞭解基本功能和概念

Es學習第一課,瞭解基本功能和概念

    Elasticsearch作為這幾年最流行的搜尋引擎,越來越多的網際網路企業都在採用它;作為java開發者來說,如果想進一步提高自己能力,同時也為了能夠在實際工作中遇到搜尋、儲存問題多一個解決方案,學習ES絕對大家工作、學習乃至找工作都是一個極大的好處。下面我就結合自己學習ES的一些心路歷程,把它的原理、安裝、使用以及常用功能分別做下介紹。

什麼是Elasticsearch?

Elasticsearch 是一個分散式可擴充套件的實時搜尋和分析引擎,一個建立在全文搜尋引擎 Apache Lucene(TM) 基礎上的搜尋引擎.當然 Elasticsearch 並不僅僅是 Lucene 那麼簡單,它不僅包括了全文搜尋功能,還可以進行以下工作:

  • 分散式實時檔案儲存,並將每一個欄位都編入索引,使其可以被搜尋。
  • 實時分析的分散式搜尋引擎。
  • 可以擴充套件到上百臺伺服器,處理PB級別的結構化或非結構化資料。

ES能做什麼工作?

 1)檢索資料: 對於海量資料的應用,一般關係型資料庫檢索問題一直是噩夢,ES就算為解決它而生,有了它快速搜尋不再是開發者頭痛的難題
 2)分散式儲存:相對於傳統儲存解決方案,ES提供的分片、持久化方案,既比關係型型別資料庫速度快、又比快取資料庫(如REDIS等)存的多、持久化也更好
 3)資料分析: ES結合Logstash、Kibana 構成大名鼎鼎的ELK,實時大規模的日誌收集、分析和展示,讓使用者可以多維度對日誌實現分析、查詢和管理。

 ES基本構成

 Elasticsearch是面向文件型資料庫,一條資料在這裡就是一個文件,用JSON作為文件序列化的格式;因為它是分散式儲存結構,所以有以下幾個基本概念:

叢集(Cluster):一個叢集是由一個或多個節點(伺服器)組成的,通過所有的節點一起儲存你的全部資料並且提供聯合索引和搜尋功能的節點集合。每個叢集有一個唯一的名稱標識,預設是“elasticsearch”。這個名稱非常重要,因為一個節點(Node)只有設定了這個名稱才能加入叢集,成為叢集的一部分。

節點(Node):

一個節點是一個單一的伺服器,是你的叢集的一部分,儲存資料,並且參與叢集的索引和搜尋功能。跟叢集一樣,節點在啟動時也會被分配一個唯一的標識名稱,這個名稱預設是一個隨機的UUID(Universally Unique IDentifier)。如果你不想用預設的名稱,你可以自己定義節點的名稱。這個名稱對於管理叢集節點,識別哪臺伺服器對應叢集中的哪個節點有重要的作用。

一個節點可以通過配置特定的叢集名稱來加入特定的叢集。預設情況下,每個節點被設定加入一個名稱為“elasticsearch”的叢集,這意味著如果你在你的網路中啟動了一些節點,並且假設它們能相互發現,它們將會自動組織並加入一個名稱是“elasticsearch”的叢集。

索引(Index):

  一個索引就是含有某些相似特性的文件的集合。例如,你可以有一個使用者資料的索引,一個產品目錄的索引,還有其他的有規則資料的索引。一個索引被一個名稱(必須都是小寫)唯一標識,並且這個名稱被用於索引通過文件去執行索引,搜尋,更新和刪除操作。

型別(Type):

  在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。

文件(document):
        一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件,某一個產品的一個文件,當然,也可以擁有某個訂單的一個文件。文件以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的網際網路資料互動格式。
        在一個index/type裡面,只要你想,你可以儲存任意多的文件。注意,儘管一個文件,物理上存在於一個索引之中,文件必須被索引/賦予一個索引的type。

分片和複製(shards & replicas):

一個索引可以儲存超出單個結點硬體限制的大量資料。比如,一個具有10億文件的索引佔據1TB的磁碟空間,而任一節點都沒有這樣大的磁碟空間;或者單個節點處理搜尋請求,響應太慢。
        
        為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。
        
        分片之所以重要,主要有兩方面的原因:
        
            - 允許你水平分割/擴充套件你的內容容量
            - 允許你在分片(潛在地,位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量
        
        至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。
        
        在一個網路/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。
        
        複製之所以重要,有兩個主要原因:
            - 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。
            - 擴充套件你的搜尋量/吞吐量,因為搜尋可以在所有的複製上並行執行
            
        總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。
        
        預設情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

 和MYSQL的比較

上面是文字介紹,下面用一個圖片來說明,這個圖片是把ES和傳統關係型資料庫MYSQL來做比較,看一遍基本就能明白上面所說的概念

(1)關係型資料庫中的資料庫(DataBase),等價於ES中的索引(Index) 
(2)一個數據庫下面有N張表(Table),等價於1個索引Index下面有N多型別(Type), 
(3)一個數據庫表(Table)下的資料由多行(ROW)多列(column,屬性)組成,等價於1個Type由多個文件(Document)和多Field組成。 
(4)在一個關係型資料庫裡面,schema定義了表、每個表的欄位,還有表和欄位之間的關係。 與之對應的,在ES中:Mapping定義索引下的Type的欄位處理規則,即索引如何建立、索引型別、是否儲存原始索引JSON文件、是否壓縮原始JSON文件、是否需要分詞處理、如何進行分詞處理等。 
(5)在資料庫中的增insert、刪delete、改update、查search操作等價於ES中的增PUT/POST、刪Delete、改_update、查GET.

好了,這一篇就講這些內容,下一篇就會講比較好玩的安裝和初步使用了!!!