ES的跨索引查詢有多便利?對比下分庫分表、分片更直觀
摘要:鑑於Elastic查詢過程,在跨多個索引查詢時,協調節點承擔了所有分片查詢返回的數據合併,需要消耗很大資源,在應對高併發場景,建議部署獨立的協調節點,將集羣的數據節點與協調節點分離,以達到最佳的性能平衡。Elasticsearch由於其架構設計的彈性能力,小小的一個跨索引查詢特性,就能給我們應用系統帶來很多架構設計的便利,解決很多實際場景問題,這是其它數據產品目前還做不到的。
作者介紹
李猛(ynuosoft), Elastic-stack產品深度用戶,ES認證工程師,2012年接觸Elasticsearch,對Elastic-Stack開發、架構、運維等方面有深入體驗,實踐過多種Elasticsearch項目,最暴力的大數據分析應用,最複雜的業務系統應用;業餘爲企業提供Elastic-stack諮詢培訓以及調優實施。
序言
Elasticsearch,中文名直譯彈性搜索,不僅僅在單索引內部分片層面彈性搜索,更強的是在跨索引外圍支持分片彈性搜索,同比其它分佈式數據產品,此特性更鮮明,代表了Elastic集羣架構設計的優越性。
本文將從以下幾個方面展開探討:
-
爲什麼需要跨索引查詢?
-
跨索查詢有哪些經典應用場景?
-
跨索引查詢技術原理是怎樣的?
-
跨索引查詢有哪些注意事項?
圖示:跨索引示意圖+多個索引查詢效果圖
爲什麼需要跨索引查詢
技術限制
Elasticsearch索引本身有一些指標限制,對於很多新手來說最容易忽視或者亂用。
-
Elastic索引數據量有大小限制;
-
單個分片數據容量官方建議不超過50GB,合理範圍是20GB~40GB之間;
-
單個分片數據條數不超過約21億條(2的32次方),此值一般很難達到,基本可以忽略,背後原理可以參考源碼或者其它;
-
索引分片過多,分佈式資源消耗越大,查詢響應越慢。
基於以上限制,索引在創建之前就需要依據業務場景估算,設置合理的分片數,不能過多也不能過少。
技術便利
在基於關係型數據庫的應用場景中,數據量過大,一般會採用分庫分表策略,查詢數據時基於第三方中間件,限制多多;在基於NoSQL的應用場景中,如MongoDB,數據量過大,會採用數據產品本身提供的分片特性,查詢數據時基於自身的路由機制。
無論是分庫分表還是分片,它們只解決了一維數據的存儲與查詢,二維的不能,如電商訂單系統場景,數據庫採用多庫多表拆分,一旦容量超過預期設計,需要二次拆分繼續分庫分表;MongoDB採用多分片拆分,一旦容量超過預計設計,需要繼續擴展分片節點。
以上對於Elasticsearch可以不用這樣,它提供了兩個維度的拆分方式,第一維度採用多個索引命名拆分,第二維度採用索引多分片,對於查詢來說,可以靈活匹配索引,一次指定一個索引,也可以一次指定多個索引。
圖示:ES查詢示意圖+多索引+多分片示意圖
跨索引查詢應用場景
IT應用中,除去技術本身侷限問題,多數的問題都是由於耦合造成的,“高內聚,低耦合”一直是我們IT從業者的座右銘。應用系統耦合,就成了單體應用,然後就延伸出微服務架構理念。同樣數據耦合,我們也要基於一定維度的微服務化,或垂直或水平或混合垂直水平。
業務系統
舉例某些業務場景,實時數據與歷史數據存儲和查詢問題,假設日均數據量超過千萬條,那麼月度數量超過3億條,年度也會超過36億條。
若採用Elasticsearch存儲,則可以按月/按季度/按年度 創建索引,這樣實時數據的更新只會影響當前的索引,不影響歷史的索引;查詢時也一樣,依據查詢條件指定索引名稱,按需要掃描查詢,無需每次掃描所有的數據。這比基於傳統的數據產品靈活很多。
圖示:實時數據與歷史數據業務場景
大數據
Elasticsearch在大數據應用場景下很受歡迎,已經成爲大數據平臺對外提供結果查詢的標配。大數據平臺需要定期計算數據,將結果數據批量寫入到Elasticsearch中,供業務系統查詢,由於部分業務規則設定,Elasticsearch原來的索引數據要全部刪除,並重新寫入,這種操作很頻繁。對於大數據平臺每次全量計算,代價很大,對於Elasticsearch平臺,超大索引數據頻繁刪除重建,代價也很大。
基於以上,採用多索引方式,如按照月份拆解,依據需要刪除的月份索引數據。同樣的問題,業務系統查詢時,非常靈活指定需要的月份索引數據,這樣保證了存儲與查詢的平衡。
圖示:大數據平臺寫數據到Elastic平臺示意圖
日誌
Elasticsearch應對這個日誌場景非常擅長,誕生了著名的ELK組合,比如一個大中型的業務系統,每天日誌量幾十TB/幾百TB很正常,可按天或者按小時或者更小粒度創建索引,通常查詢日誌只會查詢最近時間的,過去很久的日誌,偶然需要查詢幾次,甚至會刪除。所以對於此場景,Elasticsearch的跨索引查詢非常便利,程序編寫也很簡單。
跨索引查詢應用方式
Elasticsearch跨索引查詢的方式可依據業務場景靈活選擇,下面介紹幾種:
直接型
明確指定多個索引名稱,這種方式一般應用在非常精確的查詢場景下,便於查詢索引範圍,性能平衡考慮,若索引不存在會出現錯誤,如下:index_01,index_02
GET /index_01,index_02/_search
{
"query" : {
"match": {
"test": "data"
}
}
}
模糊型
不限定死索引名稱,這種方式一般採用通配符,無需判斷該索引是否存在,支持前匹配、後匹配,前後匹配,如下:index_* 匹配前綴一樣的所有索引
GET /index_*/_search
{
"query" : {
"match": {
"test": "data"
}
}
}
計算型
索引名稱通過計算表達式指定,類似正則表達式,也可以同時指定多個索引,如下:logstash-{now/d}表示當前日期
# 索引名稱如:index-2024.03.22
# GET /<index-{now/d}>/_search
GET /%3Cindex-%7Bnow%2Fd%7D%3E/_search{
"query" : {
"match": {
"test": "data"
}
}
}
跨索引查詢技術原理
Elasticsearch能夠做到跨索引查詢,離不開其架構設計以及相關實現原理。
索引分片
圖示 :索引由分片組成
-
索引是一個虛擬的數據集合,索引由多個分片組成;
-
分片存儲實際的數據;
-
索引分片數量不限制。
查詢過程
圖示:索引查詢階段
圖示:取回數據階段
查詢過程簡單說來就是分發與合併:
-
查詢分發,客戶端發送請求到協調節點,協調節點分發查詢請求到索引分片節點;
-
數據合併,索引分片節點將數據發送到協調節點,協調節點合併返回客戶端。
所以說,Elasticsearch提供跨索引查詢的能力,實際上與原來單索引查詢時一樣,本質上是跨多個分片查詢,然後合併。
跨索引查詢注意事項
索引與分片等價關係
索引與分片等價的關係,1個索引20分片與4個索引每個索引5個分片理論上是等價的,鑑於索引分片的容量限制與性能平衡,在面對需要跨索引業務場景時,索引的數量與分片的數量儘量的少,既要保障索引熱點數據的實時處理能力,也要平衡歷史數據的查詢性能。
協調節點分離
鑑於Elastic查詢過程,在跨多個索引查詢時,協調節點承擔了所有分片查詢返回的數據合併,需要消耗很大資源,在應對高併發場景,建議部署獨立的協調節點,將集羣的數據節點與協調節點分離,以達到最佳的性能平衡。
路由機制
Elasticsearch寫入數據分佈默認是基於索引主鍵_id的Hash值,此機制在數據分佈上很均衡,但也沒有什麼規律,對於跨索引查詢場景,若自定義指定路由鍵,可以在搜索時避開不需要的索引分片,有效減少分片查詢的分片數量,達到更高的性能。
總結
Elasticsearch由於其架構設計的彈性能力,小小的一個跨索引查詢特性,就能給我們應用系統帶來很多架構設計的便利,解決很多實際場景問題,這是其它數據產品目前還做不到的。Elasticsearch還有更厲害的跨多個集羣跨多個版本,詳情可繼續關注筆者下一篇文章的探討。
還是那句話,Elastic用得好,下班下得早。
從過去40年至今,數據庫的形態基本經歷了傳統商業數據庫、開源數據庫到雲原生數據庫的演進過程。雲時代下數據庫將如何革新與創變?企業核心數據庫遷移與建設如何安全平穩展開?來 Gdevops全球敏捷運維峯會北京站 尋找答案:
-
《All in Cloud 時代,下一代雲原生數據庫技術與趨勢》 阿里巴巴集團副總裁/達摩院首席數據庫科學家 李飛飛(飛刀)
-
《AI和雲原生時代的數據庫進化之路》騰訊數據庫產品中心總經理 林曉斌(丁奇)
-
《ICBC的MySQL探索之路》 工商銀行軟件開發中心 魏亞東
-
《民生銀行在SQL審覈方面的探索和實踐》 民生銀行資深數據庫專家 李寧寧
-
《OceanBase分佈式數據庫在西安銀行的落地和實踐》 螞蟻金服P9資深專家/ OceanBase 核心負責人 蔣志勇
-
《金融行業MySQL高可用實踐》 愛可生技術總監 明溪源
讓我們 9月11日在北京 共同眺望數據庫發展變革更長遠的未來!