ES的跨索引查詢有多便利?對(duì)比下分庫(kù)分表、分片更直觀
掃描二維碼
隨時(shí)隨地手機(jī)看文章
作者介紹
李猛(ynuosoft),Elastic-stack產(chǎn)品深度用戶,ES認(rèn)證工程師,2012年接觸Elasticsearch,對(duì)Elastic-Stack開(kāi)發(fā)、架構(gòu)、運(yùn)維等方面有深入體驗(yàn),實(shí)踐過(guò)多種Elasticsearch項(xiàng)目,最暴力的大數(shù)據(jù)分析應(yīng)用,最復(fù)雜的業(yè)務(wù)系統(tǒng)應(yīng)用;業(yè)余為企業(yè)提供Elastic-stack咨詢培訓(xùn)以及調(diào)優(yōu)實(shí)施。
Elasticsearch,中文名直譯彈性搜索,不僅僅在單索引內(nèi)部分片層面彈性搜索,更強(qiáng)的是在跨索引外圍支持分片彈性搜索,同比其它分布式數(shù)據(jù)產(chǎn)品,此特性更鮮明,代表了Elastic集群架構(gòu)設(shè)計(jì)的優(yōu)越性。
本文將從以下幾個(gè)方面展開(kāi)探討:
-
為什么需要跨索引查詢?
-
跨索查詢有哪些經(jīng)典應(yīng)用場(chǎng)景?
-
跨索引查詢技術(shù)原理是怎樣的?
-
跨索引查詢有哪些注意事項(xiàng)?
Elasticsearch索引本身有一些指標(biāo)限制,對(duì)于很多新手來(lái)說(shuō)最容易忽視或者亂用。
-
Elastic索引數(shù)據(jù)量有大小限制;
-
單個(gè)分片數(shù)據(jù)容量官方建議不超過(guò)50GB,合理范圍是20GB~40GB之間;
-
單個(gè)分片數(shù)據(jù)條數(shù)不超過(guò)約21億條(2的32次方),此值一般很難達(dá)到,基本可以忽略,背后原理可以參考源碼或者其它;
-
索引分片過(guò)多,分布式資源消耗越大,查詢響應(yīng)越慢。
基于以上限制,索引在創(chuàng)建之前就需要依據(jù)業(yè)務(wù)場(chǎng)景估算,設(shè)置合理的分片數(shù),不能過(guò)多也不能過(guò)少。
在基于關(guān)系型數(shù)據(jù)庫(kù)的應(yīng)用場(chǎng)景中,數(shù)據(jù)量過(guò)大,一般會(huì)采用分庫(kù)分表策略,查詢數(shù)據(jù)時(shí)基于第三方中間件,限制多多;在基于NoSQL的應(yīng)用場(chǎng)景中,如MongoDB,數(shù)據(jù)量過(guò)大,會(huì)采用數(shù)據(jù)產(chǎn)品本身提供的分片特性,查詢數(shù)據(jù)時(shí)基于自身的路由機(jī)制。
無(wú)論是分庫(kù)分表還是分片,它們只解決了一維數(shù)據(jù)的存儲(chǔ)與查詢,二維的不能,如電商訂單系統(tǒng)場(chǎng)景,數(shù)據(jù)庫(kù)采用多庫(kù)多表拆分,一旦容量超過(guò)預(yù)期設(shè)計(jì),需要二次拆分繼續(xù)分庫(kù)分表;MongoDB采用多分片拆分,一旦容量超過(guò)預(yù)計(jì)設(shè)計(jì),需要繼續(xù)擴(kuò)展分片節(jié)點(diǎn)。
以上對(duì)于Elasticsearch可以不用這樣,它提供了兩個(gè)維度的拆分方式,第一維度采用多個(gè)索引命名拆分,第二維度采用索引多分片,對(duì)于查詢來(lái)說(shuō),可以靈活匹配索引,一次指定一個(gè)索引,也可以一次指定多個(gè)索引。
IT應(yīng)用中,除去技術(shù)本身局限問(wèn)題,多數(shù)的問(wèn)題都是由于耦合造成的,“高內(nèi)聚,低耦合”一直是我們IT從業(yè)者的座右銘。應(yīng)用系統(tǒng)耦合,就成了單體應(yīng)用,然后就延伸出微服務(wù)架構(gòu)理念。同樣數(shù)據(jù)耦合,我們也要基于一定維度的微服務(wù)化,或垂直或水平或混合垂直水平。
舉例某些業(yè)務(wù)場(chǎng)景,實(shí)時(shí)數(shù)據(jù)與歷史數(shù)據(jù)存儲(chǔ)和查詢問(wèn)題,假設(shè)日均數(shù)據(jù)量超過(guò)千萬(wàn)條,那么月度數(shù)量超過(guò)3億條,年度也會(huì)超過(guò)36億條。
若采用Elasticsearch存儲(chǔ),則可以按月/按季度/按年度 創(chuàng)建索引,這樣實(shí)時(shí)數(shù)據(jù)的更新只會(huì)影響當(dāng)前的索引,不影響歷史的索引;查詢時(shí)也一樣,依據(jù)查詢條件指定索引名稱,按需要掃描查詢,無(wú)需每次掃描所有的數(shù)據(jù)。這比基于傳統(tǒng)的數(shù)據(jù)產(chǎn)品靈活很多。
Elasticsearch在大數(shù)據(jù)應(yīng)用場(chǎng)景下很受歡迎,已經(jīng)成為大數(shù)據(jù)平臺(tái)對(duì)外提供結(jié)果查詢的標(biāo)配。大數(shù)據(jù)平臺(tái)需要定期計(jì)算數(shù)據(jù),將結(jié)果數(shù)據(jù)批量寫(xiě)入到Elasticsearch中,供業(yè)務(wù)系統(tǒng)查詢,由于部分業(yè)務(wù)規(guī)則設(shè)定,Elasticsearch原來(lái)的索引數(shù)據(jù)要全部刪除,并重新寫(xiě)入,這種操作很頻繁。對(duì)于大數(shù)據(jù)平臺(tái)每次全量計(jì)算,代價(jià)很大,對(duì)于Elasticsearch平臺(tái),超大索引數(shù)據(jù)頻繁刪除重建,代價(jià)也很大。
基于以上,采用多索引方式,如按照月份拆解,依據(jù)需要?jiǎng)h除的月份索引數(shù)據(jù)。同樣的問(wèn)題,業(yè)務(wù)系統(tǒng)查詢時(shí),非常靈活指定需要的月份索引數(shù)據(jù),這樣保證了存儲(chǔ)與查詢的平衡。
Elasticsearch應(yīng)對(duì)這個(gè)日志場(chǎng)景非常擅長(zhǎng),誕生了著名的ELK組合,比如一個(gè)大中型的業(yè)務(wù)系統(tǒng),每天日志量幾十TB/幾百TB很正常,可按天或者按小時(shí)或者更小粒度創(chuàng)建索引,通常查詢?nèi)罩局粫?huì)查詢最近時(shí)間的,過(guò)去很久的日志,偶然需要查詢幾次,甚至?xí)h除。所以對(duì)于此場(chǎng)景,Elasticsearch的跨索引查詢非常便利,程序編寫(xiě)也很簡(jiǎn)單。
Elasticsearch跨索引查詢的方式可依據(jù)業(yè)務(wù)場(chǎng)景靈活選擇,下面介紹幾種:
明確指定多個(gè)索引名稱,這種方式一般應(yīng)用在非常精確的查詢場(chǎng)景下,便于查詢索引范圍,性能平衡考慮,若索引不存在會(huì)出現(xiàn)錯(cuò)誤,如下:index_01,index_02
GET /index_01,index_02/_search
{
"query" : {
"match": {
"test": "data"
}
}
}
不限定死索引名稱,這種方式一般采用通配符,無(wú)需判斷該索引是否存在,支持前匹配、后匹配,前后匹配,如下:index_* 匹配前綴一樣的所有索引
GET /index_*/_search
{
"query" : {
"match": {
"test": "data"
}
}
}
索引名稱通過(guò)計(jì)算表達(dá)式指定,類似正則表達(dá)式,也可以同時(shí)指定多個(gè)索引,如下:logstash-{now/d}表示當(dāng)前日期
# 索引名稱如:index-2024.03.22
# GET /
GET /%3Cindex-%7Bnow%2Fd%7D%3E/_search{
"query" : {
"match": {
"test": "data"
}
}
}
Elasticsearch能夠做到跨索引查詢,離不開(kāi)其架構(gòu)設(shè)計(jì)以及相關(guān)實(shí)現(xiàn)原理。
-
索引是一個(gè)虛擬的數(shù)據(jù)集合,索引由多個(gè)分片組成;
-
分片存儲(chǔ)實(shí)際的數(shù)據(jù);
-
索引分片數(shù)量不限制。
查詢過(guò)程簡(jiǎn)單說(shuō)來(lái)就是分發(fā)與合并:
-
查詢分發(fā),客戶端發(fā)送請(qǐng)求到協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)分發(fā)查詢請(qǐng)求到索引分片節(jié)點(diǎn);
-
數(shù)據(jù)合并,索引分片節(jié)點(diǎn)將數(shù)據(jù)發(fā)送到協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)合并返回客戶端。
所以說(shuō),Elasticsearch提供跨索引查詢的能力,實(shí)際上與原來(lái)單索引查詢時(shí)一樣,本質(zhì)上是跨多個(gè)分片查詢,然后合并。
索引與分片等價(jià)的關(guān)系,1個(gè)索引20分片與4個(gè)索引每個(gè)索引5個(gè)分片理論上是等價(jià)的,鑒于索引分片的容量限制與性能平衡,在面對(duì)需要跨索引業(yè)務(wù)場(chǎng)景時(shí),索引的數(shù)量與分片的數(shù)量盡量的少,既要保障索引熱點(diǎn)數(shù)據(jù)的實(shí)時(shí)處理能力,也要平衡歷史數(shù)據(jù)的查詢性能。
鑒于Elastic查詢過(guò)程,在跨多個(gè)索引查詢時(shí),協(xié)調(diào)節(jié)點(diǎn)承擔(dān)了所有分片查詢返回的數(shù)據(jù)合并,需要消耗很大資源,在應(yīng)對(duì)高并發(fā)場(chǎng)景,建議部署獨(dú)立的協(xié)調(diào)節(jié)點(diǎn),將集群的數(shù)據(jù)節(jié)點(diǎn)與協(xié)調(diào)節(jié)點(diǎn)分離,以達(dá)到最佳的性能平衡。
Elasticsearch寫(xiě)入數(shù)據(jù)分布默認(rèn)是基于索引主鍵_id的Hash值,此機(jī)制在數(shù)據(jù)分布上很均衡,但也沒(méi)有什么規(guī)律,對(duì)于跨索引查詢場(chǎng)景,若自定義指定路由鍵,可以在搜索時(shí)避開(kāi)不需要的索引分片,有效減少分片查詢的分片數(shù)量,達(dá)到更高的性能。
Elasticsearch由于其架構(gòu)設(shè)計(jì)的彈性能力,小小的一個(gè)跨索引查詢特性,就能給我們應(yīng)用系統(tǒng)帶來(lái)很多架構(gòu)設(shè)計(jì)的便利,解決很多實(shí)際場(chǎng)景問(wèn)題,這是其它數(shù)據(jù)產(chǎn)品目前還做不到的。Elasticsearch還有更厲害的跨多個(gè)集群跨多個(gè)版本,詳情可繼續(xù)關(guān)注筆者下一篇文章的探討。
還是那句話,Elastic用得好,下班下得早。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
![]()
長(zhǎng)按訂閱更多精彩▼
![]()
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!