Elasticsearch數據庫加速實踐

      網友投稿 1021 2025-03-31

      一、方案說明

      Elasticsearch主要功能是什么,不同的場景有不同的定位,在日志場景我們可以用ELK生態搭建日志分析系統,在搜索領域ES是當前最熱門的搜索引擎。在大數據領域,ES可以對標Hbase提供海量日志的數據倉庫;在數據庫領域ES可以作為查詢分析型的分析型數據庫使用。ES已經成為了全能型的數據產品,在很多領域越來越受歡迎,本文旨在從數據庫領域分析ES的使用。

      ES不是關系型數據庫,數據更新采用樂觀鎖,通過版本號控制,不支持事務處理,這也是ES區別于傳統數據庫(Mysql)的地方;但是ES支持精確查詢加速,多條件任意組合查詢,多種聚合查詢,查詢速度很快,可以替代數據庫復雜條件查詢的場景需求,甚至可以代替數據庫做二級索引。

      在數據庫加速場景通常的做法是客戶產生的商品訂單數據會寫入Mysql類關系型數據庫,數據庫寫入保證事務性,但是隨著商品訂單的數據越來越多,同時客戶查詢的條件多變,無法所有字段都建立索引,數據庫的查詢能力遠遠不能滿足查詢訴求。我們考慮用ES全量同步數據庫數據,在ES中做多條件聚合查詢,查詢的結果可以在Mysql中做關聯搜索,在查詢商品訂單詳情展示, Mysql數據和ES數據可以不要求實時一致,可以通canal消費Mysql binlog日志信息, 同步到ES,實現一次寫入,保證數據一致性。以下數據庫都以Mysql為例進行說明。

      二、索引原理分析

      ES為什么查詢能力遠遠超過Mysql關系型數據庫,主要是他們的實現原理和底層存儲的數據結構差異決定的,以下比較兩種產品的實現原理。

      Elasticsearch會對所有輸入的文本進行處理,建立索引放入內存中,從而提高搜索效率。在這一點上ES要優于MySQL的B+樹的結構,MySQL需要將索引放入磁盤,每次讀取需要先從磁盤讀取索引然后尋找對應的數據節點,但是ES能夠直接在內存中就找到目標文檔對應的大致位置,最大化提高效率。并且在進行組合查詢的時候MySQL的劣勢更加明顯,它不支持復雜的組合查詢比如聚合操作,即使要組合查詢也要事先建好索引,但是ES就可以完成這種復雜的操作,默認每個字段都是有索引的,在查詢的時候可以各種互相組合。

      數據庫索引B+樹

      數據庫中索引都是以樹來組織的,常用的有B tree,B-tree,B+tree,以下介紹B+tree的組織結構。

      select name,author form book where name = ‘database’;

      我們需要掃描整個表,全量比較才可以,如果我們對name建立索引,書名已經按照順序排序,查詢時只需要找到對應位置就可以快速獲取結果。

      Elasticsearch數據庫加速實踐

      索引的本質是通過不斷地縮小想要獲取數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查找方式來鎖定數據。

      數據庫采用B+tree建立索引:

      B+tree 數據只存儲在葉子節點中。這樣在B樹的基礎上每個節點存儲的關鍵字數更多,樹的層級更少所以查詢數據更快,所有指關鍵字指針都存在葉子節點,所以每次查找的次數都相同所以查詢速度更穩定。

      Elasticsearch索引原理

      ES建立索引采用倒排索引的方式存儲。

      對輸入的所有數據都建立索引,并且把所有和文檔對應起來,在我們查找數據的時候我們直接查找詞典(Term),在找到Term對應的文檔ID,進而找到數據。這和Mysql使用B+tree樹建立索引的方式類似,但是如果詞典Term很大,對Term的搜索就會很慢,ES進一步建議了詞典索引(FST),提升詞典的搜索能力。

      Term Index 以樹的形式保存在內存中,運用了FST+壓縮公共前綴方法極大的節省了內存,通過Term Index查詢到Term Dictionary所在的block再去磁盤上找term減少了IO次數。

      Term Dictionary 排序后通過二分法將檢索的時間復雜度從原來N降低為logN。

      三、查詢對比分析

      以下對于數據庫搜索常用的場景對比ES和數據庫:

      全文檢索

      ES支持全文檢索,可以對數據分詞,每個詞通過FSP建立詞典索引,而Mysql關系數據庫則不支持,想象下如果搜索的不是整個字段而是字段中的幾個關鍵詞,使用Mysql搜索必須全表掃描。

      精確搜索

      如果Mysql對該字段建立過索引,使用ES搜索和Mysql搜索性能差異不大,可能Mysql更快點,但是ES是分布式系統,可以支持PB級別的數據搜索,對大表搜索ES優勢更明顯。

      多條件查詢

      我們知道Mysql需要對字段建立索引才能加速搜索過程,而ES默認是全索引的,對于多條件查詢,觸發Mysql建立聯合索引,否則多個字段搜索,Mysql 先選擇一個字段搜索,結果在使用第二個字段過濾得到最終結果。

      ES則采用多個字段結果集交并操作,使用bitmap或者skiplist加快搜索速度,相比Mysql優勢明顯。

      聚合搜索

      Mysql聚合搜索如果沒有建立索引需要全表掃描排序,如果建立索引在B+tree上進行范圍查詢。

      ES為了加快聚合搜索速度,通過Doc value來解決聚合搜索問題。DocValue就是列式存儲。

      存儲結果如下:

      Docvalue數據按照文檔ID排序,DocValue將隨機讀取變成了順序讀取,

      在es中,因為分片的存在,數據被拆分成多份,放在不同機器上。但是給用戶體驗卻好像只有一個庫一樣。對于聚合查詢,其處理是分兩階段完成的:

      Shard 本地的 Lucene Index 并行計算出局部的聚合結果。

      收到所有的 Shard 的局部聚合結果,聚合出最終的聚合結果。

      這種兩階段聚合的架構使得每個 shard 不用把原數據返回,而只用返回數據量小得多的聚合結果。這樣極大的減少了網絡帶寬的消耗。

      多副本加速

      我們知道ES有shard和replica的概念,副本一方面可以保證數據的可靠性,另一方面多副本可以加快搜索速度提高搜索并發能力。

      四、數據庫到Elasticsearch同步方案

      結合用戶實際的使用方式和數據量的大小,Mysql數據到ES可以有多種不同的方式選擇。

      Canal=>Elasticsearch

      使用Canal直接消費Mysql binlog日志寫入ES,這種方式如果Mysql寫入量大,會面臨Canal寫入阻塞問題。

      Canal =>Kafka=>Elasticsearch

      Canal數據寫入到Kafka,使用另外的app消費Kafka數據同步到ES

      五、問題匯總

      在Mysql數據同步到ES中面臨索引的建立的問題,在數據寫入ES之前我們需要提前規劃數據的shards和replicas的個數,replicas 可以動態修改,但是shards數創建完成后不能修改。

      隨著Mysql數據量的增加,如果shard太少,就會導致每個shard的數據量太大的問題。

      如果一個索引600G,只有3 個shard,每個shard就200G,會極大的損耗查詢能力,也不利于數據遷移。

      我們可以按照月來滾動創建索引,通過索引別名把所有索引關聯起來使用。

      test_data-202101

      test_data-202102

      在使用ES對數據庫進行加速的場景,我們希望的是ES查詢能力盡可能快。在ES查詢不滿足要求的時候我們需要對查詢進行調優。

      常用的方法有:

      Elasticsearch 云搜索服務 CSS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:圖解HTTP第十章、第十一章
      下一篇:解開發者之痛:微服務架構下,如何用分布式 數據庫處理千億級數據?
      相關文章
      亚洲日韩乱码中文无码蜜桃| 亚洲AV无码一区二区一二区| 亚洲成年人免费网站| 亚洲偷自拍拍综合网| 亚洲AV无码男人的天堂| 亚洲一卡2卡4卡5卡6卡在线99 | 国产成人精品亚洲日本在线| 久久久亚洲欧洲日产国码二区| 久久久亚洲精品无码| 亚洲线精品一区二区三区 | 亚洲熟妇无码AV| 亚洲国产成人综合精品| 亚洲sm另类一区二区三区| 亚洲码欧美码一区二区三区| 亚洲爆乳无码专区www| 久久亚洲精品高潮综合色a片| 亚洲国产av玩弄放荡人妇 | 亚洲AV日韩AV永久无码下载| 亚洲伦另类中文字幕| 亚洲精品中文字幕乱码| 亚洲另类自拍丝袜第1页| 日韩亚洲不卡在线视频中文字幕在线观看 | 亚洲欧洲精品视频在线观看| 亚洲无线一二三四区| 亚洲人成在线免费观看| 亚洲首页国产精品丝袜| 亚洲AV综合永久无码精品天堂| 国产成人亚洲午夜电影| 亚洲日韩中文字幕日韩在线| 亚洲日韩精品一区二区三区| 亚洲AV无码精品色午夜在线观看 | 日韩成人精品日本亚洲| 亚洲A∨午夜成人片精品网站| 国产成人精品亚洲精品| 亚洲乱码中文字幕综合| 亚洲av中文无码乱人伦在线播放| 4444亚洲国产成人精品| 丁香婷婷亚洲六月综合色| 亚洲AV日韩AV永久无码色欲| 亚洲色一色噜一噜噜噜| 亚洲va中文字幕无码久久|