帶着問題上路——ES是如何產生的?javascript
如:當系統數據量上了10億、100億條的時候,咱們在作系統架構的時候一般會從如下角度去考慮問題:
1)用什麼數據庫好?(mysql、sybase、oracle、達夢、神通、mongodb、hbase…)
2)如何解決單點故障;(lvs、F五、A十、Zookeep、MQ)
3)如何保證數據安全性;(熱備、冷備、異地多活)
4)如何解決檢索難題;(數據庫代理中間件:mysql-proxy、Cobar、MaxScale等;)
5)如何解決統計分析問題;(離線、近實時)html
對於關係型數據,咱們一般採用如下或相似架構去解決查詢瓶頸和寫入瓶頸:
解決要點:
1)經過主從備份解決數據安全性問題;
2)經過數據庫代理中間件心跳監測,解決單點故障問題;
3)經過代理中間件將查詢語句分發到各個slave節點進行查詢,並彙總結果 java
對於Nosql數據庫,以mongodb爲例,其它原理相似:
解決要點:
1)經過副本備份保證數據安全性;
2)經過節點競選機制解決單點問題;
3)先從配置庫檢索分片信息,而後將請求分發到各個節點,最後由路由節點合併彙總結果 node
咱們知道,徹底把數據放在內存中是不可靠的,實際上也不太現實,當咱們的數據達到PB級別時,按照每一個節點96G內存計算,在內存徹底裝滿的數據狀況下,咱們須要的機器是:1PB=1024T=1048576G
節點數=1048576/96=10922個
實際上,考慮到數據備份,節點數每每在2.5萬臺左右。成本巨大決定了其不現實!mysql
從前面討論咱們瞭解到,把數據放在內存也好,不放在內存也好,都不能完徹底全解決問題。
所有放在內存速度問題是解決了,但成本問題上來了。
爲解決以上問題,從源頭着手分析,一般會從如下方式來尋找方法:
一、存儲數據時按有序存儲;
二、將數據和索引分離;
三、壓縮數據;
這就引出了Elasticsearch。git
ES=elaticsearch簡寫, Elasticsearch是一個開源的高擴展的分佈式全文檢索引擎,它能夠近乎實時的存儲、檢索數據;自己擴展性很好,能夠擴展到上百臺服務器,處理PB級別的數據。
Elasticsearch也使用Java開發並使用Lucene做爲其核心來實現全部索引和搜索的功能,可是它的目的是經過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。github
1)Lucene只是一個庫。想要使用它,你必須使用Java來做爲開發語言並將其直接集成到你的應用中,更糟糕的是,Lucene很是複雜,你須要深刻了解檢索的相關知識來理解它是如何工做的。sql
2)Elasticsearch也使用Java開發並使用Lucene做爲其核心來實現全部索引和搜索的功能,可是它的目的是經過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。mongodb
1)檢索相關數據;
2)返回統計結果;
3)速度要快。數據庫
當ElasticSearch的節點啓動後,它會利用多播(multicast)(或者單播,若是用戶更改了配置)尋找集羣中的其它節點,並與之創建鏈接。這個過程以下圖所示:
ES能夠做爲一個獨立的單個搜索服務器。不過,爲了處理大型數據集,實現容錯和高可用性,ES能夠運行在許多互相合做的服務器上。這些服務器的集合稱爲集羣。
造成集羣的每一個服務器稱爲節點。
當有大量的文檔時,因爲內存的限制、磁盤處理能力不足、沒法足夠快的響應客戶端的請求等,一個節點可能不夠。這種狀況下,數據能夠分爲較小的分片。每一個分片放到不一樣的服務器上。
當你查詢的索引分佈在多個分片上時,ES會把查詢發送給每一個相關的分片,並將結果組合在一塊兒,而應用程序並不知道分片的存在。即:這個過程對用戶來講是透明的。
爲提升查詢吞吐量或實現高可用性,可使用分片副本。
副本是一個分片的精確複製,每一個分片能夠有零個或多個副本。ES中能夠有許多相同的分片,其中之一被選擇更改索引操做,這種特殊的分片稱爲主分片。
當主分片丟失時,如:該分片所在的數據不可用時,集羣將副本提高爲新的主分片。
全文檢索就是對一篇文章進行索引,能夠根據關鍵字搜索,相似於mysql裏的like語句。
全文索引就是把內容根據詞的意義進行分詞,而後分別建立索引,例如」大家的激情是由於什麼事情來的」 可能會被分詞成:「大家「,」激情「,「什麼事情「,」來「 等token,這樣當你搜索「大家」 或者 「激情」 都會把這句搜出來。
(1)關係型數據庫中的數據庫(DataBase),等價於ES中的索引(Index)
(2)一個數據庫下面有N張表(Table),等價於1個索引Index下面有N多類型(Type),
(3)一個數據庫表(Table)下的數據由多行(ROW)多列(column,屬性)組成,等價於1個Type由多個文檔(Document)和多Field組成。
(4)在一個關係型數據庫裏面,schema定義了表、每一個表的字段,還有表和字段之間的關係。 與之對應的,在ES中:Mapping定義索引下的Type的字段處理規則,即索引如何創建、索引類型、是否保存原始索引JSON文檔、是否壓縮原始JSON文檔、是否須要分詞處理、如何進行分詞處理等。
(5)在數據庫中的增insert、刪delete、改update、查search操做等價於ES中的增PUT/POST、刪Delete、改_update、查GET.
ELK=elasticsearch+Logstash+kibana
elasticsearch:後臺分佈式存儲以及全文檢索
logstash: 日誌加工、「搬運工」
kibana:數據可視化展現。
ELK架構爲數據分佈式存儲、可視化查詢和日誌解析建立了一個功能強大的管理鏈。 三者相互配合,取長補短,共同完成分佈式大數據處理工做。
1. 分佈式實時文件存儲,可將每個字段存入索引,使其能夠被檢索到。
2. 實時分析的分佈式搜索引擎。
分佈式:索引分拆成多個分片,每一個分片可有零個或多個副本。集羣中的每一個數據節點均可承載一個或多個分片,而且協調和處理各類操做; 負載再平衡和路由在大多數狀況下自動完成。
3. 能夠擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。也能夠運行在單臺PC上(已測試)
4. 支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件等。
(1)硬件配置:
CPU 16核 AuthenticAMD
內存 總量:32GB
硬盤 總量:500GB 非SSD
(2)在上述硬件指標的基礎上測試性能以下:
1)平均索引吞吐量: 12307docs/s(每一個文檔大小:40B/docs)
2)平均CPU使用率: 887.7%(16核,平均每核:55.48%)
3)構建索引大小: 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的數據,包括13億文件和1300億行代碼」。
2)維基百科:啓動以elasticsearch爲基礎的核心搜索架構。
3)SoundCloud:「SoundCloud使用ElasticSearch爲1.8億用戶提供即時而精準的音樂搜索服務」。
4)百度:百度目前普遍使用ElasticSearch做爲文本數據分析,採集百度全部服務器上的各種指標數據及用戶自定義數據,經過對各類數據進行多維分析展現,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單集羣最大100臺機器,200個ES節點,天天導入30TB+數據。
實際項目開發實戰中,幾乎每一個系統都會有一個搜索的功能,當搜索作到必定程度時,維護和擴展起來難度就會慢慢變大,因此不少公司都會把搜索單獨獨立出一個模塊,用ElasticSearch等來實現。
近年ElasticSearch發展迅猛,已經超越了其最初的純搜索引擎的角色,如今已經增長了數據聚合分析(aggregation)和可視化的特性,若是你有數百萬的文檔須要經過關鍵詞進行定位時,ElasticSearch確定是最佳選擇。固然,若是你的文檔是JSON的,你也能夠把ElasticSearch看成一種「NoSQL數據庫」, 應用ElasticSearch數據聚合分析(aggregation)的特性,針對數據進行多維度的分析。
【知乎:熱酷架構師潘飛】ES在某些場景下替代傳統DB
我的覺得Elasticsearch做爲內部存儲來講仍是不錯的,效率也基本可以知足,在某些方面替代傳統DB也是能夠的,前提是你的業務不對操做的事性務有特殊要求;而權限管理也不用那麼細,由於ES的權限這塊還不完善。
因爲咱們對ES的應用場景僅僅是在於對某段時間內的數據聚合操做,沒有大量的單文檔請求(好比經過userid來找到一個用戶的文檔,相似於NoSQL的應用場景),因此可否替代NoSQL還須要各位本身的測試。
若是讓我選擇的話,我會嘗試使用ES來替代傳統的NoSQL,由於它的橫向擴展機制太方便了。
1)新系統開發嘗試使用ES做爲存儲和檢索服務器;
2)現有系統升級須要支持全文檢索服務,須要使用ES。
以上兩種架構的使用,如下連接進行詳細闡述。
http://blog.csdn.net/laoyang360/article/details/52227541
1)新浪ES 如何分析處理32億條實時日誌 http://dockone.io/article/505
2)阿里ES 構建挖財本身的日誌採集和分析體系 http://afoo.me/columns/tec/logging-platform-spec.html
3)有贊ES 業務日誌處理 http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/
4)ES實現站內搜索 http://www.wtoutiao.com/p/13bkqiZ.html
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
注:npm install 以後若出現錯誤,能夠刪除node_mudlues文件夾,npm install grunt-cli -g,npm install grunt -g,而後在npm install
瀏覽器輸入127.0.0.1:9100
官網搜索https://www.elastic.co/cn/downloads/kibana下載,注意要與elasticsearch版本一致
下載以後,進入bin目錄
kibana.bat
瀏覽器輸入127.0.0.1:5601