Elasticsearch簡(jiǎn)介
什么是elasticsearch?
Elasticsearch是一個(gè)基于Apache Lucene(TM)的開(kāi)源搜索引擎漫玄。無(wú)論在開(kāi)源還是專(zhuān)有領(lǐng)域,Lucene可以被認(rèn)為是迄今為止最先進(jìn)母债、性能最好的兵琳、功能最全的搜索引擎庫(kù)蚀苛。
但是磅甩,Lucene只是一個(gè)庫(kù)统阿。想要使用它彩倚,你必須使用Java來(lái)作為開(kāi)發(fā)語(yǔ)言并將其直接集成到你的應(yīng)用中,更糟糕的是扶平,Lucene非常復(fù)雜署恍,你需要深入了解檢索的相關(guān)知識(shí)來(lái)理解它是如何工作的。
Elasticsearch也使用Java開(kāi)發(fā)并使用Lucene作為其核心來(lái)實(shí)現(xiàn)所有索引和搜索的功能蜻直,但是它的目的是通過(guò)簡(jiǎn)單的RESTful API來(lái)隱藏Lucene的復(fù)雜性,從而讓全文搜索變得簡(jiǎn)單袁串。
不過(guò)概而,Elasticsearch不僅僅是Lucene和全文搜索,我們還能這樣去描述它:
分布式的實(shí)時(shí)文件存儲(chǔ)囱修,每個(gè)字段都被索引并可被搜索
分布式的實(shí)時(shí)分析搜索引擎
可以擴(kuò)展到上百臺(tái)服務(wù)器赎瑰,處理PB級(jí)結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
而且,所有的這些功能被集成到一個(gè)服務(wù)里面破镰,你的應(yīng)用可以通過(guò)簡(jiǎn)單的RESTful API餐曼、各種語(yǔ)言的客戶(hù)端甚至命令行與之交互。
上手Elasticsearch非常容易鲜漩。它提供了許多合理的缺省值源譬,并對(duì)初學(xué)者隱藏了復(fù)雜的搜索引擎理論。它開(kāi)箱即用(安裝即可使用)孕似,只需很少的學(xué)習(xí)既可在生產(chǎn)環(huán)境中使用踩娘。
Elasticsearch在Apache 2 license下許可使用,可以免費(fèi)下載喉祭、使用和修改养渴。
隨著你對(duì)Elasticsearch的理解加深雷绢,你可以根據(jù)不同的問(wèn)題領(lǐng)域定制Elasticsearch的高級(jí)特性,這一切都是可配置的理卑,并且配置非常靈活翘紊。
elasticsearch與solr對(duì)比
1)http://i.zhcy.tk/blog/elasticsearchyu-solr/
2)http://solr-vs-elasticsearch.com/
總的來(lái)說(shuō):elasticsearch在實(shí)時(shí)搜索、分布式管理上優(yōu)于solr藐唠。
elasticsearch術(shù)語(yǔ)
1)NRT(Near Realtime)
在增刪改后帆疟,有refresh interval秒(通常是1s)的延遲才能反映到數(shù)索引里。
2) ?集群
多個(gè)節(jié)點(diǎn)邏輯上表現(xiàn)為一個(gè)結(jié)點(diǎn)中捆,統(tǒng)一對(duì)外提供index和search服務(wù)鸯匹;一個(gè)ES實(shí)例可以包含多個(gè)集群,每一個(gè)集群通過(guò)cluster name來(lái)標(biāo)識(shí)泄伪。
3)Node
指定節(jié)點(diǎn)名稱(chēng)殴蓬,不指定的話(huà)是隨機(jī)的;節(jié)點(diǎn)具有index和search能力蟋滴。
4)index索引
文檔集合染厅;一個(gè)集群可以有多個(gè)索引。
5)type
一個(gè)索引可以有多個(gè)type津函,一個(gè)type里面包含一類(lèi)文檔肖粮。類(lèi)比數(shù)據(jù)就是表table。
6)文檔
json形式的數(shù)據(jù)結(jié)構(gòu)尔苦,類(lèi)比數(shù)據(jù)庫(kù)就是表中的一條記錄涩馆。
7)shard & replicas 主分片和副本
一個(gè)索引中的數(shù)據(jù),會(huì)被分成多個(gè)shard允坚,存儲(chǔ)在1個(gè)或多個(gè)節(jié)點(diǎn)里魂那。每個(gè)shard其實(shí)就是一個(gè)功能獨(dú)立的索引,放在哪個(gè)節(jié)點(diǎn)都可以工作稠项。(可以增加水平擴(kuò)展能力涯雅,和并行處理能力)
副本是主分片的副本,主分片不可用時(shí)候的備份展运。每個(gè)主分片可以有多個(gè)副本活逆。高可用的保障。
2 集群安裝
1) 壓縮包解壓 直接elasticsearch -d后臺(tái)執(zhí)行
Note:
官方推薦的系統(tǒng)配置:
1 文件描述符推薦32k和64k
2 vm.max_map_counts=262144
3 鎖住內(nèi)存拗胜,禁止swap
3 深入原理
3.1 es是如何啟動(dòng)的?
1)每個(gè)es實(shí)例啟動(dòng)的時(shí)候蔗候,都會(huì)使用自動(dòng)發(fā)現(xiàn)機(jī)制,發(fā)現(xiàn)其他節(jié)點(diǎn)
2)自動(dòng)發(fā)現(xiàn)機(jī)制有多播和單播兩種
3)不同網(wǎng)段間的多播會(huì)失效
4)可以直接禁止多播挤土,只使用單播
5) 啟動(dòng)的過(guò)程中會(huì)選舉master節(jié)點(diǎn)琴庵,master選舉后,一個(gè)集群才成立。
Note:
選舉master節(jié)點(diǎn)的迷殿,最小master數(shù)量節(jié)點(diǎn)設(shè)置
discovery.zen.minimum_master_nodes = number of master / 2 + 1儿礼;
防止腦裂:腦裂就是一個(gè)集群被分為多個(gè)集群,有多個(gè)master同時(shí)存在庆寺。
3.2 es是如何索引的蚊夫?
1)首先創(chuàng)建索引
2)然后創(chuàng)建type和mapping
3)將索引的doc,寫(xiě)到主分片懦尝。
5)主分片會(huì)同步到副本后知纷,返回索引請(qǐng)求。
3.3 es是如何查詢(xún)的陵霉?
1)搜索相比索引會(huì)更復(fù)雜琅轧,因?yàn)樵谒阉髦心男ヾoc會(huì)被命中以及它們的分片分布是未知的
2)查詢(xún)分兩個(gè)階段,第一個(gè)階段是查詢(xún)階段(query)
3)查詢(xún)階段里踊挠,搜索請(qǐng)求會(huì)廣播給所有分片(主分片或副本)乍桂,每個(gè)分片會(huì)在本地執(zhí)行該搜索,匹配的文檔被保存到一個(gè)優(yōu)先隊(duì)列中效床,隊(duì)列大小=offset + limit睹酌。
4)每個(gè)分片都準(zhǔn)備好了隊(duì)列后,將ids和需要排序的字段剩檀,如_score返回給協(xié)調(diào)節(jié)點(diǎn)憋沿。
5)協(xié)調(diào)節(jié)點(diǎn)會(huì)將所有doc排序后放入優(yōu)先級(jí)隊(duì)列,然后執(zhí)行獲取數(shù)據(jù)階段(fetch)
6)協(xié)調(diào)節(jié)點(diǎn)執(zhí)行fetch階段的時(shí)候沪猴,是經(jīng)過(guò)優(yōu)化考慮的辐啄,會(huì)進(jìn)行multiget批量獲取數(shù)據(jù)。
7)所有數(shù)據(jù)獲取之后运嗜,response则披。
3.4 es數(shù)據(jù)是如何寫(xiě)到磁盤(pán)的
1)數(shù)據(jù)要想searchable,必須是存在段文件(segment)的洗出,segment就是倒排索引。
2) ?數(shù)據(jù)來(lái)源是內(nèi)存buffer图谷,新的索引數(shù)據(jù)首先到內(nèi)存中翩活,然后經(jīng)過(guò)refresh_interval的時(shí)間會(huì)建立segment文件寫(xiě)到文件系統(tǒng)緩存中,此時(shí)可以提供搜索便贵。
3)索引數(shù)據(jù)在寫(xiě)入內(nèi)存buffer的同時(shí)菠镇,還會(huì)記錄事務(wù)日志,保證數(shù)據(jù)可靠承璃。
4)經(jīng)過(guò)默認(rèn)30分鐘利耍,或事務(wù)日志大小超過(guò)一定范圍,會(huì)強(qiáng)制將文件系統(tǒng)緩存flush到disk中,這樣segment文件就寫(xiě)入磁盤(pán)了隘梨,事物日志也會(huì)清除程癌,commit文件也會(huì)隨之更新(commit文件記錄了segment的信息)。
3.5 每個(gè)refresh-intalval間隔都會(huì)產(chǎn)生segment文件轴猎,文件太多怎么辦嵌莉?
1)文件過(guò)多會(huì)導(dǎo)致文件句柄,內(nèi)存捻脖,cpu的消耗锐峭,因?yàn)槊總€(gè)segment文件都要參與計(jì)算的。
2)es對(duì)此有segment文件合并機(jī)制可婶。是額外線(xiàn)程后臺(tái)負(fù)責(zé)執(zhí)行的沿癞,segment文件merge的時(shí)候,也是邏輯刪除的doc被物理刪除的時(shí)機(jī)矛渴。
3)大小相似的segment會(huì)被選中進(jìn)行merge椎扬,merge成較大的segment,merge完成之后曙旭,新生成的大segment提供search盗舰,舊的小segment被物理delete
4) 可視化直觀感受下lucene的合并:http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html
3.6 控制doc落在哪個(gè)shard?
1)依賴(lài)的是elasticsearch的路由機(jī)制(_reroute)
2)默認(rèn)路由使用_id, (_id % number of shard)
3) 在索引的時(shí)候可以自定義路由桂躏,比如bizacctid钻趋,那么同一商家的項(xiàng)目會(huì)落在同一shard。(好處是搜索請(qǐng)求不用廣播剂习,就可以直接去指定shard搜索蛮位,弊端是有可能造成shard的大小不均)。
3.7 es使用的緩存鳞绕?
1)過(guò)濾器緩存,filter cache,默認(rèn)占用10%heap失仁,LRU換出策略。Node級(jí)別们何,記錄那些doc符合此filter萄焦,使用數(shù)據(jù)結(jié)構(gòu)是bitset,空間占用少冤竹。
2)field cache緩存拂封。
需要訪問(wèn)字段值的時(shí)候,例如根據(jù)某個(gè)字段排序鹦蠕,需要知道doc的field的value是什么冒签,倒排索引不能完成這個(gè),所以類(lèi)似將倒排倒轉(zhuǎn)過(guò)來(lái)钟病,存儲(chǔ)在heap緩存中萧恕,只進(jìn)不出刚梭。容易OOM
只進(jìn)不出是因?yàn)榻ield data是一個(gè)耗時(shí)的動(dòng)作。