Elasticsearch的由來(lái)
思考:大規(guī)模數(shù)據(jù)如何檢索鄙煤?
如:當(dāng)系統(tǒng)數(shù)據(jù)量上了10億梯刚、100億條的時(shí)候亡资,我們?cè)谧鱿到y(tǒng)架構(gòu)的時(shí)候通常會(huì)從以下角度去考慮問(wèn)題:
1)用什么數(shù)據(jù)庫(kù)好锥腻?(mysql母谎、sybase奇唤、oracle、達(dá)夢(mèng)甲葬、神通演顾、mongodb、hbase…)
2)如何解決單點(diǎn)故障钠至;(lvs棉钧、F5、A10的诵、Zookeep西疤、MQ)
3)如何保證數(shù)據(jù)安全性休溶;(熱備、冷備芭碍、異地多活)
4)如何解決檢索難題窖壕;(數(shù)據(jù)庫(kù)代理中間件:mysql-proxy瞻讽、Cobar熏挎、MaxScale等;)
5)如何解決統(tǒng)計(jì)分析問(wèn)題;(離線(xiàn)、近實(shí)時(shí))
傳統(tǒng)數(shù)據(jù)庫(kù)的應(yīng)對(duì)解決方案
解決要點(diǎn):
1)通過(guò)主從備份解決數(shù)據(jù)安全性問(wèn)題廉白;
2)通過(guò)數(shù)據(jù)庫(kù)代理中間件心跳監(jiān)測(cè)猴蹂,解決單點(diǎn)故障問(wèn)題楣嘁;
3)通過(guò)代理中間件將查詢(xún)語(yǔ)句分發(fā)到各個(gè)slave節(jié)點(diǎn)進(jìn)行查詢(xún)珍逸,并匯總結(jié)果
非關(guān)系型數(shù)據(jù)庫(kù)的解決方案
對(duì)于Nosql數(shù)據(jù)庫(kù)谆膳,以mongodb為例漱病,其它原理類(lèi)似:
解決要點(diǎn):
1)通過(guò)副本備份保證數(shù)據(jù)安全性杨帽;
2)通過(guò)節(jié)點(diǎn)競(jìng)選機(jī)制解決單點(diǎn)問(wèn)題嗤军;
3)先從配置庫(kù)檢索分片信息叙赚,然后將請(qǐng)求分發(fā)到各個(gè)節(jié)點(diǎn),最后由路由節(jié)點(diǎn)合并匯總結(jié)果
ES定義
ES=elaticsearch簡(jiǎn)寫(xiě)沿量, Elasticsearch是一個(gè)開(kāi)源的高擴(kuò)展的分布式全文檢索引擎朴则,它可以近乎實(shí)時(shí)的存儲(chǔ)钓简、檢索數(shù)據(jù)外邓;本身擴(kuò)展性很好,可以擴(kuò)展到上百臺(tái)服務(wù)器侦啸,處理PB級(jí)別的數(shù)據(jù)光涂。
Elasticsearch也使用Java開(kāi)發(fā)并使用Lucene作為其核心來(lái)實(shí)現(xiàn)所有索引和搜索的功能拧烦,但是它的目的是通過(guò)簡(jiǎn)單的RESTful API來(lái)隱藏Lucene的復(fù)雜性恋博,從而讓全文搜索變得簡(jiǎn)單私恬。
ES主要解決問(wèn)題:
1)檢索相關(guān)數(shù)據(jù)本鸣;
2)返回統(tǒng)計(jì)結(jié)果永高;
3)速度要快提针。
ES核心概念
1)Cluster:集群辐脖。
ES可以作為一個(gè)獨(dú)立的單個(gè)搜索服務(wù)器嗜价。不過(guò),為了處理大型數(shù)據(jù)集家淤,實(shí)現(xiàn)容錯(cuò)和高可用性絮重,ES可以運(yùn)行在許多互相合作的服務(wù)器上歹苦。這些服務(wù)器的集合稱(chēng)為集群殴瘦。
2)Node:節(jié)點(diǎn)。
形成集群的每個(gè)服務(wù)器稱(chēng)為節(jié)點(diǎn)丰歌。
3)Shard:分片动遭。
當(dāng)有大量的文檔時(shí)神得,由于內(nèi)存的限制哩簿、磁盤(pán)處理能力不足、無(wú)法足夠快的響應(yīng)客戶(hù)端的請(qǐng)求等羡玛,一個(gè)節(jié)點(diǎn)可能不夠宗苍。這種情況下讳窟,數(shù)據(jù)可以分為較小的分片。每個(gè)分片放到不同的服務(wù)器上谋右。
當(dāng)你查詢(xún)的索引分布在多個(gè)分片上時(shí)改执,ES會(huì)把查詢(xún)發(fā)送給每個(gè)相關(guān)的分片坑雅,并將結(jié)果組合在一起裹粤,而應(yīng)用程序并不知道分片的存在。即:這個(gè)過(guò)程對(duì)用戶(hù)來(lái)說(shuō)是透明的后豫。
4)Replia:副本挫酿。
為提高查詢(xún)吞吐量或?qū)崿F(xiàn)高可用性愕难,可以使用分片副本。
副本是一個(gè)分片的精確復(fù)制葱弟,每個(gè)分片可以有零個(gè)或多個(gè)副本芝加。ES中可以有許多相同的分片射窒,其中之一被選擇更改索引操作,這種特殊的分片稱(chēng)為主分片蝌麸。
當(dāng)主分片丟失時(shí),如:該分片所在的數(shù)據(jù)不可用時(shí)敢辩,集群將副本提升為新的主分片戚长。
5)全文檢索历葛。
全文檢索就是對(duì)一篇文章進(jìn)行索引嘀略,可以根據(jù)關(guān)鍵字搜索,類(lèi)似于mysql里的like語(yǔ)句咒程。
全文索引就是把內(nèi)容根據(jù)詞的意義進(jìn)行分詞帐姻,然后分別創(chuàng)建索引奶段,例如”你們的激情是因?yàn)槭裁词虑閬?lái)的” 可能會(huì)被分詞成:“你們“痹籍,”激情“,“什么事情“棺克,”來(lái)“ 等token娜谊,這樣當(dāng)你搜索“你們” 或者 “激情” 都會(huì)把這句搜出來(lái)斤讥。
ES數(shù)據(jù)架構(gòu)的主要概念(與關(guān)系數(shù)據(jù)庫(kù)Mysql對(duì)比)
(1)關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)(DataBase),等價(jià)于ES中的索引(Index)
(2)一個(gè)數(shù)據(jù)庫(kù)下面有N張表(Table)撑帖,等價(jià)于1個(gè)索引Index下面有N多類(lèi)型(Type)澳眷,
(3)一個(gè)數(shù)據(jù)庫(kù)表(Table)下的數(shù)據(jù)由多行(ROW)多列(column钳踊,屬性)組成拓瞪,等價(jià)于1個(gè)Type由多個(gè)文檔(Document)和多Field組成助琐。
(4)在一個(gè)關(guān)系型數(shù)據(jù)庫(kù)里面,schema定義了表蛆橡、每個(gè)表的字段泰演,還有表和字段之間的關(guān)系葱轩。 與之對(duì)應(yīng)的,在ES中:Mapping定義索引下的Type的字段處理規(guī)則垃喊,即索引如何建立袜炕、索引類(lèi)型、是否保存原始索引JSON文檔耕突、是否壓縮原始JSON文檔评架、是否需要分詞處理纵诞、如何進(jìn)行分詞處理等。
(5)在數(shù)據(jù)庫(kù)中的增insert登刺、刪delete、改update皇耗、查search操作等價(jià)于ES中的增PUT/POST郎楼、刪Delete窒悔、改_update、查GET.
Elasticsearch與關(guān)系數(shù)據(jù)的類(lèi)比對(duì)應(yīng)關(guān)系如下:
Relational DB ? Databases ? Tables ? Rows ? Columns
Elasticsearch ? Indices ? Types ? Documents ? Fields
實(shí)例:新浪是如何分析處理32億條實(shí)時(shí)日志的
http://dockone.io/article/505
什么是一個(gè)Shard阶界?
Shard就是一個(gè)Lucene Index
Index需要多少個(gè)Shard膘融?
Shard數(shù) = Node數(shù)珍策?
總體上說(shuō),當(dāng)我們節(jié)點(diǎn)數(shù)和Shard數(shù)相等時(shí)屯耸,ElasticSearch集群的性能可以達(dá)到最優(yōu)疗绣。即铺韧,對(duì)于一個(gè)3節(jié)點(diǎn)集群,我們?yōu)槊總€(gè)集群節(jié)點(diǎn)分配一個(gè)Shard塔逃,總共3個(gè)Shard湾盗。但是由于ElasticSearch的不可變性(Immutable)的限制立轧,系統(tǒng)無(wú)法對(duì)Shard進(jìn)行重新拆分分配,除非重新索引這個(gè)文件集合帐萎。所以,當(dāng)我們需要增加更多節(jié)點(diǎn)的時(shí)候赁项,又希望Shard能利用到增加節(jié)點(diǎn)帶來(lái)的系統(tǒng)性能提升時(shí)肤舞,我們就不得不進(jìn)行重新索引均蜜,由于重索引開(kāi)銷(xiāo)巨大囤耳,這是我們不希望看到的充择。
如果需要重新建立索引,將會(huì)是一個(gè)巨大的開(kāi)銷(xiāo)椎麦,為了支持未來(lái)可能的水平擴(kuò)展材彪,我們會(huì)為集群分配比node數(shù)更多的shard數(shù)段化,也就是說(shuō)每個(gè)節(jié)點(diǎn)會(huì)有多個(gè)Shard。
如果單個(gè)node分配多個(gè)shard雄嚣,就會(huì)引入另外一系列的性能問(wèn)題缓升,我們知道對(duì)于任意一次完整的搜索蕴轨,ElasticSearch會(huì)分別對(duì)每個(gè)shard進(jìn)行查詢(xún),最后進(jìn)行匯總封锉。當(dāng)節(jié)點(diǎn)數(shù)和shard數(shù)是一對(duì)一的時(shí)候,所有的查詢(xún)可以并行運(yùn)行碾局。但是奴艾,對(duì)于具有多個(gè)shard的節(jié)點(diǎn)蕴潦,如果磁盤(pán)是15000RPM或SSD潭苞,可能會(huì)相對(duì)較快,但是這也會(huì)存在等待響應(yīng)的問(wèn)題僧诚,所以通常不推薦一個(gè)節(jié)點(diǎn)超過(guò)2個(gè)shard湖笨。
3節(jié)點(diǎn)6shard慈省,即每個(gè)節(jié)點(diǎn)2shard眠菇,這可以使我們?cè)谖磥?lái)輕松的橫向擴(kuò)展到6個(gè)節(jié)點(diǎn)边败,應(yīng)對(duì)許多極端的場(chǎng)景放闺。
Replicas數(shù)呢怖侦?
Replica也是Shard匾寝,與shard不同的是荷腊,replica只會(huì)參與讀操作,同時(shí)也能提高集群的可用性猜年。對(duì)于Replica來(lái)說(shuō),它的主要作用就是提高集群錯(cuò)誤恢復(fù)的能力床三,所以replica的數(shù)目與shard的數(shù)目以及node的數(shù)目相關(guān)撇簿,與shard不同的是四瘫,replica的數(shù)目可以在集群建立之后變更,切代價(jià)較小找蜜,所以相比shard的數(shù)目而言锹杈,沒(méi)有那么重要。
例子:
3 node, 3 shard, 1 replica (each)
一個(gè)節(jié)點(diǎn)宕機(jī)