跨庫/跨實例 Join 鏈接 不是非得依賴中間件

白菜Java自習室 涵蓋核心知識mysql

分庫分表難題(一) 分表分頁/跨庫分頁 難玩卻不表明沒有玩法
分庫分表難題(二) 跨庫/跨實例 Join 鏈接 不是非得依賴中間件算法

1. 數據垂直切分

某電商公司原先將會員、訂單、商品等數據都存放在一個數據庫實例中,但業務發展迅猛,訪問量極速增加,致使數據庫容量及性能遭遇瓶頸,所以 用戶決定對架構進行垂直拆分,將會員、商品、訂單數據垂直拆分至三個數據庫實例中。此時業務上須要展現某個品類商品的售賣訂單量,本來在同一數據庫裏的查詢,要變成跨兩個數據庫實例的查詢。業務上要怎麼進行關聯查詢?sql

ea1f7ddcac171049cc8a4ef9ad0a533d11a797dd.png

跨庫 Join 需求

用戶首先想到的方法是,對現有業務代碼進行重構,分別從兩個數據庫查詢數據,而後在業務代碼中進行 join 關聯。那麼問題來了,若是採用這個解決方案,業務上那麼多查詢改造起來,拆分難度極大,操做起來過於複雜。跨庫 join 操做又沒有很是高效的辦法,須要從各個業務庫迭代查詢,查詢效率也會有必定影響。docker

當方案被否決後,用戶再次想到的方法是,要不 使用 Mycat,Sharding-jdbc 等數據庫中間件來實現,固然這自己是一個可行的方案,並且也是不錯的解決方案。可是若是公司系統狀況複雜,改變架構困難,代碼腐化嚴重,短期內根本沒法解決這個問題,脫離這些數據庫中間件是否是就一籌莫展了呢?數據庫

2. MySQL FEDERATED 引擎原理

src=http___seo-1255598498.file.myqcloud.com_full_a52699110a0d49991a1408e8b507d1f2f3709586.jpg&refer=http___seo-1255598498.file.myqcloud.jfif

如圖,FEDERATED 引擎的原理爲:緩存

  1. 遠程服務器開啓 FEDERATED 引擎支持;
  2. 本地服務器查詢 FEDERATED 引擎表時,會發送查詢語句到遠程服務器;
  3. 遠程服務器經過傳過來的查詢語句,查詢出結果,返回給本地調用服務器;

3. MySQL 開啓 FEDERATED 引擎

MySQL 的前置安裝過程這裏就省略了,版本是推薦 MySQL5.7。服務器

Docker 方式安裝過程可參考做者文章: Canal 解決 MySQL 和 Redis 數據同步問題markdown

2.1. 執行命令:SHOW ENGINES;

查看 mysql 數據庫中 Federated 引擎是否開啓。下圖所示,爲未開啓。架構

SHOW ENGINES;
複製代碼

image.png

2.2 修改 MySQL 配置文件,重啓服務

修改 mysql 文件夾根目錄的 my.ini 文件(Linux 系統修改 my.cnf 文件):新添加一行,內容爲 federated,以下圖所示:(Docker 方式安裝只須要修改外置配置文件後重啓容器便可,阿里雲、華爲雲 DMS 可自行尋找修改配置方式,甚至於自帶跨庫Link功能)less

federated
複製代碼
docker restart (容器ID)
複製代碼

image.png

2.3. 再次執行命令:SHOW ENGINES;

檢查 mysql 數據庫中 Federated 引擎是否開啓,如今咱們發現已是開啓狀態了。

SHOW ENGINES;
複製代碼

image.png

2.4. 新建兩個測試用的數據庫,數據庫表

這裏讀者自行去建數據庫,自由發揮:

image.png

而後 在兩個數據庫裏分別新建兩張表 prd_sku(SKU信息表)和 prd_sku_stock(SKU庫存表):

CREATE TABLE `prd_sku`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'SKU名稱',
  `code` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'SKU編碼',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
複製代碼
CREATE TABLE `prd_sku_stock`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `sku_id` int(11) NOT NULL DEFAULT 0 COMMENT 'SKU的ID',
  `stock` int(11) NOT NULL DEFAULT 0 COMMENT 'SKU的庫存',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
複製代碼

image.png

1625714588(1).jpg

咱們先在表裏邊添加點數據進去:

INSERT INTO `prd_sku` VALUES (1, '黃色S碼', 'Y00S00');
INSERT INTO `prd_sku` VALUES (2, '紅色M碼', 'R00M00');
複製代碼
INSERT INTO `prd_sku_stock` VALUES (1, 1, 96);
INSERT INTO `prd_sku_stock` VALUES (2, 2, 98);
複製代碼

image.png

1625722939(1).jpg

2.5. 在數據庫 A 中創建遠程錶鏈接數據庫 B

CREATE TABLE `mycat_db1`.`prd_sku_stock`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `sku_id` int(0) NOT NULL,
  `stock` int(0) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE = FEDERATED CONNECTION = 'mysql://root:88021120@localhost:3306/mycat_db2/prd_sku_stock';
複製代碼
  • root:88021120 遠程數據庫的帳號和密碼
  • localhost:3306 遠程數據庫的ip和端口
  • mycat_db2 遠程數據庫的名稱
  • prd_sku_stock 遠程數據庫的表名稱

image.png

這裏有幾個特別須要注意的點:

  1. 鏈接表的字段必須和真實表一致,容許是子集;
  2. 真實表數據更新鏈接表自動會更新,反之亦然;
  3. 真實表結構改動,鏈接表不會跟着改動;
  4. 刪除鏈接表,是真實表不會被跟着刪除;
  5. 鏈接表沒法用 ALTER 語句改結構,因此若是想同步需求能夠刪除從新建;

2.6. 在數據庫 A 中執行 join 查詢,查看結果

SELECT * FROM prd_sku t1, prd_sku_stock t2 WHERE t1.id=t2.sku_id;
複製代碼

1625724361(1).jpg

3. 阿里雲 DMS 跨實例查詢服務

阿里雲 DMS(數據管理)跨實例查詢服務,不只覆蓋了異構數據源關聯查詢的場景,還解決了跨 region、跨雲的數據庫關聯查詢的難題。不只如此,還對查詢性能進行了大幅優化,使得大部分查詢能在毫秒級完成。用戶無需經過數據聚集,便可經過標準的 SQL 實現跨實例的交叉查詢。

9a753e8b1cfea42ac10d0f998fede02bd3160bd1.png

DBLink

熟悉 Oracle 的人應該知道,咱們能夠在當前登陸的 Oracle 上,創建一個 DBLink 指向另外一個遠程的Oracle 數據庫表。在跨實例查詢服務中,從新定義了 DBLink 的概念,它是一個指向用戶的任意數據庫實例的虛擬鏈接,是數據庫實例的別名。例如,對於 MySQL 來講,DBLink 和 ip/port 一一對應。藉助 DBLink,便可實現對任意數據源的 SQL 訪問。

5195fb64ba5d07fc26656b4276350f91e59bee3b-.png

兼容標準 SQL

經過標準的 SQL 語句,便可實現跨實例查詢。同時跨實例查詢服務高度兼容 MySQL,支持 MySQL 協議,以及各類經常使用函數和語法。您可經過 JDBC/ODBC 驅動鏈接到跨實例查詢服務;也可使用各類 MySQL GUI 工具來管理各類數據源。

Serverless 架構

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

高性能低延遲

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

支持多種關係型數據庫

目前已支持 MySQL、SQLServer、PostgreSQL 等多種關係型數據庫。

支持 SQL 方式訪問 NoSQL

除了關係型數據庫以外,跨實例查詢還支持以 SQL 方式訪問 Redis 等 NoSQL 數據庫。因爲支持了 SQL 語法,也能夠實現 RDBMS 和 NoSQL 之間關聯查詢。是的,你沒看錯,一條 SQL 就能實現 MySQL 和 Redis 之間的關聯查詢。

b194fc291eb55a2c2ae56393f472e38c536cb1dd-.png

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

企業發展到必定階段,用戶量、業務量不斷攀升,原來的單機房容量已經不能知足業務發展的需求,再結合容災、高可用等因素,一般會選擇跨 region 部署,也叫單元化部署。同時,很多企業也須要將業務拓展到海外,經過本地就近部署,爲國外用戶提供更好的體驗。相似這種水平拆分帶來的問題就是,如何對全局的業務數據進行統一的彙總關聯查詢。

藉助 DMS 跨實例查詢服務,不管您的數據庫實例部署在阿里雲的哪一個 region,無需跨 region 的數據遷移,便可實現全部 region 數據的統一查詢。除了阿里雲 RDS,也支持用戶部署在阿里雲 ECS 上的各類數據庫。不只如此,若是您的數據庫部署在本地 IDC 機房,甚至其餘雲廠商,均可以經過跨實例查詢服務,實現這些混合雲場景的跨實例關聯查詢。

df2dbc3dfecf734a1f1090f6f801eda649a3c5f4-.png

分庫分表難題(一) 分表分頁/跨庫分頁 難玩卻不表明沒有玩法
分庫分表難題(二) 跨庫/跨實例 Join 鏈接 不是非得依賴中間件

相關文章
相關標籤/搜索