- 一、什麼是ES
- 二、為什麼會用ES(要有ES)
- 2.1 大規模資料檢索思考
- 2.2 採用資料庫的應對解決方案
- 2.2.1 採用關係型資料庫
- 2.2.2 採用非關係型資料庫
- 2.2.3 採用記憶體資料庫
- 三、ES深入介紹
- 3.1 Lucene與Elasticsearch關係
- 3.2 Elasticsearch vs solr
- 3.2.1 Elasticsearch 與 Solr 的比較總結
- 3.3 ES的核心概念
- 3.3.1 Cluster:叢集
- 3.3.2 Node:節點
- 3.3.3 Shard:分片
- 3.3.4 Replia:副本
- 3.3.5 全文檢索
- 3.4 與關係型資料庫Mysql對比
- 3.5 ES邏輯設計(文件-->型別-->索引)
- 3.5.1 文件
- 3.5.2 型別
- 3.5.3 索引
- 3.6 ES的物理設計
- 3.7 ELK是什麼
- 3.8 ES的特點和優勢
- 四、為什麼使用Elasticsearch
- 4.1 國內外優秀案例
- 4.2 我們的業務場景
- 五、ES索引到底能處理多大資料
一、什麼是ES
- ES,即Elasticsearch是一個基於Lucene的分散式搜尋和分析引擎
- Elasticsearch是一個開源的高擴充套件的分散式全文檢索引擎,它可以近乎實時的儲存、檢索資料;本身擴充套件性很好,可以擴充套件到上百臺伺服器,處理PB級別的資料。
- Elasticsearch使用Java開發,在Apache許可條款下開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便
- 使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是透過簡單的RESTful API來隱藏Lucene的複雜性,使得全文檢索變得簡單
- 設計用途:用於分散式全文檢索,透過HTTP使用JSON進行資料索引,速度快
二、為什麼會用ES(要有ES)
- 我們有個疑問:在大規模資料中要如何快速的檢索,基於這個問題,由此引出如下思考
2.1 大規模資料檢索思考
- 當系統資料量上了10億、100億條的時候,我們在做系統架構的時候通常會從以下角度去考慮問題:
1)用什麼資料庫好?(mysql、oracle、mongodb、hbase…)
2)如何解決單點故障;(lvs、F5、A10、Zookeeper、MQ)
3)如何保證資料安全性;(熱備、冷備、異地多活)
4)如何解決檢索難題;(資料庫代理中介軟體:mysql-proxy、Cobar、MaxScale等;)
5)如何解決統計分析問題;(離線、近實時)
2.2 採用資料庫的應對解決方案
2.2.1 採用關係型資料庫
- 對於關係型資料,我們通常採用以下或類似架構去解決查詢瓶頸和寫入瓶頸:
解決要點:
1)透過主從備份解決資料安全性問題、讀寫分離提高查詢效率;
2)透過資料庫代理中介軟體心跳監測,解決單點故障問題;
3)透過代理中介軟體將查詢語句分發到各個slave節點進行查詢,並彙總結果
2.2.2 採用非關係型資料庫
- 對於Nosql資料庫,以mongodb為例,其它原理類似:
解決要點:
1)透過副本備份保證資料安全性;
2)透過節點競選機制解決單點問題;
3)先從配置庫檢索分片資訊,然後將請求分發到各個節點,最後由路由節點合併彙總結果
2.2.3 採用記憶體資料庫
- 完全把資料放在記憶體中是不可靠的,實際上也不太現實,當我們的資料達到PB級別時,按照每個節點96G記憶體計算,在記憶體完全裝滿的資料情況下,我們需要的機器是:1PB=1024T=1048576G。節點數=1048576/96=10922個
- 實際上,考慮到資料備份,節點數往往在2.5萬臺左右。成本巨大決定了其不現實!所以把資料放在記憶體也好,不放在記憶體也好,都不能完完全全解決問題。
- 全部放在記憶體速度問題是解決了,但成本問題上來了。
- 為解決以上問題,從源頭著手分析,通常會從以下方式來尋找方法:
1、儲存資料時按有序儲存;
2、將資料和索引分離;
3、壓縮資料; - 這就引出了Elasticsearch
三、ES深入介紹
3.1 Lucene與Elasticsearch關係
- 在上面的第一節中已經提到了:使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是透過簡單的RESTful API來隱藏Lucene的複雜性,使得全文檢索變得簡單。那麼什麼是Lucene呢
- 1)Lucene只是一個庫。想要使用它,你必須使用Java來作為開發語言並將其直接整合到你的應用中,更糟糕的是,Lucene非常複雜,你需要深入瞭解檢索的相關知識來理解它是如何工作的。
- 2)Elasticsearch也使用Java開發並使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是透過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜尋變得簡單
3.2 Elasticsearch vs solr
-
1)Solr是Apache Lucene專案的開源企業搜尋平臺。其主要功能包括全文檢索、命中標示、分面搜尋、動態聚類、資料庫整合,以及富文字(如Word、PDF)的處理。
2)Solr是高度可擴充套件的,並提供了分散式搜尋和索引複製。Solr是最流行的企業級搜尋引擎,Solr4 還增加了NoSQL支援。
3)Solr是用Java編寫、執行在Servlet容器(如 Apache Tomcat 或Jetty)的一個獨立的全文搜尋伺服器。 Solr採用了 Lucene Java 搜尋庫為核心的全文索引和搜尋,並具有類似REST的HTTP/XML和JSON的API。
4)Solr強大的外部配置功能使得無需進行Java編碼,便可對 其進行調整以適應多種型別的應用程式。Solr有一個外掛架構,以支援更多的高階定製
3.2.1 Elasticsearch 與 Solr 的比較總結
- 二者安裝都很簡單
- Solr 利用 Zookeeper 進行分散式管理,而 Elasticsearch 自身帶有分散式協調管理功能
- Solr 支援更多格式的資料,而 Elasticsearch 僅支援json檔案格式
- Solr 官方提供的功能更多,而 Elasticsearch 本身更注重於核心功能,高階功能多有第三方外掛提供
- Solr 在傳統的搜尋應用中表現好於 Elasticsearch,但在處理實時搜尋應用時效率明顯低於 Elasticsearch
- Solr 是傳統搜尋應用的有力解決方案,但 Elasticsearch 更適用於新興的實時搜尋應用
3.3 ES的核心概念
- ES共有5大核心概念:
- Cluster:叢集
- Node:節點
- Shard:分片
- Replia:副本
- 全文檢索
3.3.1 Cluster:叢集
- ES可以作為一個獨立的單個搜尋伺服器。不過,為了處理大型資料集,實現容錯和高可用性,ES可以執行在許多互相合作的伺服器上。這些伺服器的集合稱為叢集
3.3.2 Node:節點
- 形成叢集的每個伺服器稱為節點
3.3.3 Shard:分片
- 當有大量的文件時,由於記憶體的限制、磁碟處理能力不足、無法足夠快的響應客戶端的請求等,一個節點可能不夠。這種情況下,資料可以分為較小的分片。每個分片放到不同的伺服器上。
- 當你查詢的索引分佈在多個分片上時,ES會把查詢傳送給每個相關的分片,並將結果組合在一起,而應用程式並不知道分片的存在。即:這個過程對使用者來說是透明的
3.3.4 Replia:副本
- 為提高查詢吞吐量或實現高可用性,可以使用分片副本。
- 副本是一個分片的精確複製,每個分片可以有零個或多個副本。ES中可以有許多相同的分片,它們中的其中一個會被選擇更改索引操作,這種特殊的分片稱為主分片。
- 當主分片丟失時,如:該分片所在的資料不可用時,叢集將副本提升為新的主分片
3.3.5 全文檢索
- 全文檢索就是對一篇文章進行索引,可以根據關鍵字搜尋,類似於mysql裡的like語句。
- 全文索引就是把內容根據詞的意義進行分詞,然後分別建立索引,例如”今日是週日我們出去玩” 可能會被分詞成:“今天“,”週日“,“我們“,”出去玩“ 等token,這樣當你搜尋“週日” 或者 “出去玩” 都會把這句搜出來
3.4 與關係型資料庫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
3.5 ES邏輯設計(文件-->型別-->索引)
- 一個索引型別中,包含多個文件,比如說文件1,文件2。
- 當我們索引一篇文件時,可以透過這樣的順序找到它:
索引
▷型別
▷文件ID
,透過這個組合我們就能索引到某個具體的文件。- 注意:ID不必是整數,實際上它是個字串
3.5.1 文件
-
之前說elasticsearch是面向文件的,那麼就意味著索引和搜尋資料的最小單位是文件,elasticsearch中,文件有幾個重要屬性:
-
自我包含,一篇文件同時包含欄位和對應的值,也就是同時包含
key:value
-
可以是層次型的,一個文件中包含文件,複雜的邏輯實體就是這麼來的
-
靈活的結構,文件不依賴預先定義的模式,我們知道關係型資料庫中,要提前定義欄位才能使用,在elasticsearch中,對於欄位是非常靈活的,有時候,我們可以忽略該欄位,或者動態的新增一個新的欄位。
-
文件是無模式的,也就是說,欄位對應值的型別可以是不限型別的。
-
-
儘管我們可以隨意的新增或者忽略某個欄位,但是,每個欄位的型別非常重要,比如一個年齡欄位型別,可以是字串也可以是整型。因為elasticsearch會儲存欄位和型別之間的對映及其他的設定。這種對映具體到每個對映的每種型別,這也是為什麼在elasticsearch中,型別有時候也稱為對映型別
3.5.2 型別
- 型別是文件的邏輯容器,就像關係型資料庫一樣,表格是行的容器。
- 型別中對於欄位的定義稱為對映,比如
name
對映為字串型別。 - 我們說文件是無模式的,它們不需要擁有對映中所定義的所有欄位,比如新增一個欄位,那麼elasticsearch是怎麼做的呢
- elasticsearch會自動的將新欄位加入對映,但是這個欄位的不確定它是什麼型別,elasticsearch就開始猜,如果這個值是18,那麼elasticsearch會認為它是整型。
- 但是elasticsearch也可能猜不對,所以最安全的方式就是提前定義好所需要的對映,這點跟關係型資料庫殊途同歸了,先定義好欄位,然後再使用,別整什麼么蛾子。後面在討論更多關於對映的東西
3.5.3 索引
- 索引是對映型別的容器,elasticsearch中的索引是一個非常大的文件集合。索引儲存了對映型別的欄位和其他設定。然後它們被儲存到了各個分片上了
3.6 ES的物理設計
一個叢集包含至少一個節點,而一個節點就是一個elasticsearch程序。節點內可以有多個索引。
每個索引會被分成多個分片shards進行儲存,elasticsearch預設建立索引是分配5個主分片進行儲存(需要注意的是es7.0預設索引分片數調整為1了),而每個分片又有一個副本(replica shard,又稱複製分片),這樣,就有了10個分片。上圖只是展示了ES叢集的簡單樣例
分片的建立多少比較合適:分片可以按照叢集的數量相乘5,例如有2臺叢集,那麼分片設定的數量為10(number_of_shards)是比較合適,分片會均勻分配到所有的叢集,每個叢集節點都有5主5副的分片,共10主,10副。
預設標準是每個節點5個分片。
- 為什麼是每個節點單個索引最多五個分片?這是因為es官方為了保證節點的安全,而去設定的一個限制。一次檢索,單個索引在一個節點上命中的分片數只能有5個。假如單個節點大於5個分片,則需要序列去處理資料了
那麼這個索引是如何儲存在叢集中的呢?
圖中有3個節點的叢集,可以看到主分片和對應的複製分片都不會在同一個節點內,這樣有利於某個節點掛掉了,資料也不至於丟失。
實際上,一個分片是一個Lucene索引,一個包含倒排索引的檔案目錄,倒排索引的結構使得elasticsearch在不掃描全部文件的情況下,就能告訴你哪些文件包含特定的關鍵字
3.7 ELK是什麼
-
ELK=elasticsearch+Logstash+kibana
-
elasticsearch:後臺分散式儲存以及全文檢索
-
logstash: 日誌加工、“搬運工”
-
kibana:資料視覺化展示。
-
-
ELK架構為資料分散式儲存、視覺化查詢和日誌解析建立了一個功能強大的管理鏈。 三者相互配合,取長補短,共同完成分散式大資料處理工作。
3.8 ES的特點和優勢
-
1)分散式實時檔案儲存,可將每一個欄位存入索引,使其可以被檢索到。
-
2)實時分析的分散式搜尋引擎。
- 分散式:索引分拆成多個分片,每個分片可有零個或多個副本。叢集中的每個資料節點都可承載一個或多個分片,並且協調和處理各種操作;
- 負載再平衡和路由在大多數情況下自動完成。
-
3)可以擴充套件到上百臺伺服器,處理PB級別的結構化或非結構化資料。也可以執行在單臺PC上(已測試)
-
4)支援外掛機制,分詞外掛、同步外掛、Hadoop外掛、視覺化外掛等。
四、為什麼使用Elasticsearch
4.1 國內外優秀案例
1) 2013年初,GitHub拋棄了Solr,採取ElasticSearch 來做PB級的搜尋。 “GitHub使用ElasticSearch搜尋20TB的資料,包括13億檔案和1300億行程式碼”。
2)維基百科:啟動以elasticsearch為基礎的核心搜尋架構。
3)SoundCloud:“SoundCloud使用ElasticSearch為1.8億使用者提供即時而精準的音樂搜尋服務”。
4)百度:百度目前廣泛使用ElasticSearch作為文字資料分析,採集百度所有伺服器上的各類指標資料及使用者自定義資料,透過對各種資料進行多維分析展示,輔助定位分析例項異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單叢集最大100臺機器,200個ES節點,每天匯入30TB+資料。
5)新浪ES 如何分析處理32億條實時日誌
6)阿里ES 構建挖財自己的日誌採集和分析體系
7)有贊ES 業務日誌處理
4.2 我們的業務場景
-
實際專案開發實戰中,幾乎每個系統都會有一個搜尋的功能,當搜尋做到一定程度時,維護和擴充套件起來難度就會慢慢變大,所以很多公司都會把搜尋單獨獨立出一個模組,用ElasticSearch等來實現。
-
近年ElasticSearch發展迅猛,已經超越了其最初的純搜尋引擎的角色,現在已經增加了資料聚合分析(aggregation)和視覺化的特性,如果你有數百萬的文件需要透過關鍵詞進行定位時,ElasticSearch肯定是最佳選擇。當然,如果你的文件是JSON的,你也可以把ElasticSearch當作一種“NoSQL資料庫”, 應用ElasticSearch資料聚合分析(aggregation)的特性,針對資料進行多維度的分析。
-
嘗試使用ES來替代傳統的NoSQL,它的橫向擴充套件機制太方便了
-
應用場景:
- 新系統開發嘗試使用ES作為儲存和檢索伺服器;
- 現有系統升級需要支援全文檢索服務,需要使用ES
五、ES索引到底能處理多大資料
-
單一索引的極限取決於儲存索引的硬體、索引的設計、如何處理資料以及你為索引備份了多少副本。
-
通常來說,一個Lucene索引(也就是一個elasticsearch分片,一個es索引預設5個分片)不能處理多於21億篇文件,或者多於2740億的唯一詞條。但達到這個極限之前,我們可能就沒有足夠的磁碟空間了!當然,一個分片如何很大的話,讀寫效能將會變得非常差