一、elasticsearch背后有趣的故事
許多年前,一個剛結(jié)婚的名叫 Shay Banon 的失業(yè)開發(fā)者碎罚,跟著他的妻子去了倫敦扮授,他的妻子在那里學(xué)習(xí)廚師蚜迅。 在尋找一個賺錢的工作的時候英岭,為了給他的妻子做一個食譜搜索引擎哟绊,他開始使用 Lucene 的一個早期版本铜跑。直接使用 Lucene 是很難的门怪,因此 Shay 開始做一個抽象層,Java 開發(fā)者使用它可以很簡單的給他們的程序添加搜索功能锅纺。 他發(fā)布了他的第一個開源項目 Compass掷空。后來 Shay 獲得了一份工作,主要是高性能囤锉,分布式環(huán)境下的內(nèi)存數(shù)據(jù)網(wǎng)格坦弟。這個對于高性能,實時官地,分布式搜索引擎的需求尤為突出酿傍, 他決定重寫 Compass,把它變?yōu)橐粋€獨(dú)立的服務(wù)并取名 Elasticsearch驱入。
第一個公開版本在2010年2月發(fā)布赤炒,從此以后,Elasticsearch 已經(jīng)成為了 Github 上最活躍的項目之一亏较,他擁有超過300名 contributors(目前736名 contributors )莺褒。 一家公司已經(jīng)開始圍繞 Elasticsearch 提供商業(yè)服務(wù),并開發(fā)新的特性宴杀,但是癣朗,Elasticsearch 將永遠(yuǎn)開源并對所有人可用。
據(jù)說旺罢,Shay 的妻子還在等著她的食譜搜索引擎…
二旷余、elasticsearch簡介
Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene? 基礎(chǔ)之上扁达。 Lucene 可以說是當(dāng)下最先進(jìn)正卧、高性能、全功能的搜索引擎庫--無論是開源還是私有跪解。但是 Lucene 僅僅只是一個庫炉旷。為了充分發(fā)揮其功能,你需要使用 Java 并將 Lucene 直接集成到應(yīng)用程序中。 更糟糕的是窘行,您可能需要獲得信息檢索學(xué)位才能了解其工作原理饥追。Lucene 非常 復(fù)雜。Elasticsearch 也是使用 Java 編寫的罐盔,它的內(nèi)部使用 Lucene 做索引與搜索但绕,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的復(fù)雜性惶看,取而代之的提供一套簡單一致的 RESTful API捏顺。然而,Elasticsearch 不僅僅是 Lucene纬黎,并且也不僅僅只是一個全文搜索引擎幅骄。 它可以被下面這樣準(zhǔn)確的形容:
- 一個分布式的實時文檔存儲,每個字段 可以被索引與搜索
- 一個分布式實時分析搜索引擎
- 能勝任上百個服務(wù)節(jié)點的擴(kuò)展本今,并支持 PB 級別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)
2.1拆座、elasticsearch功能
- 分布式的搜索引擎
es可作為一個分布式的搜索引擎,例如百度冠息,淘寶的商品搜索懂拾,一般web系統(tǒng)的站內(nèi)搜索,es都是不錯的技術(shù)選型铐达。
- 數(shù)據(jù)分析引擎
es在搜索的基礎(chǔ)上提供了豐富的API支持個性化的搜索和數(shù)據(jù)分析功能,比如電商網(wǎng)站檬果,我們可以查詢最近幾天的熱銷商品等瓮孙。
- 對海量數(shù)據(jù)進(jìn)行近實時的處理
es是一個分布式的搜索引擎,es通過集群和內(nèi)部分片可以將海量數(shù)據(jù)分散到多臺服務(wù)器上進(jìn)行存儲和檢索选脊,大大提高了其可伸縮性和容災(zāi)能力杭抠。
所謂近實時是一個相對的概念,一般的如果相應(yīng)速度能達(dá)到秒級別恳啥,我們就稱為其實近實時的偏灿。es的近實時包括兩個方面:其一寫入的數(shù)據(jù)在1s后就可以進(jìn)行檢索。其二其檢索和分析響應(yīng)速度可以達(dá)到秒級別钝的。
2.2翁垂、elasticsearch的特點
- 分布式
es是一個分布式的搜索引擎,可以很好的進(jìn)行數(shù)據(jù)的容災(zāi)遷移硝桩,動態(tài)擴(kuò)容沿猜,負(fù)載均衡等分布式特性。
- 海量數(shù)據(jù)
es能處理PB級別的數(shù)據(jù)碗脊,因為es是一個分布式的架構(gòu)啼肩,支持動態(tài)擴(kuò)容,所以對于海量數(shù)據(jù)的處理和存儲都不再是問題。
三祈坠、elasticsearch的幾個基礎(chǔ)概念
es中數(shù)據(jù)的基礎(chǔ)概念
- index
索引(index)類似于關(guān)系型數(shù)據(jù)庫里的“數(shù)據(jù)庫”——它是我們存儲和索引關(guān)聯(lián)數(shù)據(jù)的地方害碾。
提示:
事實上,我們的數(shù)據(jù)被存儲和索引在分片(shards)中赦拘,索引只是一個把一個或多個分片分組在一起的邏輯空間慌随。然而,這只是一些內(nèi)部細(xì)節(jié)——我們的程序完全不用關(guān)心分 片另绩。對于我們的程序而言儒陨,文檔存儲在索引(index)中。
剩下的細(xì)節(jié)由Elasticsearch關(guān)心 既可笋籽。
- type
type的概念類似于MySql中表的概念蹦漠。
在應(yīng)用中,我們使用對象表示一些“事物”车海,例如一個用戶笛园、一篇博客、一個評論侍芝,或者一封郵 件研铆。每個對象都屬于一個類(class),這個類定義了屬性或與對象關(guān)聯(lián)的數(shù)據(jù)州叠。 user 類的對象 可能包含姓名棵红、性別、年齡和Email地址咧栗。 在關(guān)系型數(shù)據(jù)庫中逆甜,我們經(jīng)常將相同類的對象存儲在一個表里,因為它們有著相同的結(jié)構(gòu)致板。 同理交煞,在Elasticsearch中,我們使用相同類型(type)的文檔表示相同的“事物”斟或,因為他們的數(shù) 據(jù)結(jié)構(gòu)也是相同的素征。 每個類型(type)都有自己的映射(mapping)或者結(jié)構(gòu)定義,就像傳統(tǒng)數(shù)據(jù)庫表中的列一樣萝挤。所 有類型下的文檔被存儲在同一個索引下御毅,但是類型的映射(mapping)會告訴Elasticsearch不同 的文檔如何被索引。 我們將會在《映射》章節(jié)探討如何定義和管理映射怜珍,但是現(xiàn)在我們將依 賴Elasticsearch去自動處理數(shù)據(jù)結(jié)構(gòu)亚享。
- document
document是es的基本索引單元,document類似于MySql中的一行記錄绘面。document的數(shù)據(jù)是json格式欺税。
- id
在MySql中我們使用主鍵表示一條記錄的唯一性侈沪,在es中id就是這種概念。在es中id同樣可以是自產(chǎn)生的晚凿,es自動生成的ID具備以下特點:自動生成的是 url安全的亭罪,base64編碼,GUID歼秽,保證分布式下ID不沖突(全局唯一ID)应役。當(dāng)然也可以我們自己來指定。
2燥筷,es在分布式下的幾個概念
- Cluster(集群):
相信熟悉分布式的小伙伴對這個Cluster都不會陌生箩祥,Cluster表示es的一個集群,所謂集群就是有好多es組合成的一個分布式下的es集群肆氓。
- node(節(jié)點):
node就是es集群(Cluster)中的一個es節(jié)點就稱為node袍祖。簡單來說可以理解成一個es實例就是該集群中的一個節(jié)點。
3谢揪,es存儲策略上的兩個概念
- shard(分片)和 replica:
為了將數(shù)據(jù)添加到Elasticsearch蕉陋,我們需要索引(index)——一個存儲關(guān)聯(lián)數(shù)據(jù)的地方。實際 上拨扶,索引只是一個用來指向一個或多個分片(shards)的“邏輯命名空間(logical namespace)”. 一個分片(shard)是一個最小級別“工作單元(worker unit)”,它只是保存了索引中所有數(shù)據(jù)的一 部分凳鬓。
道分片就是一個Lucene實例,并且它本身就是一個完整的搜索引擎患民。我們的文檔存儲在分片中缩举,并且在分片中被索引,但是我們的應(yīng)用程序不會直接與它們通信匹颤,取而代之的是蚁孔,直接與索引通信。 分片是Elasticsearch在集群中分發(fā)數(shù)據(jù)的關(guān)鍵惋嚎。把分片想象成數(shù)據(jù)的容器。文檔存儲在分片中站刑,然后分片分配到你集群中的節(jié)點上另伍。當(dāng)你的集群擴(kuò)容或縮小,Elasticsearch將會自動在你的節(jié)點間遷移分片绞旅,以使集群保持平衡摆尝。 分片可以是主分片(primary shard)或者是復(fù)制分片(replica shard)。
你索引中的每個文檔屬于一個單獨(dú)的主分片因悲,所以主分片的數(shù)量決定了索引最多能存儲多少數(shù)據(jù)堕汞。 理論上主分片能存儲的數(shù)據(jù)大小是沒有限制的,限制取決于你實際的使用情況晃琳。分片的最大容量完全取決于你的使用狀況:硬件存儲的大小讯检、文檔的大小和復(fù)雜度琐鲁、如何索引 和查詢你的文檔,以及你期望的響應(yīng)時間人灼。
復(fù)制分片只是主分片的一個副本围段,它可以防止硬件故障導(dǎo)致的數(shù)據(jù)丟失,同時可以提供讀請 求投放,比如搜索或者從別的shard取回文檔奈泪。 當(dāng)索引創(chuàng)建完成的時候,主分片的數(shù)量就固定了灸芳,但是復(fù)制分片的數(shù)量可以隨時調(diào)整涝桅。 默認(rèn)情況下,一個索引被分配5個主分片烙样,一個主分片默認(rèn)只有一個復(fù)制分片冯遂。
重點:
shard分為兩種:
- primary shard --- 主分片
- replica shard --- 復(fù)制分片(或者稱為備份分片或者副本分片)
需要注意的是,在業(yè)界有一個約定俗稱的東西误阻,單說一個單詞shard一般指的是primary shard债蜜,而單說一個單詞replica就是指的replica shard。
另外一個需要注意的是replica shard是相對于索引而言的究反,如果說當(dāng)前index有一個復(fù)制分片寻定,那么相對于主分片來說就是每一個主分片都有一個復(fù)制分片,即如果有5個主分片就有5個復(fù)制分片精耐,并且主分片和復(fù)制分片之間是一一對應(yīng)的關(guān)系狼速。
很重要的一點:primary shard不能和replica shard在同一個節(jié)點上。重要的事情說三遍:
primary shard不能和replica shard在同一個節(jié)點上
primary shard不能和replica shard在同一個節(jié)點上
primary shard不能和replica shard在同一個節(jié)點上
所以es最小的高可用配置為兩臺服務(wù)器卦停。
四向胡、elasticsearch的安裝和開發(fā)工具
本人安裝的是elasticsearch-6.6.2版本
開發(fā)工具:kibana-6.6.2(注意kibana的版本一定要和elasticsearch的版本一致)
另外本地還配置了另一個開發(fā)工具:elasticsearch-head
安裝方式,大家去百度一下惊完,有很多很詳細(xì)的安裝步驟僵芹,在這里就不在贅述了。
簡單貼一張圖關(guān)于如何在kibana中執(zhí)行curl
[圖片上傳失敗...(image-a93b57-1617512883461)]
四小槐、集群健康狀態(tài)
Elasticsearch 的集群監(jiān)控信息中包含了許多的統(tǒng)計數(shù)據(jù)拇派,其中最為重要的一項就是集群健康,它在 status 字段中展示為 green 凿跳、 yellow 或者 red件豌。
在kibana中執(zhí)行:GET /_cat/health?v
1 epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
2 1568794410 08:13:30 my-application yellow 1 1 47 47 0 0 40 0 - 54.0%
其中我們可以看到當(dāng)前我本地的集群健康狀態(tài)是yellow ,但這里問題來了控嗜,集群的健康狀況是如何進(jìn)行判斷的呢茧彤?
- green(很健康)
所有的主分片和副本分片都正常運(yùn)行。 - yellow(亞健康)
所有的主分片都正常運(yùn)行疆栏,但不是所有的副本分片都正常運(yùn)行曾掂。 - red(不健康)
有主分片沒能正常運(yùn)行惫谤。
注意:
我本地只配置了一個單節(jié)點的elasticsearch,因為primary shard和replica shard是不能分配到一個節(jié)點上的所以遭殉,在我本地的elasticsearch中是不存在replica shard的石挂,所以健康狀況為yellow。
文章也會持續(xù)更新险污,可以微信搜索「 邁莫coding 」第一時間閱讀