1. 程式人生 > >如何玩轉跨庫Join?跨資料庫例項查詢應用實踐

如何玩轉跨庫Join?跨資料庫例項查詢應用實踐

背景

隨著業務複雜程度的提高、資料規模的增長,越來越多的公司選擇對其線上業務資料庫進行垂直或水平拆分,甚至選擇不同的資料庫型別以滿足其業務需求。原本在同一資料庫例項裡就能實現的SQL查詢,現在需要跨多個數據庫例項才能完成。業務的資料被“散落”在各個地方,如何方便地對這些資料進行彙總關聯查詢,已經成為困擾使用者的一大難題。

針對這類問題,傳統的解決方案需要使用者提前將所有例項的資料提前彙集到同一處,然後再做離線查詢分析。為此,使用者需要維護資料遷移鏈路,購買機器資源儲存彙集起來的資料,付出大量的資源和運維成本。不僅如此,資料遷移也意味著資料延遲,剛剛產生的線上業務資料,需要“等一會”甚至“等一天”才能去做分析,無法滿足實時性需求。

為了解決跨資料庫例項及時查詢的難題,阿里雲DMS(資料管理)推出了跨例項查詢服務。

什麼是跨例項查詢服務

跨例項查詢服務為不同環境下的線上異構資料來源,提供及時的關聯查詢服務。不論資料庫是MySQL、SQLServer、PostgreSQL還是Redis,不論資料庫例項部署在哪個阿里雲region,無需資料彙集,僅通過一條SQL就能實現這些資料庫例項之間的關聯查詢。

不僅如此,資料庫例項也可以部署在不同的資源環境中,除了RDS之外,我們也支援ECS上的自建資料庫、具有公網ip的自建資料庫、使用者本地IDC自建資料庫、甚至是部署在其他雲廠商的資料庫。

功能特性

線上資料及時查詢

目前大多數資料分析的解決方案需要將 OLTP 資料庫的資料匯出至離線資料系統再進行分析,但這種方案很難滿足實時性的要求,同時在資料匯出至離線系統時也存在資料丟失的風險。

DMS的跨例項查詢服務,無需使用者遷移任務,直接編寫一條SQL,就能實現多個線上資料庫的直接關聯分析。由於無需資料同步,降低了業務架構的複雜性,同時也大大節省使用者持有離線計算資源的預算和運維成本。

DBLink

熟悉Oracle的人應該知道,我們可以在當前登入的Oracle上,建立一個DBLink指向另一個遠端的Oracle資料庫表。在跨例項查詢服務中,我們重新定義了DBLink的概念,它是一個指向使用者的任意資料庫例項的虛擬連線,是資料庫例項的別名。例如,對於MySQL來說,DBLink和ip/port一一對應。藉助DBLink,即可實現對任意資料來源的SQL訪問。
1545011106620_6727cbd6_af4a_4ed0_8add_6fb3f43bf1ab

支援多種關係型資料庫

目前已支援MySQL、SQLServer、PostgreSQL等多種關係型資料庫。

支援SQL方式訪問NoSQL

除了關係型資料庫之外,跨例項查詢還支援以SQL方式訪問Redis等NoSQL資料庫。由於支援了SQL語法,也可以實現RDBMS和NoSQL之間關聯查詢。是的,你沒看錯,一條SQL就能實現MySQL和Redis之間的關聯查詢。

支援跨地域以及混合雲查詢

企業發展到一定階段,使用者量、業務量不斷攀升,原來的單機房容量已經不能滿足業務發展的需求,再結合容災、高可用等因素,通常會選擇跨region部署,也叫單元化部署。同時,不少企業也需要將業務拓展到海外,通過本地就近部署,為國外使用者提供更好的體驗。類似這種水平拆分帶來的問題就是,如何對全域性的業務資料進行統一的彙總關聯查詢。

藉助DMS跨例項查詢服務,無論您的資料庫例項部署在阿里雲的哪個region,無需跨region的資料遷移,即可實現所有region資料的統一查詢。

除了阿里雲RDS,我們也支援使用者部署在阿里雲ECS上的各種資料庫。不僅如此,如果您的資料庫部署在本地IDC機房,甚至其他雲廠商,都可以通過跨例項查詢服務,實現這些混合雲場景的跨例項關聯查詢。
1545013361928_836a9165_58d9_4625_940f_1dfb61869334

跨例項資料匯入匯出

insert into b select * from a;
眾所周知,這條SQL語句可以將表a的資料匯出到表b中,但如果a表和b表不在同一個資料庫例項上,那這條sql就無能為力了。

跨例項查詢服務的出現,打破了例項與例項之間資料匯入匯出的邊界。它可以將資料從一個MySQL例項的表匯出到另外一個MySQL例項的表中;也可以將SQLServer表和PostgreSQL表關聯查詢的結果,匯出到MySQL例項的表中,就是這麼靈活。
1545653840346_2beda0a0_7a3d_458e_a4de_7d9a3ea2b901

相容標準SQL

通過標準的SQL語句,即可實現跨例項查詢。同時跨例項查詢服務高度相容MySQL,支援MySQL協議,以及各種常用函式和語法。您可通過JDBC/ODBC驅動連線到跨例項查詢服務;也可以使用各種MySQL GUI工具來管理各種資料來源;當然,您也可以在DMS跨例項查詢控制檯上直接使用。

Serverless架構

跨例項查詢是無伺服器化的線上資料庫關聯查詢服務。使用者無需預購計算資源、無需維護資源、沒有運維和升級成本,隨時隨地使用。

高效能低延遲

跨例項查詢服務底層基於強大的MPP計算引擎,持續不斷地對SQL查詢進行優化,包括pushdown、join演算法、執行計劃快取、Meta快取、本地排程、連線池等技術。目前單表查詢以及跨例項的多表關聯查詢,都能在毫秒級完成。

技術架構

1545655510892_d3921ee5_bcc7_4003_9ecc_f30c60d28638

使用者可以在應用程式中,直接使用MySQL JDBC驅動連線跨例項查詢服務,進行跨例項查詢。當然,我們也提供了控制檯頁面,直接輸入SQL即可執行。

應用場景

垂直拆分後的跨資料庫查詢

某電商公司原先將會員、訂單、商品等資料都存放在一個數據庫例項中,但業務發展迅猛,訪問量極速增長,導致資料庫容量及效能遭遇瓶頸,因此使用者決定對架構進行垂直拆分,將會員、商品、訂單資料垂直拆分至三個資料庫例項中。此時業務上需要展示某個品類商品的售賣訂單量,原本在同一資料庫裡的查詢,要變成跨兩個資料庫例項的查詢。業務上要怎麼進行關聯查詢?

使用者首先想到的方法是,對現有業務程式碼進行重構,分別從兩個資料庫查詢資料,然後在業務程式碼中進行join關聯。那麼問題來了,如果採用這個解決方案,業務上那麼多查詢改造起來,拆分難度極大,操作起來過於複雜。跨庫join操作又沒有非常高效的辦法,需要從各個業務庫迭代查詢,查詢效率也會有一定影響。
_1

我們發現使用者遇到的其實就是典型的跨例項查詢問題。目前,阿里雲DMS跨例項查詢服務已經支援跨多個數據庫例項的SQL查詢的能力,使用者利用一條SQL即可解決上述難題。不僅能夠滿足“跨庫Join”這一核心訴求,還能極大地簡化使用者的技術方案。
_2

水平拆分後的跨資料庫查詢

某酒店在多個城市都有對應的門店,其資料庫在每個城市也會單獨部署一套,業務上有對多個城市全域性資料查詢的訴求。同樣,現在越來越多的網際網路行業開始引入單元化架構,在每個城市會單獨部署機房和資料庫,進行多單元資料彙總查詢的需求也越來越強。

為了滿足雲上這些跨單元、跨region的資料庫查詢需求,跨例項查詢服務打通region之間的屏障,使用者通過一條SQL就能實現這些需求。
1545027728543_4aeb15e9_8f4f_4ba5_854d_9b9661b1a3ef

異構資料庫的關聯查詢

某公司考慮成本和未來可擴充套件性,正在將業務資料從SQLServer遷移到MySQL上。在這期間,必然存在某些業務子系統仍然在SQLServer上,另外一些業務子系統已經全部遷移到MySQL上,這時兩個子系統之間的聯合查詢,就可以藉助阿里雲的跨例項查詢服務實現。不僅如此,在遷移過程中,還可以通過跨例項查詢服務,來校驗SQLServer和MySQL上的資料是否一致。

混合雲場景的關聯查詢

某遊戲公司,由於各種原因,同時保有阿里雲、騰訊、UCloud、AWS等環境的資料庫例項,同時在自己自建的IDC也部署了部分資料庫。業務的資料如此分散,單是統計一下當前遊戲線上使用者數,都要分別到各個環境去查詢一遍再做彙總。藉助阿里雲跨例項查詢服務,一條SQL就能實現跨雲廠商和IDC之間的關聯查詢
1545030088537_047c07ea_b8c0_4011_a451_1741b1d2b4a1

小結

阿里雲DMS(資料管理)跨例項查詢服務,不僅覆蓋了異構資料來源關聯查詢的場景,還解決了跨region、跨雲的資料庫關聯查詢的難題。不僅如此,我們對查詢效能進行了大幅優化,使得大部分查詢能在毫秒級完成。使用者無需通過資料彙集,即可通過標準的SQL實現跨例項的交叉查詢