ElasticSearch介紹
Elasticsearch(ES) 是一個(gè)基于Lucene構(gòu)建的開源、分布式、RESTful接口的全文搜索引擎。Elasticsearch還是一個(gè)分布式文檔數(shù)據(jù)庫 ,可以在極短的時(shí)間內(nèi)存儲(chǔ)、搜索和分析大量的數(shù)據(jù)。通常作為具有復(fù)雜搜索場(chǎng)景情況下的核心發(fā)動(dòng)機(jī)。
具有以下特點(diǎn):
- 分布式的實(shí)時(shí)文件存儲(chǔ),每個(gè)字段都被索引并可被搜索
- 分布式的實(shí)時(shí)分析搜索引擎
- 可以擴(kuò)展到上百臺(tái)服務(wù)器,處理PB級(jí)結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
Elasticsearch(ES)集群架構(gòu)圖如下圖所示:
Elasticsearch用于構(gòu)建高可用和可擴(kuò)展的系統(tǒng)。擴(kuò)展的方式可以是購(gòu)買更好的服務(wù)器(縱向擴(kuò)展(vertical scale or scaling up))或者購(gòu)買更多的服務(wù)(橫向擴(kuò)展(horizontal scale or scaling out))。Elasticsearch雖然能從更強(qiáng)大的硬件中獲得更好的性能,但是縱向擴(kuò)展有它的局限性。真正的擴(kuò)展應(yīng)該是橫向的,它通過增加節(jié)點(diǎn)來均攤負(fù)載和增加可靠性。對(duì)于大多數(shù)數(shù)據(jù)庫而言,橫向擴(kuò)展意味著你的程序?qū)⒆龇浅4蟮母膭?dòng)才能利用這些新添加的設(shè)備。對(duì)比來說,Elasticsearch天生就是分布式的:它知道如何管理節(jié)點(diǎn)來提供高擴(kuò)展和高可用。這意味著你的程序不需要關(guān)心這些。
Elasticsearch 生活運(yùn)用場(chǎng)景
當(dāng)你經(jīng)營(yíng)一家網(wǎng)上商店,你可以讓你的客戶搜索你賣的商品。在這種情況下,你可以使用ElasticSearch來存儲(chǔ)你的整個(gè)產(chǎn)品目錄和庫存信息,為客戶提供精準(zhǔn)搜索,可以為客戶推薦相關(guān)商品。
當(dāng)你想收集日志或者交易數(shù)據(jù)的時(shí)候,需要分析和挖掘這些數(shù)據(jù),尋找趨勢(shì),進(jìn)行統(tǒng)計(jì),總結(jié),或發(fā)現(xiàn)異常。在這種情況下,你可以使用Logstash或者其他工具來進(jìn)行收集數(shù)據(jù),當(dāng)這引起數(shù)據(jù)存儲(chǔ)到ElasticsSearch中。你可以搜索和匯總這些數(shù)據(jù),找到任何你感興趣的信息。
生活中運(yùn)用的手機(jī)APP用戶發(fā)布信息的快速搜索以及存儲(chǔ),并且運(yùn)營(yíng)商可以根據(jù)存儲(chǔ)的數(shù)據(jù)進(jìn)行大數(shù)據(jù)分析,和個(gè)性推薦機(jī)制等場(chǎng)景。
如下圖是推特的使用場(chǎng)景圖:
Elasticsearch基本概念
Near Realtime(NRT) 幾乎實(shí)時(shí):
Elasticsearch是一個(gè)幾乎實(shí)時(shí)的搜索平臺(tái)。意思是,從索引一個(gè)文檔到這個(gè)文檔可被搜索只需要一點(diǎn)點(diǎn)的延遲,這個(gè)時(shí)間一般為毫秒級(jí)。
Cluster 集群:
群集是一個(gè)或多個(gè)節(jié)點(diǎn)(服務(wù)器)的集合, 這些節(jié)點(diǎn)共同保存整個(gè)數(shù)據(jù),并在所有節(jié)點(diǎn)上提供聯(lián)合索引和搜索功能。一個(gè)集群由一個(gè)唯一集群ID確定,并指定一個(gè)集群名(默認(rèn)為“elasticsearch”)。該集群名非常重要,因?yàn)楣?jié)點(diǎn)可以通過這個(gè)集群名加入群集,一個(gè)節(jié)點(diǎn)只能是群集的一部分。
確保在不同的環(huán)境中不要使用相同的群集名稱,否則可能會(huì)導(dǎo)致連接錯(cuò)誤的群集節(jié)點(diǎn)。例如,你可以使用logging-dev、logging-stage、logging-prod分別為開發(fā)、階段產(chǎn)品、生產(chǎn)集群做記錄。
Node節(jié)點(diǎn):
節(jié)點(diǎn)是單個(gè)服務(wù)器實(shí)例,它是群集的一部分,可以存儲(chǔ)數(shù)據(jù),并參與群集的索引和搜索功能。就像一個(gè)集群,節(jié)點(diǎn)的名稱默認(rèn)為一個(gè)隨機(jī)的通用唯一標(biāo)識(shí)符(UUID),確定在啟動(dòng)時(shí)分配給該節(jié)點(diǎn)。如果不希望默認(rèn),可以定義任何節(jié)點(diǎn)名。這個(gè)名字對(duì)管理很重要,目的是要確定你的網(wǎng)絡(luò)服務(wù)器對(duì)應(yīng)于你的ElasticSearch群集節(jié)點(diǎn)。
我們可以通過群集名配置節(jié)點(diǎn)以連接特定的群集。默認(rèn)情況下,每個(gè)節(jié)點(diǎn)設(shè)置加入名為“elasticSearch”的集群。這意味著如果你啟動(dòng)多個(gè)節(jié)點(diǎn)在網(wǎng)絡(luò)上,假設(shè)他們能發(fā)現(xiàn)彼此都會(huì)自動(dòng)形成和加入一個(gè)名為“elasticsearch”的集群。
在單個(gè)群集中,您可以擁有盡可能多的節(jié)點(diǎn)。此外,如果“elasticsearch”在同一個(gè)網(wǎng)絡(luò)中,沒有其他節(jié)點(diǎn)正在運(yùn)行,從單個(gè)節(jié)點(diǎn)的默認(rèn)情況下會(huì)形成一個(gè)新的單節(jié)點(diǎn)名為"elasticsearch"的集群。
Index索引:
索引是具有相似特性的文檔集合。例如,可以為客戶數(shù)據(jù)提供索引,為產(chǎn)品目錄建立另一個(gè)索引,以及為訂單數(shù)據(jù)建立另一個(gè)索引。索引由名稱(必須全部為小寫)標(biāo)識(shí),該名稱用于在對(duì)其中的文檔執(zhí)行索引、搜索、更新和刪除操作時(shí)引用索引。在單個(gè)群集中,您可以定義盡可能多的索引。
Type類型:
在索引中,可以定義一個(gè)或多個(gè)類型。類型是索引的邏輯類別/分區(qū),其語義完全取決于您。一般來說,類型定義為具有公共字段集的文檔。例如,假設(shè)你運(yùn)行一個(gè)博客平臺(tái),并將所有數(shù)據(jù)存儲(chǔ)在一個(gè)索引中。在這個(gè)索引中,您可以為用戶數(shù)據(jù)定義一種類型,為博客數(shù)據(jù)定義另一種類型,以及為注釋數(shù)據(jù)定義另一類型。
Document文檔:
文檔是可以被索引的信息的基本單位。例如,您可以為單個(gè)客戶提供一個(gè)文檔,單個(gè)產(chǎn)品提供另一個(gè)文檔,以及單個(gè)訂單提供另一個(gè)文檔。本文件的表示形式為JSON(JavaScript Object Notation)格式,這是一種非常普遍的互聯(lián)網(wǎng)數(shù)據(jù)交換格式。
在索引/類型中,您可以存儲(chǔ)盡可能多的文檔。請(qǐng)注意,盡管文檔物理駐留在索引中,文檔實(shí)際上必須索引或分配到索引中的類型。
Shards & Replicas分片與副本:
索引可以存儲(chǔ)大量的數(shù)據(jù),這些數(shù)據(jù)可能超過單個(gè)節(jié)點(diǎn)的硬件限制。例如,十億個(gè)文件占用磁盤空間1TB的單指標(biāo)可能不適合對(duì)單個(gè)節(jié)點(diǎn)的磁盤或可能太慢服務(wù)僅從單個(gè)節(jié)點(diǎn)的搜索請(qǐng)求。
為了解決這一問題,Elasticsearch提供細(xì)分你的指標(biāo)分成多個(gè)塊稱為分片的能力。當(dāng)你創(chuàng)建一個(gè)索引,你可以簡(jiǎn)單地定義你想要的分片數(shù)量。每個(gè)分片本身是一個(gè)全功能的、獨(dú)立的“指數(shù)”,可以托管在集群中的任何節(jié)點(diǎn)。
Shards分片的重要性主要體現(xiàn)在以下兩個(gè)特征:
分片允許您水平拆分或縮放內(nèi)容的大小
分片允許你分配和并行操作的碎片(可能在多個(gè)節(jié)點(diǎn)上)從而提高性能/吞吐量
這個(gè)機(jī)制中的碎片是分布式的以及其文件匯總到搜索請(qǐng)求是完全由ElasticSearch管理,對(duì)用戶來說是透明的。
在同一個(gè)集群網(wǎng)絡(luò)或云環(huán)境上,故障是任何時(shí)候都會(huì)出現(xiàn)的,擁有一個(gè)故障轉(zhuǎn)移機(jī)制以防分片和結(jié)點(diǎn)因?yàn)槟承┰螂x線或消失是非常有用的,并且被強(qiáng)烈推薦。為此,Elasticsearch允許你創(chuàng)建一個(gè)或多個(gè)拷貝,你的索引分片進(jìn)入所謂的副本或稱作復(fù)制品的分片,簡(jiǎn)稱Replicas。
Replicas的重要性主要體現(xiàn)在以下兩個(gè)特征:
副本為分片或節(jié)點(diǎn)失敗提供了高可用性。為此,需要注意的是,一個(gè)副本的分片不會(huì)分配在同一個(gè)節(jié)點(diǎn)作為原始的或主分片,副本是從主分片那里復(fù)制過來的。
副本允許用戶擴(kuò)展你的搜索量或吞吐量,因?yàn)樗阉骺梢栽谒懈北旧喜⑿袌?zhí)行。
此分片副本存儲(chǔ)方式和GLUSTER FS 分布式條帶卷存儲(chǔ)方式類似。
ElasticSearch和關(guān)系型數(shù)據(jù)庫相關(guān)概念的對(duì)應(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) |