天天看點

ES(Elasticsearch)簡述

ES是一個基于RESTful web接口并且建構在Apache Lucene之上的開源分布式搜尋引擎。

同時ES還是一個分布式文檔資料庫,其中每個字段均可被索引,而且每個字段的資料均可被搜尋,能夠橫向擴充至數以百計的伺服器存儲以及處理PB級的資料。

可以在極短的時間記憶體儲、搜尋和分析大量的資料。通常作為具有複雜搜尋場景情況下的核心發動機。

ES就是為高可用和可擴充而生的。一方面可以通過更新硬體來完成系統擴充,稱為垂直或向上擴充(Vertical Scale/Scaling Up)。

另一方面,增加更多的伺服器來完成系統擴充,稱為水準擴充或者向外擴充(Horizontal Scale/Scaling Out)。盡管ES能夠利用更強勁的硬體,但是垂直擴充畢竟還是有它的極限。真正的可擴充性來自于水準擴充,通過向叢集中添加更多的節點來分擔負載,增加可靠性。ES天生就是分布式的,它知道如何管理多個節點來完成擴充和實作高可用性。意味應用不需要做任何的改動。

ES(Elasticsearch)簡述

Gateway,代表ES索引的持久化存儲方式。在Gateway中,ES預設先把索引存儲在記憶體中,然後當記憶體滿的時候,再持久化到Gateway裡。當ES叢集關閉或重新開機的時候,它就會從Gateway裡去讀取索引資料。比如LocalFileSystem和HDFS、AS3等。

DistributedLucene Directory,它是Lucene裡的一些列索引檔案組成的目錄。它負責管理這些索引檔案。包括資料的讀取、寫入,以及索引的添加和合并等。

River,代表是資料源。是以插件的形式存在于ES中。 

Mapping,映射的意思,非常類似于靜态語言中的資料類型。比如我們聲明一個int類型的變量,那以後這個變量隻能存儲int類型的資料。比如我們聲明一個double類型的mapping字段,則隻能存儲double類型的資料。

Mapping不僅是告訴ES,哪個字段是哪種類型。還能告訴ES如何來索引資料,以及資料是否被索引到等。

Search Moudle,搜尋子產品,支援搜尋的一些常用操作

Index Moudle,索引子產品,支援索引的一些常用操作

Disvcovery,主要是負責叢集的master節點發現。比如某個節點突然離開或進來的情況,進行一個分片重新分片等。這裡有個發現機制。

發現機制預設的實作方式是單點傳播和多點傳播的形式,即Zen,同時也支援點對點的實作。另外一種是以插件的形式,即EC2。

Scripting,即腳本語言。包括很多,這裡不多贅述。如mvel、js、python等。   

Transport,代表ES内部節點,代表跟叢集的用戶端互動。包括 Thrift、Memcached、Http等協定

RESTful Style API,通過RESTful方式來實作API程式設計。

3rd plugins,代表第三方插件。

Java(Netty),是開發架構。

JMX,是監控。

使用案例

1、将ES作為網站的主要後端系統

比如現在搭建一個部落格系統,對于部落格文章的資料可以直接在ES上存儲,并且使用ES來進行檢索,統計。ES提供了持久化的存儲、統計和很多其他資料存儲的特性。

注意:但是像其他的NOSQL資料存儲一樣,ES是不支援事務的,如果要事務機制,還是考慮使用其他的資料庫做真實庫。

ES(Elasticsearch)簡述

2、将ES添加到現有系統

有些時候不需要ES提供所有資料的存儲功能,隻是想在一個資料存儲的基礎之上使用ES。比如已經有一個複雜的系統在運作,但是現在想加一個搜尋的功能,就可以使用該方案。

ES(Elasticsearch)簡述

3、将ES作為現有解決方案的後端部分

因為ES是開源的系統,提供了直接的HTTP接口,并且現在有一個大型的生态系統在支援他。比如現在我們想部署大規模的日志架構、用于存儲、搜尋和分析海量的事件,考慮到現有的工具可以寫入和讀取ES,可以不需要進行任何開發,配置這些工具就可以去運作。

ES(Elasticsearch)簡述

設計結構

1、邏輯設計

文檔

文檔是可以被索引的資訊的基本機關,它包含幾個重要的屬性:

  1. 是自我包含的。一篇文檔同時包含字段和他們的取值。
  2. 是層次型的。文檔中還可以包含新的文檔,一個字段的取值可以是簡單的,例如location字段的取值可以是字元串,還可以包含其他字段和取值,比如可以同時包含城市和街道位址。
  3. 擁有靈活的結構。文檔不依賴于預先定義的模式。也就是說并非所有的文檔都需要擁有相同的字段,并不受限于同一個模式

{

  "name":"meeting",

  "location":"office",

  "organizer":"yanping"

}

{

  "name":"meeting",

  "location":{

    "name":"sheshouzuo",

       "date":"2019-6-28"

  },

  "memebers":["leio","shiyi"]

}

類型

類型是文檔的邏輯容器,類似于表格是行的容器。在不同的類型中,最好放入不同的結構的文檔。

字段

ES中,每個文檔,其實是以json形式存儲的。而一個文檔可以被視為多個字段的集合。

映射

每個類型中字段的定義稱為映射。例如,name字段映射為String。

索引

索引是映射類型的容器一個ES的索引非常像關系型世界中的資料庫,是獨立的大量文檔集合。

關系型資料庫與ES的結構上的對比

ES(Elasticsearch)簡述
ES(Elasticsearch)簡述

2、實體設計

節點

一個節點是一個ES的執行個體,在伺服器上啟動ES之後,就擁有了一個節點,如果在另一個伺服器上啟動ES,這就是另一個節點。甚至可以在一台伺服器上啟動多個ES程序,在一台伺服器上擁有多個節點。多個節點可以加入同一個叢集。

當ElasticSearch的節點啟動後,它會利用多點傳播(multicast)(或者單點傳播,如果使用者更改了配置)尋找叢集中的其它節點,并與之建立連接配接。這個過程如下圖所示:

ES(Elasticsearch)簡述

節點主要有3種類型,第一種類型是client_node,主要是起到請求分發的作用,類似路由。第二種類型是master_node,是主的節點,所有的新增,删除,資料分片都是由主節點操作(elasticsearch底層是沒有更新資料操作的,上層對外提供的更新實際上是删除了再新增),當然也能承擔搜尋操作。第三種類型是date_node,該類型的節點隻能做搜尋操作,具體會配置設定到哪個date_node,就是由client_node決定,而data_node的資料都是從master_node同步過來的

分片

一個索引可以存儲超出單個結點硬體限制的大量資料。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜尋請求,響應太慢。

為了解決這個問題,ES提供了将索引劃分成多份的能力,這些份就叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。

分片之是以重要,主要有兩方面的原因:

1、允許你水準分割/擴充你的内容容量

允許你在分片(潛在地,位于多個節點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量

至于一個分片怎樣分布,它的文檔怎樣聚合回搜尋請求,是完全由ES管理的,對于作為使用者的你來說,這些都是透明的。

2、在一個網絡/雲的環境裡,失敗随時都可能發生,在某個分片/節點不知怎麼的就處于離線狀态,或者由于任何原因消失了。這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,ES允許你建立分片的一份或多份拷貝,這些拷貝叫做複制分片,或者直接叫複制。

複制之是以重要,主要有兩方面的原因:

(1)在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複制分片從不與原/主要(original/primary)分片置于同一節點上是非常重要的。

(2)擴充你的搜尋量/吞吐量,因為搜尋可以在所有的複制上并行運作

總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複制)或多次。一旦複制了,每個索引就有了主分片(作為複制源的原來的分片)和複制分片(主分片的拷貝)之别。分片和複制的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動态地改變複制數量,但是不能改變分片的數量。

預設情況下,ES中的每個索引被分片5個主分片和1個複制,這意味着,如果你的叢集中至少有兩個節點,你的索引将會有5個主分片和另外5個複制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。一個索引的多個分片可以存放在叢集中的一台主機上,也可以存放在多台主機上,這取決于你的叢集機器數量。主分片和複制分片的具體位置是由ES内在的政策所決定的。

3、插件HEAD

elasticsearch-head是一個界面化的叢集操作和管理工具

ES(Elasticsearch)簡述

● node:即一個 Elasticsearch 的運作執行個體,使用多點傳播或單點傳播方式發現 cluster 并加入。

● cluster:包含一個或多個擁有相同叢集名稱的 node,其中包含一個master node。

● index:類比關系型資料庫裡的DB,是一個邏輯命名空間。

● alias:可以給 index 添加零個或多個alias,通過 alias 使用index 和根據index name 通路index一樣,但是,alias給我們提供了一種切換index的能力,比如重建了index,取名● customer_online_v2,這時,有了alias,我要通路新 index,隻需要把 alias 添加到新 index 即可,并把alias從舊的 index 删除。不用修改代碼。

● type:類比關系資料庫裡的Table。其中,一個index可以定義多個type,但一般使用習慣僅配一個type。

● mapping:類比關系型資料庫中的 schema 概念,mapping 定義了 index 中的 type。mapping 可以顯示的定義,也可以在 document 被索引時自動生成,如果有新的 field,Elasticsearch 會自動推測出 field 的type并加到mapping中。

● document:類比關系資料庫裡的一行記錄(record),document 是 Elasticsearch 裡的一個 JSON 對象,包括零個或多個field。

● field:類比關系資料庫裡的field,每個field 都有自己的字段類型。

● shard:是一個Lucene 執行個體。Elasticsearch 基于 Lucene,shard 是一個 Lucene 執行個體,被 Elasticsearch 自動管理。之前提到,index 是一個邏輯命名空間,shard 是具體的實體概念,建索引、查詢等都是具體的shard在工作。shard 包括primary shard 和 replica shard,寫資料時,先寫到primary shard,然後,同步到replica shard,查詢時,primary 和 replica 充當相同的作用。replica shard 可以有多份,也可以沒有,replica shard的存在有兩個作用,一是容災,如果primary shard 挂了,資料也不會丢失,叢集仍然能正常工作;二是提高性能,因為replica 和 primary shard 都能處理查詢。另外,如上圖右側紅框所示,shard數和replica數都可以設定,但是,shard 數隻能在建立index 時設定,後期不能更改,但是,replica 數可以随時更改。但是,由于 Elasticsearch 很友好的封裝了這部分,在使用Elasticsearch 的過程中,我們一般僅需要關注 index 即可,不需關注shard。

shard、node、cluster 在實體上構成了 Elasticsearch 叢集,field、type、index 在邏輯上構成一個index的基本概念,在使用 Elasticsearch 過程中,我們一般關注到邏輯概念就好,就像我們在使用MySQL 時,我們一般就關注DB Name、Table和schema即可,而不會關注DBA維護了幾個MySQL執行個體、master 和 slave 等怎麼部署的一樣。

繼續閱讀