Elasticsearch隨筆

什么是ElasticSearch

官方定義是ElasticSearch是一個(gè)基于Lucene library的分布式搜索引擎。ElasticSearch的開(kāi)發(fā)者Shay Banon,最開(kāi)始創(chuàng)建ElasticSearch的目的就是提供一個(gè)分布式的搜索解決方案。隨著ES的發(fā)展,ES功能越來(lái)越豐富,ES應(yīng)用越來(lái)越廣泛,ES在很多場(chǎng)景下實(shí)際被作為一種數(shù)據(jù)庫(kù)存儲(chǔ)方案,實(shí)現(xiàn)數(shù)據(jù)庫(kù)存儲(chǔ)功能,將其理解為帶有強(qiáng)大搜索功能和快速讀取功能的高可用分布式文檔型非關(guān)系型數(shù)據(jù)庫(kù)(nosql)更為全面,非關(guān)系型數(shù)據(jù)庫(kù)有很多種,采用ES作為解決方案的往往看重其強(qiáng)大的查詢分析和全文搜索能力。

ES與Lucene關(guān)系

Lucene是目前最為流行和成熟的搜索庫(kù),提供了核心的index和search功能,但是只是對(duì)開(kāi)發(fā)人員提供了接口,沒(méi)有提供終端使用的接口,并且只是一個(gè)單機(jī)的本地解決方案。ElasticSearch基于Lucene并且對(duì)Lucene提供了豐富的擴(kuò)展,ES 為L(zhǎng)ucene提供了分布式,高可用解決方案,實(shí)現(xiàn)了 數(shù)據(jù)高可用(數(shù)據(jù)備份與恢復(fù),數(shù)據(jù)多節(jié)點(diǎn)備份)服務(wù)高可用(分布式,避免單機(jī)故障,提供故障恢復(fù)功能),并且提供了基于restful的json的接口方便數(shù)據(jù)的查詢和索引。

分布式存儲(chǔ)和查詢

ES index 是一個(gè)邏輯概念,由多個(gè)node上的多個(gè)分片構(gòu)成,用戶針對(duì)某個(gè)index數(shù)據(jù)存儲(chǔ)并不是只存儲(chǔ)在一個(gè)node上,實(shí)際會(huì)被路由到不同node節(jié)點(diǎn),而是查詢時(shí)將不同node數(shù)據(jù)匯總返回給用戶,可以簡(jiǎn)單理解為,關(guān)系型數(shù)據(jù)庫(kù)水平分表。

對(duì)ES的分布式查詢可以簡(jiǎn)單理解為一個(gè)函數(shù)式編程map-reduce過(guò)程。用戶發(fā)出search請(qǐng)求給某個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)將請(qǐng)求廣播給不同的data node,data node接到請(qǐng)求后在相應(yīng)的分片進(jìn)行查詢操作(相當(dāng)于map過(guò)程),然后將各個(gè)節(jié)點(diǎn)的查詢結(jié)果發(fā)送到到協(xié)調(diào)節(jié)點(diǎn)進(jìn)行排序聚合等操作(相當(dāng)于reduce 過(guò)程)

分布式存儲(chǔ)和分布式查詢對(duì)終端用戶來(lái)說(shuō)是透明的,但是如果需要做性能調(diào)優(yōu)需要對(duì)這些深層概念做一些了解是很有幫助的

分布式使得在大數(shù)據(jù)量面前可以通過(guò)分片降低每個(gè)分片的檢索規(guī)模、存儲(chǔ)規(guī)模,并且可以并行檢索來(lái)提升檢索效率。

基于關(guān)系型數(shù)據(jù)庫(kù)的ES使用方案

ES 處理領(lǐng)域模型對(duì)象之間復(fù)雜關(guān)系并不擅長(zhǎng),而關(guān)系型數(shù)據(jù)庫(kù)對(duì)領(lǐng)域模型對(duì)象的抽象建模相對(duì)方便和成熟,ORM建模目前已經(jīng)很成熟。結(jié)合關(guān)系型數(shù)據(jù)庫(kù)領(lǐng)域建模的優(yōu)點(diǎn),利用 ES 查詢速度快、查詢分析功能強(qiáng)大的特點(diǎn),可以將ES作為數(shù)據(jù)緩存和數(shù)據(jù)查詢接口使用。先將重要的數(shù)據(jù)寫(xiě)入關(guān)系數(shù)據(jù)庫(kù),然后再索引到ES中,查詢操作相關(guān)接口直接hit到ES中,將查詢壓力放在ES這個(gè)緩存(代理)中,既利用了ES強(qiáng)大的查詢功能,又結(jié)合了關(guān)系型數(shù)據(jù)庫(kù)的可靠性和豐富的數(shù)據(jù)描述能力。使用的數(shù)據(jù)場(chǎng)景是應(yīng)用場(chǎng)景是讀多寫(xiě)少。這種方案的核心思想是將ES看成廣義的緩存和查詢代理。

ES刪除與查詢?cè)砑皩?duì)應(yīng)性能優(yōu)化方案

ES讀取效率很高,但插入和刪除會(huì)影響ES的查詢效率,查詢和寫(xiě)入的主體segment是不可變的,刪除并不是真正的刪除,而是在.del文件插入一條刪除記錄,在實(shí)際查詢中過(guò)濾掉del文件中刪除記錄再返回給用戶,實(shí)際等于求segment del文兩者的交集,增加了查詢的負(fù)擔(dān)。在ES(Lucene)中沒(méi)有真正的更新操作,更新是由刪除和新建兩個(gè)操作構(gòu)成。

ES中刪除的數(shù)據(jù)只有在段合并的時(shí)候才能真正的物理刪除,但是段合并是一個(gè)特別耗時(shí)的操作,要謹(jǐn)慎操作。比較好的做法是按照時(shí)間或者某種業(yè)務(wù)邏輯將不同類(lèi)型的數(shù)據(jù)分index存儲(chǔ),當(dāng)達(dá)到一定條件直接刪除(冷凍)對(duì)應(yīng)index,比如logs日志按照天分索引,超過(guò)15天自動(dòng)刪除對(duì)應(yīng)索引。多索引方案使得查詢定義更加方便靈活,同時(shí)刪除和查詢影響的范圍變小了(只是某個(gè)index受到影響),merge時(shí)也更加方便了,可以分時(shí)段分業(yè)務(wù)具體定義merge策略。

Lucene index 與ES分片的關(guān)系

lucence index 是實(shí)際存在的文件,其中包含多個(gè)segment段文件,segment是實(shí)際寫(xiě)入和查詢的主體,index提供實(shí)際的讀寫(xiě)接口。
一個(gè)ES分片,相當(dāng)于一個(gè)完整Lucene index,包含完整的lucence引擎。ES實(shí)際上是將分布在不同的node不同Lucene實(shí)例(分片)統(tǒng)一協(xié)調(diào)管理,實(shí)現(xiàn)分布式存儲(chǔ)和查詢,提供更方便的存儲(chǔ)和查詢接口,提供功能擴(kuò)展如(agg查詢),提供容錯(cuò)性管理,故障恢復(fù)等分布式系統(tǒng)通常提供的服務(wù),提供方便的api 監(jiān)控群集狀態(tài),提供鏡像恢復(fù)機(jī)制,提供負(fù)載均衡機(jī)制。

ES高可用實(shí)現(xiàn)方案

ES實(shí)現(xiàn)了自己的一套一致性算法(當(dāng)時(shí)raft算法還沒(méi)出現(xiàn)),雖然在部分場(chǎng)景會(huì)有缺陷,但是在實(shí)際使用中表現(xiàn)和強(qiáng)大,ES的一致性算法目前看在往raft(paxos)算法靠攏,也是通過(guò)leader選舉機(jī)制,數(shù)據(jù)副本機(jī)制,數(shù)據(jù)同步機(jī)制,來(lái)保證系統(tǒng)的一致性,高可用性。

Filter緩存實(shí)現(xiàn)

ES filter緩存并不是緩存整個(gè)search,而是針對(duì)每個(gè)filter生成一個(gè)bitset數(shù)據(jù)結(jié)構(gòu)(簡(jiǎn)單理解為0, 1 數(shù)組),下次有對(duì)應(yīng)filter的查詢就不用訪問(wèn)倒排索引了,可以直接訪問(wèn)對(duì)應(yīng)bitset。Lucene 負(fù)責(zé)計(jì)算構(gòu)建bitSet, ES 通過(guò)cache對(duì)象來(lái)緩存bitSet。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容