引言
Elasticsearch
是什么例嘱?
ElasticSearch
是一個(gè)基于Lucene
的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎种蝶,基于RESTful web
接口台颠。Elasticsearch
是用Java
開(kāi)發(fā)的,并作為Apache
許可條款下的開(kāi)放源碼發(fā)布瓢颅,是當(dāng)前流行的企業(yè)級(jí)搜索引擎。設(shè)計(jì)用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索娘纷,穩(wěn)定,可靠跋炕,快速赖晶,安裝使用方便。
Elasticsearch
不僅僅是Lucene
和全文搜索引擎辐烂,它還提供:
- 分布式的搜索引擎和數(shù)據(jù)分析引擎
- 全文檢索
- 對(duì)海量數(shù)據(jù)進(jìn)行近實(shí)時(shí)的處理
ElasticSearch的應(yīng)用場(chǎng)景
全文檢索:主要和
Solr
競(jìng)爭(zhēng)遏插,屬于后起之秀。NoSQL JSON
文檔數(shù)據(jù)庫(kù):主要搶占Mongo
的市場(chǎng)纠修,它在讀寫性能上優(yōu)于Mongo
胳嘲,同時(shí)也支持地理位置查詢,還方便地理位置和文本混合查詢扣草。監(jiān)控:統(tǒng)計(jì)了牛、日志類時(shí)間序的數(shù)據(jù)存儲(chǔ)和分析颜屠、可視化,這方面是引領(lǐng)者鹰祸。
國(guó)外:
Wikipedia
(維基百科)使用ES
提供全文搜索并高亮關(guān)鍵字甫窟、StackOverflow
(IT
問(wèn)答網(wǎng)站)結(jié)合全文搜索與地理位置查詢、Github
使用Elasticsearch
檢索1300億行的代碼蛙婴。國(guó)內(nèi):百度(在云分析粗井、網(wǎng)盟、預(yù)測(cè)街图、文庫(kù)浇衬、錢包、風(fēng)控等業(yè)務(wù)上都應(yīng)用了
ES
餐济,單集群每天導(dǎo)入30TB+數(shù)據(jù)耘擂,總共每天60TB+)、新浪 絮姆、阿里巴巴梳星、騰訊等公司均有對(duì)ES
的使用。
使用比較廣泛的平臺(tái)ELK
(ElasticSearch
, Logstash
, Kibana
)滚朵。
幾個(gè)概念
- 接近實(shí)時(shí)(
NRT
)
Elasticsearch
是一個(gè)接近實(shí)時(shí)的搜索平臺(tái)冤灾。這意味著,從索引一個(gè)文檔直到這個(gè)文檔能夠被搜索到有一個(gè)輕微的延遲(通常是1秒)
- 集群(
cluster
)
一個(gè)集群就是由一個(gè)或多個(gè)節(jié)點(diǎn)組織在一起辕近,它們共同持有整個(gè)的數(shù)據(jù)韵吨,并一起提供索引和搜索功能。一個(gè)集群由一個(gè)唯一的名字標(biāo)識(shí)移宅,這個(gè)名字默認(rèn)就是“elasticsearch”归粉。這個(gè)名字是重要的,因?yàn)橐粋€(gè)節(jié)點(diǎn)只能通過(guò)指定某個(gè)集群的名字漏峰,來(lái)加入這個(gè)集群糠悼。在產(chǎn)品環(huán)境中顯式地設(shè)定這個(gè)名字是一個(gè)好習(xí)慣,但是使用默認(rèn)值來(lái)進(jìn)行測(cè)試/開(kāi)發(fā)也是不錯(cuò)的浅乔。
- 節(jié)點(diǎn)(
node
)
一個(gè)節(jié)點(diǎn)是你集群中的一個(gè)服務(wù)器倔喂,作為集群的一部分,它存儲(chǔ)你的數(shù)據(jù)靖苇,參與集群的索引和搜索功能席噩。和集群類似,一個(gè)節(jié)點(diǎn)也是由一個(gè)名字來(lái)標(biāo)識(shí)的贤壁,默認(rèn)情況下悼枢,這個(gè)名字是一個(gè)隨機(jī)的漫威漫畫(huà)角色的名字,這個(gè)名字會(huì)在啟動(dòng)的時(shí)候賦予節(jié)點(diǎn)脾拆。這個(gè)名字對(duì)于管理工作來(lái)說(shuō)挺重要的馒索,因?yàn)樵谶@個(gè)管理過(guò)程中莹妒,你會(huì)去確定網(wǎng)絡(luò)中的哪些服務(wù)器對(duì)應(yīng)于Elasticsearch
集群中的哪些節(jié)點(diǎn)。
一個(gè)節(jié)點(diǎn)可以通過(guò)配置集群名稱的方式來(lái)加入一個(gè)指定的集群绰上。默認(rèn)情況下旨怠,每個(gè)節(jié)點(diǎn)都會(huì)被安排加入到一個(gè)叫做“elasticsearch”的集群中,這意味著渔期,如果你在你的網(wǎng)絡(luò)中啟動(dòng)了若干個(gè)節(jié)點(diǎn)运吓,并假定它們能夠相互發(fā)現(xiàn)彼此渴邦,它們將會(huì)自動(dòng)地形成并加入到一個(gè)叫做“elasticsearch”的集群中疯趟。
在一個(gè)集群里,只要你想谋梭,可以擁有任意多個(gè)節(jié)點(diǎn)信峻。而且,如果當(dāng)前你的網(wǎng)絡(luò)中沒(méi)有運(yùn)行任何Elasticsearch
節(jié)點(diǎn)瓮床,這時(shí)啟動(dòng)一個(gè)節(jié)點(diǎn)盹舞,會(huì)默認(rèn)創(chuàng)建并加入一個(gè)叫做“elasticsearch”的集群。
- 索引(
index
)
一個(gè)索引就是一個(gè)擁有幾分相似特征的文檔的集合隘庄。比如說(shuō)踢步,你可以有一個(gè)客戶數(shù)據(jù)的索引,另一個(gè)產(chǎn)品目錄的索引丑掺,還有一個(gè)訂單數(shù)據(jù)的索引获印。一個(gè)索引由一個(gè)名字來(lái)標(biāo)識(shí)(必須全部是小寫字母),并且當(dāng)我們要對(duì)對(duì)應(yīng)于這個(gè)索引中的文檔進(jìn)行索引街州、搜索兼丰、更新和刪除的時(shí)候,都要使用到這個(gè)名字唆缴。索引類似于關(guān)系型數(shù)據(jù)庫(kù)中Database
的概念鳍征。在一個(gè)集群中,如果你想面徽,可以定義任意多的索引艳丛。
- 類型(
type
)
在一個(gè)索引中,你可以定義一種或多種類型趟紊。一個(gè)類型是你的索引的一個(gè)邏輯上的分類/分區(qū)质礼,其語(yǔ)義完全由你來(lái)定。通常织阳,會(huì)為具有一組共同字段的文檔定義一個(gè)類型眶蕉。比如說(shuō),我們假設(shè)你運(yùn)營(yíng)一個(gè)博客平臺(tái)并且將你所有的數(shù)據(jù)存儲(chǔ)到一個(gè)索引中唧躲。在這個(gè)索引中造挽,你可以為用戶數(shù)據(jù)定義一個(gè)類型碱璃,為博客數(shù)據(jù)定義另一個(gè)類型,當(dāng)然饭入,也可以為評(píng)論數(shù)據(jù)定義另一個(gè)類型嵌器。類型類似于關(guān)系型數(shù)據(jù)庫(kù)中Table
的概念。
- 文檔(
document
)
一個(gè)文檔是一個(gè)可被索引的基礎(chǔ)信息單元谐丢。比如爽航,你可以擁有某一個(gè)客戶的文檔,某一個(gè)產(chǎn)品的一個(gè)文檔乾忱,當(dāng)然讥珍,也可以擁有某個(gè)訂單的一個(gè)文檔。文檔以JSON
(Javascript Object Notation
)格式來(lái)表示窄瘟,而JSON
是一個(gè)到處存在的互聯(lián)網(wǎng)數(shù)據(jù)交互格式衷佃。
在一個(gè)index/type
里面,只要你想蹄葱,你可以存儲(chǔ)任意多的文檔氏义。注意,盡管一個(gè)文檔图云,物理上存在于一個(gè)索引之中惯悠,文檔必須被索引/賦予一個(gè)索引的type
。
文檔類似于關(guān)系型數(shù)據(jù)庫(kù)中Record
的概念竣况。實(shí)際上一個(gè)文檔除了用戶定義的數(shù)據(jù)外克婶,還包括_index
、_type
和_id
字段帕翻。
- 分片和復(fù)制(
shards
&replicas
)
一個(gè)索引可以存儲(chǔ)超出單個(gè)結(jié)點(diǎn)硬件限制的大量數(shù)據(jù)鸠补。比如,一個(gè)具有10億文檔的索引占據(jù)1TB的磁盤空間嘀掸,而任一節(jié)點(diǎn)都沒(méi)有這樣大的磁盤空間紫岩;或者單個(gè)節(jié)點(diǎn)處理搜索請(qǐng)求,響應(yīng)太慢睬塌。
為了解決這個(gè)問(wèn)題泉蝌,Elasticsearch
提供了將索引劃分成多份的能力,這些份就叫做分片揩晴。當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候勋陪,你可以指定你想要的分片的數(shù)量。每個(gè)分片本身也是一個(gè)功能完善并且獨(dú)立的“索引”硫兰,這個(gè)“索引”可以被放置到集群中的任何節(jié)點(diǎn)上诅愚。
分片之所以重要,主要有兩方面的原因:
- 允許你水平分割/擴(kuò)展你的內(nèi)容容量
- 允許你在分片(潛在地劫映,位于多個(gè)節(jié)點(diǎn)上)之上進(jìn)行分布式的违孝、并行的操作刹前,進(jìn)而提高性能/吞吐量
至于一個(gè)分片怎樣分布,它的文檔怎樣聚合回搜索請(qǐng)求雌桑,是完全由Elasticsearch
管理的喇喉,對(duì)于作為用戶的你來(lái)說(shuō),這些都是透明的校坑。
在一個(gè)網(wǎng)絡(luò)/云的環(huán)境里拣技,失敗隨時(shí)都可能發(fā)生,在某個(gè)分片/節(jié)點(diǎn)不知怎么的就處于離線狀態(tài)耍目,或者由于任何原因消失了膏斤。這種情況下,有一個(gè)故障轉(zhuǎn)移機(jī)制是非常有用并且是強(qiáng)烈推薦的制妄。為此目的掸绞,Elasticsearch
允許你創(chuàng)建分片的一份或多份拷貝泵三,這些拷貝叫做復(fù)制分片耕捞,或者直接叫復(fù)制。復(fù)制之所以重要烫幕,主要有兩方面的原因:
- 在分片/節(jié)點(diǎn)失敗的情況下俺抽,提供了高可用性。因?yàn)檫@個(gè)原因较曼,注意到復(fù)制分片從不與原/主要(
original
/primary
)分片置于同一節(jié)點(diǎn)上是非常重要的磷斧。 - 擴(kuò)展你的搜索量/吞吐量,因?yàn)樗阉骺梢栽谒械膹?fù)制上并行運(yùn)行
總之捷犹,每個(gè)索引可以被分成多個(gè)分片弛饭。一個(gè)索引也可以被復(fù)制0次(意思是沒(méi)有復(fù)制)或多次。一旦復(fù)制了萍歉,每個(gè)索引就有了主分片(作為復(fù)制源的原來(lái)的分片)和復(fù)制分片(主分片的拷貝)之別侣颂。
分片和復(fù)制的數(shù)量可以在索引創(chuàng)建的時(shí)候指定。在索引創(chuàng)建之后枪孩,你可以在任何時(shí)候動(dòng)態(tài)地改變復(fù)制數(shù)量憔晒,但是不能改變分片的數(shù)量。
默認(rèn)情況下蔑舞,Elasticsearch
中的每個(gè)索引被分片5個(gè)主分片和1個(gè)復(fù)制拒担,這意味著,如果你的集群中至少有兩個(gè)節(jié)點(diǎn)攻询,你的索引將會(huì)有5個(gè)主分片和另外5個(gè)復(fù)制分片(1個(gè)完全拷貝)从撼,這樣的話每個(gè)索引總共就有10個(gè)分片。一個(gè)索引的多個(gè)分片可以存放在集群中的一臺(tái)主機(jī)上钧栖,也可以存放在多臺(tái)主機(jī)上低零,這取決于你的集群機(jī)器數(shù)量呆馁。主分片和復(fù)制分片的具體位置是由ES
內(nèi)在的策略所決定的。
- 映射(
Mapping
)
Mapping
是ES
中的一個(gè)很重要的內(nèi)容毁兆,它類似于傳統(tǒng)關(guān)系型數(shù)據(jù)中table
的schema
浙滤,用于定義一個(gè)索引(index
)的某個(gè)類型(type
)的數(shù)據(jù)的結(jié)構(gòu)。
在ES
中气堕,我們無(wú)需手動(dòng)創(chuàng)建type
(相當(dāng)于table
)和mapping
(相當(dāng)于schema
)纺腊。在默認(rèn)配置下,ES
可以根據(jù)插入的數(shù)據(jù)自動(dòng)地創(chuàng)建type
及其mapping
茎芭。
mapping
中主要包括字段名揖膜、字段數(shù)據(jù)類型和字段索引類型。