一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分庫分表的21條法則速來碼?。ㄏ拢?/h1>

SQL 解析

分庫分表后在應(yīng)用層面執(zhí)行一條 SQL 語句時(shí),通常需要經(jīng)過以下六個(gè)步驟:SQL 解析 -> 執(zhí)?器優(yōu)化 -> SQL 路由 -> SQL 改寫 -> SQL 執(zhí)? -> 結(jié)果歸并

圖片

在這里插入圖片描述

SQL解析過程分為詞法解析語法解析兩步,比如下邊查詢用戶訂單的SQL,先用詞法解析將這條SQL拆解成不可再分的原子單元。在根據(jù)不同數(shù)據(jù)庫方言所提供的字典,將這些單元?dú)w類為關(guān)鍵字,表達(dá)式,變量或者操作符等類型。

SELECT order_no FROM t_order where  order_status > 0  and user_id = 10086

接著語法解析會(huì)將拆分后的SQL關(guān)鍵字轉(zhuǎn)換為抽象語法樹,通過對(duì)抽象語法樹遍歷,提煉出分片所需的上下文,上下文包含查詢字段信息(Field)、表信息(Table)、查詢條件(Condition)、排序信息(Order By)、分組信息(Group By)以及分頁信息(Limit)等,并標(biāo)記出 SQL中有可能需要改寫的位置。

圖片

抽象語法樹

執(zhí)?器優(yōu)化

執(zhí)?器優(yōu)化是根據(jù)SQL查詢特點(diǎn)和執(zhí)行統(tǒng)計(jì)信息,選擇最優(yōu)的查詢計(jì)劃并執(zhí)行,比如user_id字段有索引,那么會(huì)調(diào)整兩個(gè)查詢條件的位置,主要是提高SQL的執(zhí)行效率。

SELECT order_no FROM t_order where user_id = 10086 and order_status > 0

SQL 路由

通過上邊的SQL解析得到了分片上下文數(shù)據(jù),在匹配用戶配置的分片策略和算法,就可以運(yùn)算生成路由路徑,將 SQL 語句路由到相應(yīng)的數(shù)據(jù)節(jié)點(diǎn)上。

簡單點(diǎn)理解就是拿到分片策略中配置的分片鍵等信息,在從SQL解析結(jié)果中找到對(duì)應(yīng)分片鍵字段的值,計(jì)算出 SQL該在哪個(gè)庫的哪個(gè)表中執(zhí)行,SQL路由又根據(jù)有無分片健分為 分片路由廣播路由

圖片

有分?鍵的路由叫分片路由,細(xì)分為直接路由、標(biāo)準(zhǔn)路由和笛卡爾積路由這3種類型。

標(biāo)準(zhǔn)路由

標(biāo)準(zhǔn)路由是最推薦也是最為常?的分??式,它的適?范圍是不包含關(guān)聯(lián)查詢或僅包含綁定表之間關(guān)聯(lián)查詢的SQL。

當(dāng) SQL分片健的運(yùn)算符為 = 時(shí),路由結(jié)果將落?單庫(表),當(dāng)分?運(yùn)算符是BETWEENIN 等范圍時(shí),路由結(jié)果則不?定落?唯?的庫(表),因此?條邏輯SQL最終可能被拆分為多條?于執(zhí)?的真實(shí)SQL。

SELECT * FROM t_order  where t_order_id in (1,2)

SQL路由處理后

SELECT * FROM t_order_0  where t_order_id in (1,2)
SELECT * FROM t_order_1  where t_order_id in (1,2)

直接路由

直接路由是直接將SQL路由到指定?庫、表的一種分?方式,而且直接路由可以?于分?鍵不在SQL中的場(chǎng)景,還可以執(zhí)?包括?查詢、?定義函數(shù)等復(fù)雜情況的任意SQL。

笛卡爾積路由

笛卡爾路由是由?綁定表之間的關(guān)聯(lián)查詢產(chǎn)生的,比如訂單表t_order 分片鍵是t_order_id和用戶表t_user分片鍵是t_order_id,兩個(gè)表的分片鍵不同,要做聯(lián)表查詢,會(huì)執(zhí)行笛卡爾積路由,查詢性能較低盡量避免走此路由模式。

SELECT * FROM t_order_0 t LEFT JOIN t_user_0 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_0 t LEFT JOIN t_user_1 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_1 t LEFT JOIN t_user_0 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_1 t LEFT JOIN t_user_1 u ON u.user_id = t.user_id WHERE t.user_id = 1

無分?鍵的路由又叫做廣播路由,可以劃分為全庫表路由、全庫路由、 全實(shí)例路由、單播路由和阻斷路由這 5種類型。

全庫表路由

全庫表路由針對(duì)的是數(shù)據(jù)庫 DQLDML,以及 DDL等操作,當(dāng)我們執(zhí)行一條邏輯表 t_order SQL時(shí),在所有分片庫中對(duì)應(yīng)的真實(shí)表 t_order_0 ··· t_order_n 內(nèi)逐一執(zhí)行。

全庫路由

全庫路由主要是對(duì)數(shù)據(jù)庫層面的操作,比如數(shù)據(jù)庫 SET 類型的數(shù)據(jù)庫管理命令,以及 TCL 這樣的事務(wù)控制語句。

對(duì)邏輯庫設(shè)置 autocommit 屬性后,所有對(duì)應(yīng)的真實(shí)庫中都執(zhí)行該命令。

SET autocommit=0;

全實(shí)例路由

全實(shí)例路由是針對(duì)數(shù)據(jù)庫實(shí)例的 DCL 操作(設(shè)置或更改數(shù)據(jù)庫用戶或角色權(quán)限),比如:創(chuàng)建一個(gè)用戶 order ,這個(gè)命令將在所有的真實(shí)庫實(shí)例中執(zhí)行,以此確保 order 用戶可以正常訪問每一個(gè)數(shù)據(jù)庫實(shí)例。

CREATE USER order@127.0.0.1 identified BY '程序員小富';

單播路由

單播路由用來獲取某一真實(shí)表信息,比如獲得表的描述信息:

DESCRIBE t_order;

t_order 的真實(shí)表是 t_order_0 ···· t_order_n,他們的描述結(jié)構(gòu)相完全同,我們只需在任意的真實(shí)表執(zhí)行一次就可以。

阻斷路由

?來屏蔽SQL對(duì)數(shù)據(jù)庫的操作,例如:

USE order_db;

這個(gè)命令不會(huì)在真實(shí)數(shù)據(jù)庫中執(zhí)?,因?yàn)?ShardingSphere 采?的是邏輯 Schema(數(shù)據(jù)庫的組織和結(jié)構(gòu)) ?式,所以無需將切換數(shù)據(jù)庫的命令發(fā)送?真實(shí)數(shù)據(jù)庫中。

SQL 改寫

SQL經(jīng)過解析、優(yōu)化、路由后已經(jīng)明確分片具體的落地執(zhí)行的位置,接著就要將基于邏輯表開發(fā)的SQL改寫成可以在真實(shí)數(shù)據(jù)庫中可以正確執(zhí)行的語句。比如查詢 t_order 訂單表,我們實(shí)際開發(fā)中 SQL是按邏輯表 t_order 寫的。

SELECT * FROM t_order

這時(shí)需要將分表配置中的邏輯表名稱改寫為路由之后所獲取的真實(shí)表名稱。

SELECT * FROM t_order_n

SQL執(zhí)?

將路由和改寫后的真實(shí) SQL 安全且高效發(fā)送到底層數(shù)據(jù)源執(zhí)行。但這個(gè)過程并不能將 SQL 一股腦的通過 JDBC 直接發(fā)送至數(shù)據(jù)源執(zhí)行,需平衡數(shù)據(jù)源連接創(chuàng)建以及內(nèi)存占用所產(chǎn)生的消耗,它會(huì)自動(dòng)化的平衡資源控制與執(zhí)行效率。

結(jié)果歸并

將從各個(gè)數(shù)據(jù)節(jié)點(diǎn)獲取的多數(shù)據(jù)結(jié)果集,合并成一個(gè)大的結(jié)果集并正確的返回至請(qǐng)求客戶端,稱為結(jié)果歸并。而我們SQL中的排序、分組、分頁和聚合等語法,均是在歸并后的結(jié)果集上進(jìn)行操作的。

分布式主鍵

數(shù)據(jù)分?后,一個(gè)邏輯表(t_order)對(duì)應(yīng)諸多的真實(shí)表(t_order_n),它們之間由于?法互相感知,主鍵ID都從初始值累加,所以必然會(huì)產(chǎn)?重復(fù)主鍵ID,此時(shí)主鍵不再唯一那么對(duì)于業(yè)務(wù)來說也就沒意義了。

圖片

盡管可通過設(shè)置表?增主鍵 初始值步? 的?式避免ID碰撞,但這樣會(huì)使維護(hù)成本加大,可擴(kuò)展性差。

這個(gè)時(shí)候就需要我們手動(dòng)為一條數(shù)據(jù)記錄,分配一個(gè)全局唯一的ID,這個(gè)ID被叫做分布式ID,而生產(chǎn)這個(gè)ID的系統(tǒng)通常被叫做發(fā)號(hào)器。

大家可以參考我之前發(fā)布的這篇文章 9種分布式ID生成方案

數(shù)據(jù)脫敏

分庫分表數(shù)據(jù)脫敏是一種有效的數(shù)據(jù)保護(hù)措施,可以確保敏感數(shù)據(jù)的機(jī)密性和安全性,減少數(shù)據(jù)泄露的風(fēng)險(xiǎn)。

比如,我們?cè)诜謳旆直頃r(shí)可以指定表的哪些字段為脫敏列,并設(shè)置對(duì)應(yīng)的脫敏算法,在數(shù)據(jù)分片時(shí)解析到執(zhí)行SQL中有待脫敏字段,會(huì)直接將字段值脫敏后的寫入庫表內(nèi)。

對(duì)于用戶的個(gè)人信息,如姓名、地址和電話號(hào)碼等,可以通過加密、隨機(jī)化或替換成偽隨機(jī)數(shù)據(jù)的方式進(jìn)行脫敏,以確保用戶的隱私得到保護(hù)。

大家可以參考我之前發(fā)布的這篇文章 大廠也在用的 6種 數(shù)據(jù)脫敏方案

分布式事務(wù)

分布式事務(wù)的核心問題是如何實(shí)現(xiàn)跨多個(gè)數(shù)據(jù)源的原子性操作。

由于不同的服務(wù)通常會(huì)使用不同的數(shù)據(jù)源來存儲(chǔ)和管理數(shù)據(jù),因此,跨數(shù)據(jù)源的操作可能會(huì)導(dǎo)致數(shù)據(jù)不一致性或丟失的風(fēng)險(xiǎn)。因此,保證分布式事務(wù)的一致性是非常重要的。

以訂單系統(tǒng)為例,它需要調(diào)用支付系統(tǒng)、庫存系統(tǒng)、積分系統(tǒng)等多個(gè)系統(tǒng),而每個(gè)系統(tǒng)都維護(hù)自己的數(shù)據(jù)庫實(shí)例,系統(tǒng)間通過API接口交換數(shù)據(jù)。

圖片

為了保證下單后多個(gè)系統(tǒng)同時(shí)調(diào)用成功,可以使用強(qiáng)一致性事務(wù)的XA協(xié)議,或者柔性事務(wù)的代表工具Seata,來實(shí)現(xiàn)分布式事務(wù)的一致性。這些工具可以幫助開發(fā)人員簡化分布式事務(wù)的實(shí)現(xiàn),減少錯(cuò)誤和漏洞的出現(xiàn),提高系統(tǒng)的穩(wěn)定性和可靠性。

經(jīng)過分庫分表之后,問題的難度進(jìn)一步提升。自身訂單服務(wù),也需要處理跨數(shù)據(jù)源的操作。這樣一來,系統(tǒng)的復(fù)雜度顯著增加。因此,不到萬不得已的情況下,最好避免采用分庫分表的解決方案。

圖片

關(guān)于分布式事務(wù)詳細(xì)的介紹,大家可以參考我之前發(fā)布的這篇文章 對(duì)比 5 種分布式事務(wù)方案,還是寵幸了阿里的 Seata(原理 + 實(shí)戰(zhàn))

數(shù)據(jù)遷移

分庫分表后還有個(gè)讓人頭疼的問題,那就是數(shù)據(jù)遷移,為了不影響現(xiàn)有的業(yè)務(wù)系統(tǒng),通常會(huì)新建數(shù)據(jù)庫集群遷移數(shù)據(jù)。將數(shù)據(jù)從舊集群的數(shù)據(jù)庫、表遷移到新集群的分庫、分表中。這是一個(gè)比較復(fù)雜的過程,在遷移過程中需要考慮數(shù)據(jù)量數(shù)據(jù)一致性、遷移速度等諸多因素。

遷移主要針對(duì) 存量數(shù)據(jù)增量數(shù)據(jù) 的處理,存量數(shù)據(jù)指舊數(shù)據(jù)源中已經(jīng)存在且有價(jià)值的歷史數(shù)據(jù),增量數(shù)據(jù)指當(dāng)下持續(xù)增長以及未來產(chǎn)生的業(yè)務(wù)數(shù)據(jù)。

存量數(shù)據(jù)可以采用定時(shí)、分批次的遷移,遷移過程可能會(huì)持續(xù)幾天。

增量數(shù)據(jù)可以采用新、舊數(shù)據(jù)庫集群雙寫模式。待數(shù)據(jù)遷移完畢,業(yè)務(wù)驗(yàn)證了數(shù)據(jù)一致性,應(yīng)用直接切換數(shù)據(jù)源即可。

后續(xù)我們會(huì)結(jié)合三方工具,來演示遷移的過程。

影子庫

什么是影子庫(Shadow Table)?

影子庫是一個(gè)與生產(chǎn)環(huán)境數(shù)據(jù)庫結(jié)構(gòu)完全相同的實(shí)例,它存在的意義是為了在不影響線上系統(tǒng)的情況下,驗(yàn)證數(shù)據(jù)庫遷移或者其他數(shù)據(jù)庫變更操作的正確性,以及全鏈路壓測(cè)。影子庫中存儲(chǔ)的數(shù)據(jù)是從生產(chǎn)環(huán)境中定期復(fù)制過來的,但是它不對(duì)線上業(yè)務(wù)產(chǎn)生任何影響,僅用于測(cè)試,驗(yàn)證和調(diào)試。

圖片

在進(jìn)行數(shù)據(jù)庫升級(jí)、版本變更、參數(shù)調(diào)優(yōu)等操作前,通過在影子庫上模擬這些操作,可以發(fā)現(xiàn)潛在的問題,因?yàn)闇y(cè)試環(huán)境的數(shù)據(jù)是不可靠的。

在使用影子庫時(shí),需要遵循以下幾個(gè)原則:

  • 與生產(chǎn)環(huán)境數(shù)據(jù)庫的結(jié)構(gòu)應(yīng)該完全一致,包括表結(jié)構(gòu)、索引、約束等;
  • 數(shù)據(jù)要與生產(chǎn)環(huán)境保持一致,可以通過定期同步方式實(shí)現(xiàn);
  • 讀寫操作不會(huì)影響生產(chǎn)環(huán)境,一般情況下應(yīng)該禁止在影子庫上執(zhí)行更新、刪除等操作;
  • 由于影子庫的數(shù)據(jù)特點(diǎn),訪問權(quán)限應(yīng)該嚴(yán)格控制,只允許授權(quán)人員進(jìn)行訪問和操作;

總結(jié)

本文介紹了關(guān)于分庫分表架構(gòu)的21個(gè)通用概念,有一定的了解之后,接下來我們將進(jìn)入更深度的內(nèi)容,包括讀寫分離、數(shù)據(jù)脫敏、分布式主鍵、分布式事務(wù)、配置中心、注冊(cè)中心Proxy服務(wù)等實(shí)戰(zhàn)案例的講解和源碼分析。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    783

    瀏覽量

    45130
  • 路由
    +關(guān)注

    關(guān)注

    0

    文章

    280

    瀏覽量

    42479
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)據(jù)庫分區(qū)、分庫

    今天先說說數(shù)據(jù)庫的數(shù)據(jù)分區(qū),分庫以及的內(nèi)容吧! 數(shù)據(jù)庫分區(qū)、分庫 數(shù)據(jù)庫分區(qū)、
    的頭像 發(fā)表于 09-30 11:24 ?3486次閱讀

    談分布式數(shù)據(jù)庫中間件之分庫   

      分庫,顧名思義就是把原本存儲(chǔ)于一個(gè)庫的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)庫上,把原本存儲(chǔ)于一個(gè)的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)上。那么關(guān)于
    發(fā)表于 08-02 20:19

    分庫是什么?怎么實(shí)現(xiàn)?

    數(shù)據(jù)庫分庫、讀寫分離的原理實(shí)現(xiàn),使用場(chǎng)景
    發(fā)表于 10-25 17:24

    買大硬盤的6法則

    買大硬盤的6法則 采購話題1:別光顧容量和價(jià)格!         沒錯(cuò),容量和價(jià)格是大家在選購硬盤時(shí)問得最多的關(guān)鍵詞。事實(shí)上,除了這兩
    發(fā)表于 12-17 14:39 ?1140次閱讀

    利用Mycat實(shí)現(xiàn)MySQL讀寫分離、分庫最佳實(shí)踐

    利用Mycat實(shí)現(xiàn)MySQL讀寫分離、分庫最佳實(shí)踐
    發(fā)表于 09-08 10:20 ?14次下載
    利用Mycat實(shí)現(xiàn)MySQL讀寫分離、<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>最佳實(shí)踐

    數(shù)據(jù)庫分庫基礎(chǔ)和實(shí)踐

    問題?  一般情況,列表分頁時(shí)需要按照指定字段進(jìn)行排序。在單庫單的情況,分頁和排序也是非常容易的。但是,隨著分庫
    發(fā)表于 09-05 16:40 ?345次閱讀

    你們知道為什么要分庫

    ? 這些問題你都搞清楚了嗎?相信看完這篇文章會(huì)有答案。 為什么要分庫? 首先回答一為什么要分庫
    的頭像 發(fā)表于 08-16 10:37 ?1724次閱讀

    優(yōu)化MySQL數(shù)據(jù)庫中樸實(shí)無華的和花里胡哨的分庫

    blog.csdn.net/qq_39390545/article/details/116248222 一、樸實(shí)無華的 - 1、垂直 2、水平分
    的頭像 發(fā)表于 08-26 16:33 ?1435次閱讀

    你是否知道分庫需要哪些要素?

    分庫會(huì)重新影響數(shù)據(jù)的分布,無論是全量還是增量,都會(huì)涉及到數(shù)據(jù)遷移,所以Databus是必要的。
    的頭像 發(fā)表于 10-12 10:39 ?1019次閱讀

    什么是分庫?為什么分庫?什么情況會(huì)用分庫呢?

    分庫是由分庫這兩個(gè)獨(dú)立概念組成的,只不過通常分庫
    的頭像 發(fā)表于 11-30 09:37 ?8023次閱讀

    PCB布局的十設(shè)計(jì)法則

    本文以下內(nèi)容介紹了電子設(shè)計(jì)工程師在使用設(shè)計(jì)軟件進(jìn)行PCB布局設(shè)計(jì)及商業(yè)制造時(shí)應(yīng)牢記并踐行的十最有效的設(shè)計(jì)法則。工程師無需按時(shí)間先后或相對(duì)重要性依次執(zhí)行這些法則,只需全部遵循便可極大地改變產(chǎn)品設(shè)計(jì)。
    發(fā)表于 04-08 11:19 ?411次閱讀

    分庫21法則速來(上)

    還是不著急實(shí)戰(zhàn),咱們先介紹下在分庫架構(gòu)實(shí)施過程中,會(huì)接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫表工具,盡管它們的實(shí)
    的頭像 發(fā)表于 05-26 17:33 ?770次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的<b class='flag-5'>21</b><b class='flag-5'>條</b><b class='flag-5'>法則</b><b class='flag-5'>速來</b><b class='flag-5'>碼</b><b class='flag-5'>住</b>(上)

    分庫后復(fù)雜查詢的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬構(gòu)建技術(shù)實(shí)踐

    ,通過分庫應(yīng)對(duì)存系統(tǒng)讀寫性能瓶頸和存儲(chǔ)瓶頸;分庫
    的頭像 發(fā)表于 06-25 18:30 ?1345次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復(fù)雜查詢的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬<b class='flag-5'>表</b>構(gòu)建技術(shù)實(shí)踐

    軟件系統(tǒng)數(shù)據(jù)庫的分庫設(shè)計(jì)

    軟件系統(tǒng)數(shù)據(jù)庫的分庫設(shè)計(jì) 系統(tǒng)讀寫分離、分庫技術(shù)實(shí)現(xiàn)采用MyCat中間件,MyCat 是
    的頭像 發(fā)表于 08-22 11:39 ?589次閱讀
    軟件系統(tǒng)數(shù)據(jù)庫的<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設(shè)計(jì)

    或許我們都被分庫約束了思維

    作者:張俊杰 概述 這篇文章沒什么太多的干貨,純純是一篇討論和思考帖。 從業(yè)數(shù)據(jù)庫領(lǐng)域三年有余了,從分庫中間件到數(shù)據(jù)庫團(tuán)隊(duì)內(nèi)核學(xué)到了很多東西。也接觸了很多項(xiàng)目,包括TiDB、Vitess
    的頭像 發(fā)表于 02-21 09:51 ?255次閱讀