ElasticSearch介紹
Elasticsearch(ES) 是一個基于Lucene構(gòu)建的開源鲸阻、分布式疲眷、RESTful接口的全文搜索引擎少孝。Elasticsearch還是一個分布式文檔數(shù)據(jù)庫 饿序,可以在極短的時間內(nèi)存儲、搜索和分析大量的數(shù)據(jù)管嬉。通常作為具有復雜搜索場景情況下的核心發(fā)動機皂林。
具有以下特點:
- 分布式的實時文件存儲,每個字段都被索引并可被搜索
- 分布式的實時分析搜索引擎
- 可以擴展到上百臺服務(wù)器蚯撩,處理PB級結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
Elasticsearch(ES)集群架構(gòu)圖如下圖所示:
Elasticsearch用于構(gòu)建高可用和可擴展的系統(tǒng)础倍。擴展的方式可以是購買更好的服務(wù)器(縱向擴展(vertical scale or scaling up))或者購買更多的服務(wù)(橫向擴展(horizontal scale or scaling out))。Elasticsearch雖然能從更強大的硬件中獲得更好的性能胎挎,但是縱向擴展有它的局限性沟启。真正的擴展應(yīng)該是橫向的,它通過增加節(jié)點來均攤負載和增加可靠性呀癣。對于大多數(shù)數(shù)據(jù)庫而言美浦,橫向擴展意味著你的程序?qū)⒆龇浅4蟮母膭硬拍芾眠@些新添加的設(shè)備弦赖。對比來說项栏,Elasticsearch天生就是分布式的:它知道如何管理節(jié)點來提供高擴展和高可用。這意味著你的程序不需要關(guān)心這些蹬竖。
Elasticsearch 生活運用場景
當你經(jīng)營一家網(wǎng)上商店沼沈,你可以讓你的客戶搜索你賣的商品。在這種情況下币厕,你可以使用ElasticSearch來存儲你的整個產(chǎn)品目錄和庫存信息列另,為客戶提供精準搜索,可以為客戶推薦相關(guān)商品旦装。
當你想收集日志或者交易數(shù)據(jù)的時候页衙,需要分析和挖掘這些數(shù)據(jù),尋找趨勢阴绢,進行統(tǒng)計店乐,總結(jié),或發(fā)現(xiàn)異常呻袭。在這種情況下眨八,你可以使用Logstash或者其他工具來進行收集數(shù)據(jù),當這引起數(shù)據(jù)存儲到ElasticsSearch中左电。你可以搜索和匯總這些數(shù)據(jù)廉侧,找到任何你感興趣的信息页响。
生活中運用的手機APP用戶發(fā)布信息的快速搜索以及存儲,并且運營商可以根據(jù)存儲的數(shù)據(jù)進行大數(shù)據(jù)分析段誊,和個性推薦機制等場景闰蚕。
如下圖是推特的使用場景圖:
Elasticsearch基本概念
Near Realtime(NRT) 幾乎實時:
Elasticsearch是一個幾乎實時的搜索平臺。意思是连舍,從索引一個文檔到這個文檔可被搜索只需要一點點的延遲陪腌,這個時間一般為毫秒級。
Cluster 集群:
群集是一個或多個節(jié)點(服務(wù)器)的集合烟瞧, 這些節(jié)點共同保存整個數(shù)據(jù)诗鸭,并在所有節(jié)點上提供聯(lián)合索引和搜索功能。一個集群由一個唯一集群ID確定参滴,并指定一個集群名(默認為“elasticsearch”)强岸。該集群名非常重要,因為節(jié)點可以通過這個集群名加入群集砾赔,一個節(jié)點只能是群集的一部分蝌箍。
確保在不同的環(huán)境中不要使用相同的群集名稱,否則可能會導致連接錯誤的群集節(jié)點暴心。例如妓盲,你可以使用logging-dev、logging-stage专普、logging-prod分別為開發(fā)悯衬、階段產(chǎn)品、生產(chǎn)集群做記錄檀夹。
Node節(jié)點:
節(jié)點是單個服務(wù)器實例筋粗,它是群集的一部分,可以存儲數(shù)據(jù)炸渡,并參與群集的索引和搜索功能娜亿。就像一個集群,節(jié)點的名稱默認為一個隨機的通用唯一標識符(UUID)蚌堵,確定在啟動時分配給該節(jié)點买决。如果不希望默認,可以定義任何節(jié)點名吼畏。這個名字對管理很重要督赤,目的是要確定你的網(wǎng)絡(luò)服務(wù)器對應(yīng)于你的ElasticSearch群集節(jié)點。
我們可以通過群集名配置節(jié)點以連接特定的群集宫仗。默認情況下够挂,每個節(jié)點設(shè)置加入名為“elasticSearch”的集群。這意味著如果你啟動多個節(jié)點在網(wǎng)絡(luò)上藕夫,假設(shè)他們能發(fā)現(xiàn)彼此都會自動形成和加入一個名為“elasticsearch”的集群孽糖。
在單個群集中枯冈,您可以擁有盡可能多的節(jié)點。此外办悟,如果“elasticsearch”在同一個網(wǎng)絡(luò)中尘奏,沒有其他節(jié)點正在運行,從單個節(jié)點的默認情況下會形成一個新的單節(jié)點名為"elasticsearch"的集群病蛉。
Index索引:
索引是具有相似特性的文檔集合炫加。例如,可以為客戶數(shù)據(jù)提供索引铺然,為產(chǎn)品目錄建立另一個索引俗孝,以及為訂單數(shù)據(jù)建立另一個索引。索引由名稱(必須全部為小寫)標識魄健,該名稱用于在對其中的文檔執(zhí)行索引赋铝、搜索、更新和刪除操作時引用索引沽瘦。在單個群集中革骨,您可以定義盡可能多的索引。
Type類型:
在索引中析恋,可以定義一個或多個類型良哲。類型是索引的邏輯類別/分區(qū),其語義完全取決于您助隧。一般來說筑凫,類型定義為具有公共字段集的文檔。例如喇颁,假設(shè)你運行一個博客平臺漏健,并將所有數(shù)據(jù)存儲在一個索引中。在這個索引中橘霎,您可以為用戶數(shù)據(jù)定義一種類型,為博客數(shù)據(jù)定義另一種類型殖属,以及為注釋數(shù)據(jù)定義另一類型姐叁。
Document文檔:
文檔是可以被索引的信息的基本單位。例如洗显,您可以為單個客戶提供一個文檔外潜,單個產(chǎn)品提供另一個文檔,以及單個訂單提供另一個文檔挠唆。本文件的表示形式為JSON(JavaScript Object Notation)格式处窥,這是一種非常普遍的互聯(lián)網(wǎng)數(shù)據(jù)交換格式。
在索引/類型中玄组,您可以存儲盡可能多的文檔滔驾。請注意谒麦,盡管文檔物理駐留在索引中,文檔實際上必須索引或分配到索引中的類型哆致。
Shards & Replicas分片與副本:
索引可以存儲大量的數(shù)據(jù)绕德,這些數(shù)據(jù)可能超過單個節(jié)點的硬件限制。例如摊阀,十億個文件占用磁盤空間1TB的單指標可能不適合對單個節(jié)點的磁盤或可能太慢服務(wù)僅從單個節(jié)點的搜索請求耻蛇。
為了解決這一問題,Elasticsearch提供細分你的指標分成多個塊稱為分片的能力胞此。當你創(chuàng)建一個索引臣咖,你可以簡單地定義你想要的分片數(shù)量。每個分片本身是一個全功能的漱牵、獨立的“指數(shù)”亡哄,可以托管在集群中的任何節(jié)點。
Shards分片的重要性主要體現(xiàn)在以下兩個特征:
分片允許您水平拆分或縮放內(nèi)容的大小
分片允許你分配和并行操作的碎片(可能在多個節(jié)點上)從而提高性能/吞吐量
這個機制中的碎片是分布式的以及其文件匯總到搜索請求是完全由ElasticSearch管理布疙,對用戶來說是透明的蚊惯。
在同一個集群網(wǎng)絡(luò)或云環(huán)境上,故障是任何時候都會出現(xiàn)的灵临,擁有一個故障轉(zhuǎn)移機制以防分片和結(jié)點因為某些原因離線或消失是非常有用的截型,并且被強烈推薦。為此儒溉,Elasticsearch允許你創(chuàng)建一個或多個拷貝宦焦,你的索引分片進入所謂的副本或稱作復制品的分片,簡稱Replicas顿涣。
Replicas的重要性主要體現(xiàn)在以下兩個特征:
副本為分片或節(jié)點失敗提供了高可用性波闹。為此,需要注意的是涛碑,一個副本的分片不會分配在同一個節(jié)點作為原始的或主分片精堕,副本是從主分片那里復制過來的。
副本允許用戶擴展你的搜索量或吞吐量蒲障,因為搜索可以在所有副本上并行執(zhí)行歹篓。
此分片副本存儲方式和GLUSTER FS 分布式條帶卷存儲方式類似。
ElasticSearch和關(guān)系型數(shù)據(jù)庫相關(guān)概念的對應(yīng)關(guān)系:
Elasticsearch | 關(guān)系型數(shù)據(jù)庫 |
---|---|
數(shù)據(jù)庫(Database) | 索引(Index)揉阎,支持全文檢索 |
表(Table) | 類型(Type) |
數(shù)據(jù)行(Row) | 文檔(Document)庄撮,但不需要固定結(jié)構(gòu),不同文檔可以具有不同字段集合 |
數(shù)據(jù)列(Column) | 字段(Field) |
模式(Schema) | 映像(Mapping) |