tft每日頭條

 > 生活

 > elasticsearch為啥這麼快

elasticsearch為啥這麼快

生活 更新时间:2025-01-26 05:11:35

入行 Elastic-Stack 技術棧很久了,為了免于知識匮乏眼光局限,有必要到外面的世界看看,豐富自己的世界觀。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)1

圖片來自 Pexels

本篇内容從 Elastic 的競争産品角度分析探讨:

  • 哪些應用場景下使用 Elasticsearch 最佳?
  • 哪些應用場景下不使用 Elasticsearch 最好?

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)2

Elasticsearch 當前熱度排名很高

本文僅代表個人的觀點,不代表社區技術陣營觀點,無意口水之争,限于本人的經驗知識有限,可能與讀者觀點認知不一緻。

競争産品

Elasticseach 從做搜索引擎開始,到現在主攻大數據分析領域,逐步進化成了一個全能型的數據産品。

在 Elasticsearch 諸多優秀的功能中,與很多數據産品有越來越多的交叉競争,有的功能很有特色,有的功能隻是附帶,了解這些産品特點有助于更好的應用于業務需求。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)3

Elasticsearch 競争圖譜示意圖

Lucene

Lucene 是一個搜索的核心庫,Elastic 也是在 Lucene 基礎之上構建,它們之間的競争關系是由 Lucene 本身決定的。

在互聯網 2.0 時代,考驗各互聯網公司最簡單的技術要求,就是看他們的搜索做的怎麼樣,那時大家的做法幾乎一樣,都基于 Lucene 核心庫構建一套搜索引擎,剩下的就看各公司的開發者們的水平。

筆者有幸在 2012 年之前,基于 Lucene 做過垂直行業的搜索引擎,遇到很多問題有必要說一下:

  • 項目基于 Lucene 包裝,業務代碼與核心庫一起構建發布,代碼耦合度很高,每次有數據字段變更,都需要重新編譯打包發布,這個過程非常的繁瑣,且相當危險。
  • 程序重新發布,需要關閉原有的程序,涉及到進程切換問題。
  • 索引數據定期全量重新生成,也涉及到新舊索引切換,索引實時刷新等問題,都需要設計一套複雜的程序機制保障
  • 每個獨立業務線需求,都需要單獨構建一個 Lucene 索引進程,業務線多了之後,管理是個麻煩的事情
  • 當單個 Lucene 索引數據超過單實例限制之後,需要做分布式,這個原有 Lucene 是沒有辦法的,所以常規的做法也是按照某特定分類,拆分成多個索引進程,客戶端查詢時帶上特定分類,後端根據特定分類路由到具體的索引。
  • Lucene 庫本身的掌控難度,對于功力尚淺的開發工程師,需要考慮的因素實在太多了,稍微不慎,就會出現很大的程序問題。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)4

Lucene 内部索引構建與查詢過程

Elasticsearch 與 Lucene 核心庫競争的優勢在于:

  • 完美封裝了 Lucene 核心庫,設計了友好的 Restful-API,開發者無需過多關注底層機制,直接開箱即用。
  • 分片與副本機制,直接解決了集群下性能與高可用問題。

Elastic 近年的快速發展,市面上已經很少發現基于 Lucene 構建搜索引擎的項目,幾乎清一色選擇 Elasticsearch 作為基礎數據庫服務。

由于其開源特性,廣大雲廠商也在此基礎上定制開發,與自己的雲平台深度集成,但也沒有獨自發展一個分支。本次的競争中,Elasticsearch 完勝。

Solr

Solr 是第一個基于 Lucene 核心庫功能完備的搜索引擎産品,誕生遠早于 Elasticsearch。

早期在全文搜索領域,Solr 有非常大的優勢,幾乎完全壓倒 Elastic,在近幾年大數據發展時代,Elastic 由于其分布式特性,滿足了很多大數據的處理需求。

特别是後面 ELK 這個概念的流行,幾乎完全忘記了 Solr 的存在,雖然也推出了 Solr-Coud 分布式産品,但已經基本無優勢。

接觸過幾個數據類公司,全文搜索都基于 Solr 構建,且是單節點模式,偶然出現一些問題,找咨詢顧問排查問題,人員難找,後面都遷移到 Elasticsearch 之上。

現在市面上幾乎大大小小公司都在使用 Elasticsearch,除了老舊系統有的基于 Solr 的,新系統項目應該全部是 Elasticsearch。

個人認為有以下幾個原因:

  • ES 比 Solr 更加友好簡潔,門檻更低。
  • ES 比 Solr 産品功能特點更加豐富,分片機制,數據分析能力。
  • ES 生态發展,Elastic-stack 整個技術棧相當全,與各種數據系統都很容易集成。
  • ES 社區發展更加活躍,Solr 幾乎沒有專門的技術分析大會。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)5

Solr 産品功能模塊内部架構圖

本次競争中,Elasticsearch 完勝。

RDBMS

關系型數據庫與 Elasticsarch 相比主要優點是事務隔離機制無可替代,但其局限性很明顯。

主要幾個方面如下:

  • 關系型數據庫查詢性能,數據量超過百萬級千萬級之後下降厲害,本質是索引的算法效率不行,B 樹算法不如倒排索引算法高效。
  • 關系型數據庫索引最左原則限制,查詢條件字段不能任意組合,否則索引失效,相反 Elasticserach 可以任意組合,此場景在數據表關聯查詢時特别明顯,Elasticsearch 可以采用大寬表解決,而關系型數據庫不能。
  • 關系型數據庫分庫分表之後多條件查詢,難于實現,Elasticsearch 天然分布式設計,多個索引多個分片皆可聯合查詢。
  • 關系型數據庫聚合性能低下,數據量稍微多點,查詢列基數多一點性能下降很快,Elasticsearch 在聚合上采用的是列式存儲,效率極高。
  • 關系型數據庫側重均衡性,Elasticsearch 側重專一查詢速度。

若數據無需嚴格事務機制隔離,個人認為都可以采用 Elasticsearch 替代。若數據既要事務隔離,也要查詢性能,可以采用 DB 與 ES 混合實現。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)6

RDBMS 與 ES 各自優勢示意圖

OpenTSDB

OpenTSDB 内部基于 HBase 實現,屬于時間序列數據庫,主要針對具有時間特性和需求的數據,進行過數據結構的優化和處理,從而适合存儲具有時間特性的數據,如監控數據、溫度變化數據等。

小米公司開源監控體系 open-falcon 的就是基于 OpenTSDB 實現。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)7

OpenTSDB 時間序列數據庫内部實現

Elastic 産品本身無意時間序列這個領域,随着 ELK 的流行,很多公司采用ELK來構建監控體系,雖然在數值類型上不像時間序列數據庫做過特别處理,但由于其便利的使用,以及生态技術棧的優勢,我們也接受了這樣的事實。

Elasticsearch 構建時間序列很簡單,性能也相當不錯:

  • 索引創建規則,可以按年、按月、按周、按星期、按天、按小時等都創建索引,非常便利。
  • 數據填充方面,定制一個時間字段做區分排序,其餘的字段無需。
  • 數據查詢方面,除了按實際序列查詢外,還可以有更多的搜索條件。
  • 除非對于時間序列數據有非常苛刻的監控需求,否則選擇 Elasticsearch 會更加合适一些。

HBase

HBase 是列式數據庫的代表,其内部有幾個緻命設計大大限制了它的應用範圍:

  • 訪問 HBase 數據隻能基于 Rowkey,Rowkey 設計的好壞直接決定了HBase使用優劣。
  • 本身不支持二級索引,若要實現,則需要引入第三方。

關于其各種技術原理就不多說了,說說它的一些使用情況。

公司所屬物流速運行業,一個與車輛有關的項目,記錄所有車輛行駛軌迹,車載設備會定時上報車子的軌迹信息,後端數據存儲基于 HBase,數據量在幾十 TB 級以上。

由于業務端需要依據車輛軌迹信息計算它的公裡油耗以及相關成本,所以要按查詢條件批量查詢數據,查詢條件有一些非 Rowkey 的字段,如時間範圍,車票号,城市編号等,這幾乎無法實現,原來暴力的做過,性能問題堪憂。

此項目的問題首先也在于 Rowkey 難設計滿足查詢條件的需求,其次是二級索引問題,查詢的條件很多。

如果用列式數據庫僅限于 Rowkey 訪問場景,其實采用 Elastic 也可以,隻要設計好 _id,與 HBase 可以達到相同的效果。

如果用列式數據庫查詢還需要引入三方組件,那還不如直接在 Elasticsearch 上構建更直接。

除非對使用列式數據庫有非常苛刻的要求,否則 Elasticsearch 更具備通用性,業務需求場景适用性更多。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)8

列式數據庫内部數據結構示意圖

MongoDB

MongoDB 是文檔型數據庫的代表,數據模型基于 Bson,而 Elasticsearch 的文檔數據模型是 Json,Bson 本質是 Json 的一種擴展,可以相互直接轉換,且它們的數據模式都是可以自由擴展的,基本無限制。

MongoDB 本身定位與關系型數據庫競争,支持嚴格的事務隔離機制,在這個層面實際上與 Elasticsearch 産品定位不一樣,但實際工作中,幾乎沒有公司會将核心業務數據放在 MongoDB 上,關系型數據庫依然是第一選擇。

若超出這個定位,則 Elasticsearh 相比 MongoDB 有如下優點:

  • 文檔查詢性能,倒排索引/KDB-Tree 比 B Tree 厲害。
  • 數據的聚合分析能力,ES 本身提供了列式數據 doc_value,比 MongoDB 的行式要快不少。
  • 集群分片副本機制,ES 架構設計更勝一籌。
  • ES 特色功能比 MongoDB 提供的更多,适用的場景範圍更寬泛。
  • 文檔數據樣例,ObjectId 由 MongoDB 内置自動生成。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)9

公司剛好有個項目,原來數據層基于 MongoDB 設計構建的,查詢問題不少 ,後面成功遷移到 Elasticsearch 平台上,服務器數據量從 15 台降低到 3 台,查詢性能還大幅度提升十倍。

詳細可閱讀筆者另一篇文章《為什麼要從MongoDB遷移到Elasticsearch?》抛開數據事務隔離,Elasticsearch 可以完全替代 MongoDB。

ClickHouse

ClickHouse 是一款 MPP 查詢分析型數據庫,近幾年活躍度很高,很多頭部公司都引入其中。

我們為什麼要引入呢,原因可能跟其他頭部公司不太一樣,如下:

  • 筆者長期從事大數據工作,經常會碰到數據聚合的實時查詢需求,早期我們會選擇一款關系型數據庫來做做聚合查詢,如 MySQL/PostgreSQL,稍微不注意就很容易出現性能瓶頸。
  • 後面引入 Elasticsearch 産品,其基于列式設計以及分片架構,性能各方面确實明顯優于單節點的關系型數據庫。
  • Elasticsearch 局限性也很明顯,一是數據量超過千萬或者億級時,若聚合的列數太多,性能也到達瓶頸;二是不支持深度二次聚合,導緻一些複雜的聚合需求,需要人工編寫代碼在外部實現,這又增加很多開發工作量。
  • 後面引入了 ClickHouse,替代 Elasticserach 做深度聚合需求,性能表現不錯,在數據量千萬級億級表現很好,且資源消耗相比之前降低不少,同樣的服務器資源可以承擔更多的業務需求。

ClickHouse 與 Elasticsearch 一樣,都采用列式存儲結構,都支持副本分片。

不同的是 ClickHouse 底層有一些獨特的實現,如下:

  • MergeTree 合并樹表引擎,提供了數據分區、一級索引、二級索引。
  • Vector Engine 向量引擎,數據不僅僅按列存儲,同時還按向量(列的一部分)進行處理,這樣可以更加高效地使用 CPU。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)10

ClickHouse 在大數據平台中的位置

Druid

Durid 是一個大數據 MPP 查詢型數據産品,核心功能 Rollup,所有的需要 Rollup 原始數據必須帶有時間序列字段。

Elasticsearch 在 6.3.X 版本之後推出了此功能,此時兩者産品形成競争關系,誰高誰下,看應用場景需求。

Druid 樣本數據,必須帶有 time 時間字段。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)11

筆者之前負責過公司所有 Elasticsearch 技術棧相關數據項目,當時也有碰到一些實時聚合查詢返回部分數據的需求。

但我們的需求不太一樣,索引數據屬于離線型更新,每天都會全部删除并重新創建索引插入數據。

此時使用 Elastic 的版本是 6.8.X,僅支持離線型數據 Rollup,所以此功能沒用上,Elastic 在 7.2.X 版本之後才推出實時 Rollup 功能。

Druid 更加專注,産品設計圍繞 Rollup 展開,Elastic 隻是附帶。

Druid 支持多種外接數據,直接可以對接 Kafka 數據流,也可以直接對接平台自身内部數據;而 Elastic 僅支持内部索引數據,外部數據需要借助三方工具導入到索引裡。

Druid 在數據 Rollup 之後,會丢棄原始數據;Elastic 在原有索引基礎之後,生成新的 Rollup 之後的索引數據。

Druid 與 Elastic 的技術架構非常類似,都支持節點職責分離,都支持橫向擴展。

Druid 與 Elastic 在數據模型上都支持倒排索引,基于此的搜索與過濾。

elasticsearch為啥這麼快(Elasticsearch用得好下班下得早)12

Druid 産品技術架構體系示意圖

關于 Rollup 這個大數據分析領域,若有大規模的 Rollup 的場景需求,個人更傾向于 Druid。

結語

總結:

  • Elasticsearch 産品功能全面,适用範圍廣,性能也不錯,綜合應用是首選。
  • Elasticsearch 在搜索查詢領域,幾乎完勝所有競争産品,在筆者的技術棧看來,關系型數據庫解決數據事務問題,Elasticsearch 幾乎解決一切搜索查詢問題。
  • Elasticsearch 在數據分析領域,産品能力偏弱一些,簡單通用的場景需求可以大規模使用,但在特定業務場景領域,還是要選擇更加專業的數據産品,如前文中提到的複雜聚合、大規模 Rollup、大規模的 Key-Value。
  • Elasticsearch 越來越不像一個搜索引擎,更像是一個全能型的數據産品,幾乎所有行業都在使用,業界非常受歡迎。
  • Elasticsearch 用得好,下班下得早。

注:内容來源于筆者實際工作中運用多種技術棧實現場景需求,得出的一些實戰經驗與總結思考,提供後來者借鑒參考。

本文圍繞 Elastic 的競争産品對比僅限概要性分析,粒度較粗,深度有限,之後會有更加專業深入競争産品分析文章,敬請期待。

作者:李猛(ynuosoft)

簡介:Elastic-stack 産品深度用戶,ES 認證工程師,2012 年接觸 Elasticsearch,對 Elastic-Stack 開發、架構、運維等方面有深入體驗,實踐過多種 Elasticsearch 項目,最暴力的大數據分析應用,最複雜的業務系統應用;業餘為企業提供 Elastic-Stack 咨詢培訓以及調優實施。

編輯:陶家龍

出處:轉載自微信公衆号 DBAplus 社群(ID:dbaplus)

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved