什么是ElasticSearch
官方定義是ElasticSearch是一個(gè)基于Lucene library的分布式搜索引擎来累。ElasticSearch的開發(fā)者Shay Banon局义,最開始創(chuàng)建ElasticSearch的目的就是提供一個(gè)分布式的搜索解決方案鸵鸥。隨著ES的發(fā)展痊远,ES功能越來越豐富,ES應(yīng)用越來越廣泛绪氛,ES在很多場(chǎng)景下實(shí)際被作為一種數(shù)據(jù)庫存儲(chǔ)方案楞黄,實(shí)現(xiàn)數(shù)據(jù)庫存儲(chǔ)功能,將其理解為帶有強(qiáng)大搜索功能和快速讀取功能的高可用分布式文檔型非關(guān)系型數(shù)據(jù)庫(nosql)更為全面句旱,非關(guān)系型數(shù)據(jù)庫有很多種阳藻,采用ES作為解決方案的往往看重其強(qiáng)大的查詢分析和全文搜索能力。
ES與Lucene關(guān)系
Lucene是目前最為流行和成熟的搜索庫谈撒,提供了核心的index和search功能腥泥,但是只是對(duì)開發(fā)人員提供了接口,沒有提供終端使用的接口啃匿,并且只是一個(gè)單機(jī)的本地解決方案蛔外。ElasticSearch基于Lucene并且對(duì)Lucene提供了豐富的擴(kuò)展,ES 為Lucene提供了分布式溯乒,高可用解決方案夹厌,實(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ù)匯總返回給用戶,可以簡單理解為冰垄,關(guān)系型數(shù)據(jù)庫水平分表蹬癌。
對(duì)ES的分布式查詢可以簡單理解為一個(gè)函數(shù)式編程map-reduce過程。用戶發(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過程)伴奥,然后將各個(gè)節(jié)點(diǎn)的查詢結(jié)果發(fā)送到到協(xié)調(diào)節(jié)點(diǎn)進(jìn)行排序聚合等操作(相當(dāng)于reduce 過程)
分布式存儲(chǔ)和分布式查詢對(duì)終端用戶來說是透明的,但是如果需要做性能調(diào)優(yōu)需要對(duì)這些深層概念做一些了解是很有幫助的
分布式使得在大數(shù)據(jù)量面前可以通過分片降低每個(gè)分片的檢索規(guī)模翼闽、存儲(chǔ)規(guī)模,并且可以并行檢索來提升檢索效率洲炊。
基于關(guān)系型數(shù)據(jù)庫的ES使用方案
ES 處理領(lǐng)域模型對(duì)象之間復(fù)雜關(guān)系并不擅長感局,而關(guān)系型數(shù)據(jù)庫對(duì)領(lǐng)域模型對(duì)象的抽象建模相對(duì)方便和成熟,ORM建模目前已經(jīng)很成熟暂衡。結(jié)合關(guān)系型數(shù)據(jù)庫領(lǐng)域建模的優(yōu)點(diǎn)询微,利用 ES 查詢速度快、查詢分析功能強(qiáng)大的特點(diǎn)狂巢,可以將ES作為數(shù)據(jù)緩存和數(shù)據(jù)查詢接口使用撑毛。先將重要的數(shù)據(jù)寫入關(guān)系數(shù)據(jù)庫,然后再索引到ES中唧领,查詢操作相關(guān)接口直接hit到ES中藻雌,將查詢壓力放在ES這個(gè)緩存(代理)中,既利用了ES強(qiáng)大的查詢功能斩个,又結(jié)合了關(guān)系型數(shù)據(jù)庫的可靠性和豐富的數(shù)據(jù)描述能力胯杭。使用的數(shù)據(jù)場(chǎng)景是應(yīng)用場(chǎng)景是讀多寫少。這種方案的核心思想是將ES看成廣義的緩存和查詢代理受啥。
ES刪除與查詢?cè)砑皩?duì)應(yīng)性能優(yōu)化方案
ES讀取效率很高做个,但插入和刪除會(huì)影響ES的查詢效率,查詢和寫入的主體segment是不可變的滚局,刪除并不是真正的刪除居暖,而是在.del文件插入一條刪除記錄,在實(shí)際查詢中過濾掉del文件中刪除記錄再返回給用戶藤肢,實(shí)際等于求segment del文兩者的交集太闺,增加了查詢的負(fù)擔(dān)。在ES(Lucene)中沒有真正的更新操作谤草,更新是由刪除和新建兩個(gè)操作構(gòu)成跟束。
ES中刪除的數(shù)據(jù)只有在段合并的時(shí)候才能真正的物理刪除,但是段合并是一個(gè)特別耗時(shí)的操作丑孩,要謹(jǐn)慎操作冀宴。比較好的做法是按照時(shí)間或者某種業(yè)務(wù)邏輯將不同類型的數(shù)據(jù)分index存儲(chǔ),當(dāng)達(dá)到一定條件直接刪除(冷凍)對(duì)應(yīng)index温学,比如logs日志按照天分索引略贮,超過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í)際寫入和查詢的主體,index提供實(shí)際的讀寫接口拄丰。
一個(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算法還沒出現(xiàn))涂召,雖然在部分場(chǎng)景會(huì)有缺陷,但是在實(shí)際使用中表現(xiàn)和強(qiáng)大敏沉,ES的一致性算法目前看在往raft(paxos)算法靠攏果正,也是通過leader選舉機(jī)制,數(shù)據(jù)副本機(jī)制盟迟,數(shù)據(jù)同步機(jī)制秋泳,來保證系統(tǒng)的一致性,高可用性攒菠。
Filter緩存實(shí)現(xiàn)
ES filter緩存并不是緩存整個(gè)search迫皱,而是針對(duì)每個(gè)filter生成一個(gè)bitset數(shù)據(jù)結(jié)構(gòu)(簡單理解為0, 1 數(shù)組)辖众,下次有對(duì)應(yīng)filter的查詢就不用訪問倒排索引了卓起,可以直接訪問對(duì)應(yīng)bitset。Lucene 負(fù)責(zé)計(jì)算構(gòu)建bitSet凹炸, ES 通過cache對(duì)象來緩存bitSet戏阅。