小編給大家分享一下elasticsSearch的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)懷安,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
在分布式搜索引擎中,elasticsSearch逐漸變成一種標(biāo)準(zhǔn)了,其通過(guò)簡(jiǎn)單連貫的RESTful API讓全文搜索變得簡(jiǎn)單并隱藏Lucene的復(fù)雜性。但底層還是使用Lucene來(lái)實(shí)現(xiàn)搜索功能。
index: 索引,是一類數(shù)據(jù)的抽象。
type: 類型,是一類數(shù)據(jù)的具體抽象。更多情況一個(gè)index只對(duì)應(yīng)一個(gè)type,type類似數(shù)據(jù)庫(kù)中的一張表,并且在邏輯定義上也經(jīng)常是1對(duì)1的關(guān)系,如elasticsSearch的type中存訂單數(shù)據(jù)需要被搜索的字段,并且有一個(gè)字段是訂單號(hào),我們通過(guò)字段搜索到訂單號(hào)后通常會(huì)在數(shù)據(jù)庫(kù)再查一次,返回詳情。
document: 與Lucene里面的Document一樣,就是表示可以被搜索的一條數(shù)據(jù)。
field:與Lucene里面的field一樣,表示的是document的每個(gè)字段。
shard:elasticsSearch集群中存儲(chǔ)數(shù)據(jù)的基本單位單位,一個(gè)索引有多個(gè)shard,在集群中不可以再次被分隔。
協(xié)調(diào)節(jié)點(diǎn):集群中任意節(jié)點(diǎn)都可以接受客戶端請(qǐng)求,接受請(qǐng)求的節(jié)點(diǎn)稱為協(xié)調(diào)節(jié)點(diǎn)。
segmentFile: shard中數(shù)據(jù)持久化的磁盤文件,一個(gè)shard對(duì)應(yīng)多個(gè)segmentFile。
fsync:Unix系統(tǒng)調(diào)用函數(shù), 用來(lái)將內(nèi)存緩沖區(qū)buffer中的數(shù)據(jù)存儲(chǔ)到文件系統(tǒng). 這里具體是指將文件緩存cache中的所有segment刷新到磁盤的操作。
索引創(chuàng)建可以指定分片的數(shù)量以及副本的數(shù)量,分片數(shù)量在創(chuàng)建之后無(wú)法改變,副本數(shù)量在之后可以改變,隨著集群中節(jié)點(diǎn)的增加與刪除,各個(gè)分片與副本會(huì)重新分配到各個(gè)節(jié)點(diǎn)中。分片和副本不會(huì)分配到一個(gè)節(jié)點(diǎn)上,分片通過(guò)hash算法平均分布在各個(gè)節(jié)點(diǎn)上,也可以自定義分片分布規(guī)則(讓在集群的某些節(jié)點(diǎn)和某個(gè)節(jié)點(diǎn)創(chuàng)建分片),如通過(guò)自定義分片分布規(guī)則實(shí)現(xiàn)冷熱分離提高性能。因?yàn)檫@種分片機(jī)制,我們可以通過(guò)增加集群中節(jié)點(diǎn)保證一臺(tái)機(jī)器的分片不會(huì)太多提高搜索性能。
集群中會(huì)自動(dòng)選舉一個(gè)master節(jié)點(diǎn),master節(jié)點(diǎn)的主要作用是管理集群,維護(hù)索引元數(shù)據(jù)等。master掛掉,集群重新選舉master節(jié)點(diǎn),master節(jié)點(diǎn)然后切換節(jié)點(diǎn)的身份為master。
寫請(qǐng)求被路由到只往primaryShard寫,然后會(huì)自動(dòng)同步到replicaShard,讀的話primaryShard和replicaShard讀都可以。
協(xié)調(diào)節(jié)點(diǎn)接收到寫入請(qǐng)求,將寫入請(qǐng)求數(shù)據(jù)通過(guò)哈希算法路由到對(duì)應(yīng)的shard的primaryShard上去。primaryShard的節(jié)點(diǎn)接收到請(qǐng)求數(shù)據(jù),首先把segment fiel以及transLog(事務(wù)日志)寫入自己的應(yīng)用內(nèi)存buffer當(dāng)中,然后默認(rèn)每隔1s,將buffer中的數(shù)據(jù)refresh數(shù)據(jù)到osCache(文件系統(tǒng)緩存)中。此時(shí)客戶端就能查詢到數(shù)據(jù)了。這個(gè)過(guò)程非???,因?yàn)椴]有涉及到數(shù)據(jù)的持久化(所以是準(zhǔn)實(shí)時(shí)的)。當(dāng)translog文件過(guò)大或達(dá)到一定時(shí)間(默認(rèn)30分鐘)會(huì)觸發(fā)flush操作,flush操作會(huì)將segmentfile統(tǒng)一flush到磁盤文件,同時(shí)生成一個(gè)commitpoint,記錄生成的segmentfile,然后清空translog。
注意:
故障恢復(fù)時(shí),elasticsSearch將根據(jù)當(dāng)前的commitpoint文件加載segmentFile(恢復(fù)搜索功能),然后通過(guò)translog事務(wù)日志,重做所有操作來(lái)恢復(fù)數(shù)據(jù)。
當(dāng)數(shù)據(jù)尚且在buffer或osCache、translog也在osCache中時(shí)可能會(huì)丟數(shù)據(jù),也可設(shè)定參數(shù)保證數(shù)據(jù)不丟失,但會(huì)犧牲吞吐量和性能。Elasticsearch 2.0之后, 每次寫請(qǐng)求(如index、delete、update、bulk等)完成時(shí), 都會(huì)觸發(fā)fsync將translog中的segment刷到磁盤, 然后才會(huì)返回200 OK的響應(yīng);
刪除有點(diǎn)類似偽刪除,它先是通過(guò)將對(duì)應(yīng)刪除的記錄寫入磁盤上的.del文件,標(biāo)志那些document被刪除(如果此時(shí)搜索將會(huì)搜索到這些文檔但不會(huì)返回)。當(dāng)segment File多到一定程度時(shí)候,ES將執(zhí)行物理刪除操作, 徹底清除這些文檔。
修改數(shù)據(jù)是先刪后增,將原來(lái)的數(shù)據(jù)標(biāo)志位deleted狀態(tài),然后新寫入一個(gè)document。
通過(guò)document 的id hash到指定分片,然后根據(jù)負(fù)載均衡算法(默認(rèn)輪詢),路由到該分片節(jié)點(diǎn)之一讀取數(shù)據(jù)。
協(xié)調(diào)節(jié)點(diǎn),把請(qǐng)求發(fā)送到所有擁有該索引的節(jié)點(diǎn)上去,但是對(duì)于主parimaryShard和replicaShard只會(huì)查其中之一,每個(gè)shard把查詢結(jié)果的docId返回給協(xié)調(diào)節(jié)點(diǎn)。接著協(xié)調(diào)節(jié)點(diǎn)根據(jù)docId去實(shí)際存放數(shù)據(jù)的節(jié)點(diǎn)拉取docment,由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行合并、排序、分頁(yè)等操作,然后返回給客戶端。
elasticsSearch的高性能很大程度依賴于osCache的大小,畢竟走內(nèi)存肯定比走硬盤快,所以可以提高filesystemCache的大小盡可能覆蓋多的segment文件來(lái)提高性能。
做一個(gè)子系統(tǒng),每隔一段對(duì)熱點(diǎn)數(shù)據(jù)搜索一下。因?yàn)閛sCache實(shí)際上還是基于LRU緩存的。
將熱數(shù)據(jù)專門寫一個(gè)索引,冷數(shù)據(jù)又單獨(dú)寫個(gè)索引,通過(guò)控制分片規(guī)則分放在不同的機(jī)器,因?yàn)闊釘?shù)據(jù)數(shù)據(jù)量少,沒有冷數(shù)據(jù)的話,可以保證盡可能多的數(shù)據(jù)都在osCache里面,而因?yàn)槔鋽?shù)據(jù)不走熱數(shù)據(jù)節(jié)點(diǎn),避免oscache頻繁切換數(shù)據(jù)的開銷。
寫入es模型的就完成Type之間的關(guān)聯(lián),建立冗余字段(別在es中join),因?yàn)槿绻谒阉髦羞\(yùn)用到了索引之間的關(guān)聯(lián)效率是很低的。
假設(shè)查詢100頁(yè),會(huì)有1-100頁(yè)的數(shù)據(jù)到協(xié)調(diào)節(jié)點(diǎn)來(lái),然后協(xié)調(diào)節(jié)點(diǎn)才完成排序、篩選、分頁(yè),這是深度分頁(yè)。應(yīng)對(duì)方案有兩種,一是我們的系統(tǒng)設(shè)計(jì)不允許翻那么深的頁(yè),或默認(rèn)翻的越深,性能越差。二是利用elasticsSearch的ScrollAPI,ScrollAPI允許我們做一個(gè)初始階段搜索并且持續(xù)批量從Elasticsearch里拉取結(jié)果直到?jīng)]有結(jié)果剩下,缺點(diǎn)是只能一頁(yè)一頁(yè)往后翻,不能跳著翻。
以上是“elasticsSearch的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!