題記:
Elasticsearch研究有一段時間了,現(xiàn)特將Elasticsearch相關(guān)核心知識、原理從初學(xué)者認(rèn)知、學(xué)習(xí)的角度,從以下9個方面進(jìn)行詳細(xì)梳理。歡迎討論……
(1)思考:大規(guī)模數(shù)據(jù)如何檢索?
如:當(dāng)系統(tǒng)數(shù)據(jù)量上了10億、100億條的時候,我們在做系統(tǒng)架構(gòu)的時候通常會從以下角度去考慮問題:?
1)用什么數(shù)據(jù)庫好?(mysql、sybase、oracle、達(dá)夢、神通、mongodb、hbase…)?
2)如何解決單點故障;(lvs、F5、A10、Zookeep、MQ)?
3)如何保證數(shù)據(jù)安全性;(熱備、冷備、異地多活)?
4)如何解決檢索難題;(數(shù)據(jù)庫代理中間件:mysql-proxy、Cobar、MaxScale等;)?
5)如何解決統(tǒng)計分析問題;(離線、近實時)
(2)傳統(tǒng)數(shù)據(jù)庫的應(yīng)對解決方案
對于關(guān)系型數(shù)據(jù),我們通常采用以下或類似架構(gòu)去解決查詢瓶頸和寫入瓶頸:?
解決要點:?
1)通過主從備份解決數(shù)據(jù)安全性問題;?
2)通過數(shù)據(jù)庫代理中間件心跳監(jiān)測,解決單點故障問題;?
3)通過代理中間件將查詢語句分發(fā)到各個slave節(jié)點進(jìn)行查詢,并匯總結(jié)果?
(3)非關(guān)系型數(shù)據(jù)庫的解決方案
對于Nosql數(shù)據(jù)庫,以mongodb為例,其它原理類似:?
解決要點:?
1)通過副本備份保證數(shù)據(jù)安全性;?
2)通過節(jié)點競選機制解決單點問題;?
3)先從配置庫檢索分片信息,然后將請求分發(fā)到各個節(jié)點,最后由路由節(jié)點合并匯總結(jié)果?
另辟蹊徑——完全把數(shù)據(jù)放入內(nèi)存怎么樣?
我們知道,完全把數(shù)據(jù)放在內(nèi)存中是不可靠的,實際上也不太現(xiàn)實,當(dāng)我們的數(shù)據(jù)達(dá)到PB級別時,按照每個節(jié)點96G內(nèi)存計算,在內(nèi)存完全裝滿的數(shù)據(jù)情況下,我們需要的機器是:1PB=1024T=1048576G?
節(jié)點數(shù)=1048576/96=10922個?
實際上,考慮到數(shù)據(jù)備份,節(jié)點數(shù)往往在2.5萬臺左右。成本巨大決定了其不現(xiàn)實!
從前面討論我們了解到,把數(shù)據(jù)放在內(nèi)存也好,不放在內(nèi)存也好,都不能完完全全解決問題。?
全部放在內(nèi)存速度問題是解決了,但成本問題上來了。?
為解決以上問題,從源頭著手分析,通常會從以下方式來尋找方法:?
1、存儲數(shù)據(jù)時按有序存儲;?
2、將數(shù)據(jù)和索引分離;?
3、壓縮數(shù)據(jù);?
這就引出了Elasticsearch。
ES=elaticsearch簡寫, Elasticsearch是一個開源的高擴(kuò)展的分布式全文檢索引擎,它可以近乎實時的存儲、檢索數(shù)據(jù);本身擴(kuò)展性很好,可以擴(kuò)展到上百臺服務(wù)器,處理PB級別的數(shù)據(jù)。?
Elasticsearch也使用Java開發(fā)并使用Lucene作為其核心來實現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復(fù)雜性,從而讓全文搜索變得簡單。
1)Lucene只是一個庫。想要使用它,你必須使用Java來作為開發(fā)語言并將其直接集成到你的應(yīng)用中,更糟糕的是,Lucene非常復(fù)雜,你需要深入了解檢索的相關(guān)知識來理解它是如何工作的。
2)Elasticsearch也使用Java開發(fā)并使用Lucene作為其核心來實現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復(fù)雜性,從而讓全文搜索變得簡單。
1)檢索相關(guān)數(shù)據(jù);?
2)返回統(tǒng)計結(jié)果;?
3)速度要快。
當(dāng)ElasticSearch的節(jié)點啟動后,它會利用多播(multicast)(或者單播,如果用戶更改了配置)尋找集群中的其它節(jié)點,并與之建立連接。這個過程如下圖所示:?
ES可以作為一個獨立的單個搜索服務(wù)器。不過,為了處理大型數(shù)據(jù)集,實現(xiàn)容錯和高可用性,ES可以運行在許多互相合作的服務(wù)器上。這些服務(wù)器的集合稱為集群。
形成集群的每個服務(wù)器稱為節(jié)點。
當(dāng)有大量的文檔時,由于內(nèi)存的限制、磁盤處理能力不足、無法足夠快的響應(yīng)客戶端的請求等,一個節(jié)點可能不夠。這種情況下,數(shù)據(jù)可以分為較小的分片。每個分片放到不同的服務(wù)器上。?
當(dāng)你查詢的索引分布在多個分片上時,ES會把查詢發(fā)送給每個相關(guān)的分片,并將結(jié)果組合在一起,而應(yīng)用程序并不知道分片的存在。即:這個過程對用戶來說是透明的。
為提高查詢吞吐量或?qū)崿F(xiàn)高可用性,可以使用分片副本。?
副本是一個分片的精確復(fù)制,每個分片可以有零個或多個副本。ES中可以有許多相同的分片,其中之一被選擇更改索引操作,這種特殊的分片稱為主分片。?
當(dāng)主分片丟失時,如:該分片所在的數(shù)據(jù)不可用時,集群將副本提升為新的主分片。
全文檢索就是對一篇文章進(jìn)行索引,可以根據(jù)關(guān)鍵字搜索,類似于mysql里的like語句。?
全文索引就是把內(nèi)容根據(jù)詞的意義進(jìn)行分詞,然后分別創(chuàng)建索引,例如”你們的激情是因為什么事情來的” 可能會被分詞成:“你們“,”激情“,“什么事情“,”來“ 等token,這樣當(dāng)你搜索“你們” 或者 “激情” 都會把這句搜出來。
1.6 ES數(shù)據(jù)架構(gòu)的主要概念(與關(guān)系數(shù)據(jù)庫Mysql對比)
(1)關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)庫(DataBase),等價于ES中的索引(Index)?
(2)一個數(shù)據(jù)庫下面有N張表(Table),等價于1個索引Index下面有N多類型(Type),?
(3)一個數(shù)據(jù)庫表(Table)下的數(shù)據(jù)由多行(ROW)多列(column,屬性)組成,等價于1個Type由多個文檔(Document)和多Field組成。?
(4)在一個關(guān)系型數(shù)據(jù)庫里面,schema定義了表、每個表的字段,還有表和字段之間的關(guān)系。 與之對應(yīng)的,在ES中:Mapping定義索引下的Type的字段處理規(guī)則,即索引如何建立、索引類型、是否保存原始索引JSON文檔、是否壓縮原始JSON文檔、是否需要分詞處理、如何進(jìn)行分詞處理等。?
(5)在數(shù)據(jù)庫中的增insert、刪delete、改update、查search操作等價于ES中的增PUT/POST、刪Delete、改_update、查GET.
ELK=elasticsearch+Logstash+kibana?
elasticsearch:后臺分布式存儲以及全文檢索?
logstash: 日志加工、“搬運工”?
kibana:數(shù)據(jù)可視化展示。?
ELK架構(gòu)為數(shù)據(jù)分布式存儲、可視化查詢和日志解析創(chuàng)建了一個功能強大的管理鏈。 三者相互配合,取長補短,共同完成分布式大數(shù)據(jù)處理工作。
1)分布式實時文件存儲,可將每一個字段存入索引,使其可以被檢索到。?
2)實時分析的分布式搜索引擎。?
分布式:索引分拆成多個分片,每個分片可有零個或多個副本。集群中的每個數(shù)據(jù)節(jié)點都可承載一個或多個分片,并且協(xié)調(diào)和處理各種操作;?
負(fù)載再平衡和路由在大多數(shù)情況下自動完成。?
3)可以擴(kuò)展到上百臺服務(wù)器,處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。也可以運行在單臺PC上(已測試)?
4)支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件等。
(1)硬件配置:?
CPU 16核 AuthenticAMD?
內(nèi)存 總量:32GB?
硬盤 總量:500GB 非SSD
(2)在上述硬件指標(biāo)的基礎(chǔ)上測試性能如下:?
1)平均索引吞吐量: 12307docs/s(每個文檔大?。?0B/docs)?
2)平均CPU使用率: 887.7%(16核,平均每核:55.48%)?
3)構(gòu)建索引大?。?3.30111 GB?
4)總寫入量: 20.2123 GB?
5)測試總耗時: 28m 54s.
使用參考:http://blog.csdn.net/laoyang360/article/details/52155481
1) 2013年初,GitHub拋棄了Solr,采取ElasticSearch 來做PB級的搜索。 “GitHub使用ElasticSearch搜索20TB的數(shù)據(jù),包括13億文件和1300億行代碼”。
2)維基百科:啟動以elasticsearch為基礎(chǔ)的核心搜索架構(gòu)。?
3)SoundCloud:“SoundCloud使用ElasticSearch為1.8億用戶提供即時而精準(zhǔn)的音樂搜索服務(wù)”。?
4)百度:百度目前廣泛使用ElasticSearch作為文本數(shù)據(jù)分析,采集百度所有服務(wù)器上的各類指標(biāo)數(shù)據(jù)及用戶自定義數(shù)據(jù),通過對各種數(shù)據(jù)進(jìn)行多維分析展示,輔助定位分析實例異?;驑I(yè)務(wù)層面異常。目前覆蓋百度內(nèi)部20多個業(yè)務(wù)線(包括casio、云分析、網(wǎng)盟、預(yù)測、文庫、直達(dá)號、錢包、風(fēng)控等),單集群最大100臺機器,200個ES節(jié)點,每天導(dǎo)入30TB+數(shù)據(jù)。
實際項目開發(fā)實戰(zhàn)中,幾乎每個系統(tǒng)都會有一個搜索的功能,當(dāng)搜索做到一定程度時,維護(hù)和擴(kuò)展起來難度就會慢慢變大,所以很多公司都會把搜索單獨獨立出一個模塊,用ElasticSearch等來實現(xiàn)。
近年ElasticSearch發(fā)展迅猛,已經(jīng)超越了其最初的純搜索引擎的角色,現(xiàn)在已經(jīng)增加了數(shù)據(jù)聚合分析(aggregation)和可視化的特性,如果你有數(shù)百萬的文檔需要通過關(guān)鍵詞進(jìn)行定位時,ElasticSearch肯定是最佳選擇。當(dāng)然,如果你的文檔是JSON的,你也可以把ElasticSearch當(dāng)作一種“NoSQL數(shù)據(jù)庫”, 應(yīng)用ElasticSearch數(shù)據(jù)聚合分析(aggregation)的特性,針對數(shù)據(jù)進(jìn)行多維度的分析。
【知乎:熱酷架構(gòu)師潘飛】ES在某些場景下替代傳統(tǒng)DB?
個人以為Elasticsearch作為內(nèi)部存儲來說還是不錯的,效率也基本能夠滿足,在某些方面替代傳統(tǒng)DB也是可以的,前提是你的業(yè)務(wù)不對操作的事性務(wù)有特殊要求;而權(quán)限管理也不用那么細(xì),因為ES的權(quán)限這塊還不完善。?
由于我們對ES的應(yīng)用場景僅僅是在于對某段時間內(nèi)的數(shù)據(jù)聚合操作,沒有大量的單文檔請求(比如通過userid來找到一個用戶的文檔,類似于NoSQL的應(yīng)用場景),所以能否替代NoSQL還需要各位自己的測試。?
如果讓我選擇的話,我會嘗試使用ES來替代傳統(tǒng)的NoSQL,因為它的橫向擴(kuò)展機制太方便了。
1)新系統(tǒng)開發(fā)嘗試使用ES作為存儲和檢索服務(wù)器;?
2)現(xiàn)有系統(tǒng)升級需要支持全文檢索服務(wù),需要使用ES。?
以上兩種架構(gòu)的使用,以下鏈接進(jìn)行詳細(xì)闡述。?
http://blog.csdn.net/laoyang360/article/details/52227541
1)新浪ES 如何分析處理32億條實時日志?http://dockone.io/article/505?
2)阿里ES 構(gòu)建挖財自己的日志采集和分析體系?http://afoo.me/columns/tec/logging-platform-spec.html?
3)有贊ES 業(yè)務(wù)日志處理?http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/?
4)ES實現(xiàn)站內(nèi)搜索?http://www.wtoutiao.com/p/13bkqiZ.html
1)零配置,開箱即用?
2)沒有繁瑣的安裝配置?
3)java版本要求:最低1.7?
我使用的1.8?
[root@laoyang config_lhy]# echo $JAVA_HOME?
/opt/jdk1.8.0_91?
4)下載地址:?
5)啟動?
cd /usr/local/elasticsearch-2.3.5?
./bin/elasticsearch?
bin/elasticsearch -d(后臺運行)
必要的Head、kibana、IK(中文分詞)、graph等插件的詳細(xì)安裝和使用。?
http://blog.csdn.net/column/details/deep-elasticsearch.html
自寫bat腳本實現(xiàn)windows下一鍵安裝。?
1)一鍵安裝ES及必要插件(head、kibana、IK、logstash等)?
2)安裝后以服務(wù)形式運行ES。?
3)比自己摸索安裝節(jié)省至少2小時時間,效率非常高。?
腳本說明:?
http://blog.csdn.net/laoyang360/article/details/51900235
http://www.ibm.com/developerworks/library/j-use-elasticsearch-java-apps/index.html
常見的增、刪、改、查操作實現(xiàn):?
http://blog.csdn.net/laoyang360/article/details/51931981
1)國外:https://discuss.elastic.co/?
2)國內(nèi):http://elasticsearch.cn/
[1]?http://www.tuicool.com/articles/7fueUbb?
[2]?http://zhaoyanblog.com/archives/495.html?
[3]《Elasticsearch服務(wù)器開發(fā)》?
[4]《實戰(zhàn)Elasticsearch、Logstash、Kibana》?
[5]《Elasticsearch In Action》?
[6]《某ES大牛PPT》
作者:銘毅天下?
轉(zhuǎn)載請標(biāo)明出處,原文地址:?