概念:
?連接:通過協(xié)議 方言及庫存儲的適配,連接數(shù)據(jù)和應(yīng)用,關(guān)注多模數(shù)據(jù)苦之間的合作
? 增量:抓取庫入口流量題提供重定向, 流量變形(加密脫敏)/鑒權(quán)/治理(熔斷限流)/分析等
? 可插拔:微內(nèi)核
DDL:create table/index |?alter table |drop table |truncate table|drop index/table 表結(jié)構(gòu)
DML:insert update delete 表數(shù)據(jù)的操作
DQL:select?
DCL:grant分權(quán)限?revoke廢除權(quán)限
分表分庫
數(shù)據(jù)分片:按某維度將存放在單一數(shù)據(jù)庫中的數(shù)據(jù)分散地存放至多個數(shù)據(jù)庫或表
垂直分片
專庫專用,按業(yè)務(wù)
水平分片
通過某個字段(或某幾個字段),根據(jù)某種規(guī)則將數(shù)據(jù)分散至多個庫或表中
流程
Standard 內(nèi)核流程:SQL 解析 => SQL 路由 => SQL 改寫 => SQL 執(zhí)行 => 結(jié)果歸并,用于處理標(biāo)準(zhǔn)分片場景下的 SQL 執(zhí)行
Federation 執(zhí)行引擎流程:SQL 解析 => 邏輯優(yōu)化 => 物理優(yōu)化 => 優(yōu)化執(zhí)行 => Standard 內(nèi)核流程,在優(yōu)化執(zhí)行階段依賴Standard內(nèi)核流程,對優(yōu)化后的邏輯 SQL 進(jìn)行路由、改寫、執(zhí)行和歸并
sql解析:詞法/語法解析,詞法解析器SQ拆分不可再拆的詞 Token,詞法解析器 理解 sql,解析上下文(表/選擇項(xiàng)/排序項(xiàng)/分組項(xiàng)/聚合函數(shù)/分頁信息/查詢條件/占位符標(biāo)記)
sql路由:分片/廣播,解析上下文匹配分片策略,生成路由路徑
sql改寫:在真實(shí)數(shù)據(jù)可以執(zhí)行的語句,正確性/優(yōu)化改寫
sql執(zhí)行:多線程執(zhí)行器異步執(zhí)行
結(jié)果歸并:結(jié)果由統(tǒng)一的JDBC接口輸出,流式歸并/內(nèi)存歸并/裝飾者模式追加歸并
? ?流式歸并:以結(jié)果集游標(biāo)下移進(jìn)行結(jié)果歸并,省內(nèi)存 減少垃圾回收
查詢優(yōu)化:Federation提供,優(yōu)化關(guān)聯(lián)/子查詢,跨庫分布式查,關(guān)系代數(shù)優(yōu)化查詢計(jì)劃,最優(yōu)計(jì)劃查詢出結(jié)果
解析引擎
抽象語法樹
? ? sql解析階段的token,再據(jù)不同數(shù)據(jù)庫方言提供的字典,將其歸類為關(guān)鍵字 表達(dá)式 字面量 操作符,語法解析器將sql轉(zhuǎn)換為抽象語法樹
?解析過程不可逆,token按原本順序依次解析,性能高
sql解析引擎
? ?3.0 ANTLR作為SQL解析的引擎(兼容sql),據(jù)DDL -> TCL -> DAL –> DCL -> DML –>DQL依次替換原有的解析引擎,慢 需要搭配PreparedStatement預(yù)編譯
路由引擎
上下文匹配數(shù)據(jù)庫/表的分片策略,生成路由
攜帶分片鍵sql,分片鍵不同劃分單片路由(=)多片路由(in)范圍路由(between)
不攜帶 分片鍵 的廣播路由
分片策略
?內(nèi)置:尾數(shù)取模 哈希 范圍 標(biāo)簽 時間
?用戶配置:需求定制復(fù)合分片策略
分片路由
直接路由:分庫不分表 hint指定路由到庫,避免sql解析 結(jié)果歸并;可子查詢 自定義函數(shù)等任意sql
標(biāo)準(zhǔn)路由:推薦,不含關(guān)聯(lián)查 僅綁定表間關(guān)聯(lián)的sql,=單表 between/in不定 sql拆分?jǐn)?shù)目與單表一致
笛卡爾積路由:復(fù)雜?非綁定表間關(guān)聯(lián)查詢需拆解為笛卡爾積組合執(zhí)行 t0t0? t0t1? t1t0? t1t1
廣播路由
- 全庫表:庫中邏輯表相關(guān)的all操作,DQL DML DDL,all庫all表匹配邏輯表和真實(shí)表名 執(zhí)行
- 全庫:對庫操作,set/TCL事務(wù)控制語句,據(jù)邏輯名字遍歷符合名字匹配的真實(shí)庫
- 全實(shí)例:DCL 每個庫只執(zhí)行一次
- 單播:獲取真實(shí)的表信息 任意庫的任意真實(shí)表即可
- 阻斷:屏蔽sql對數(shù)據(jù)庫的操作
改寫引擎
邏輯SQL改寫在真實(shí)數(shù)據(jù)庫中可正確執(zhí)行的SQL:正確性改寫 優(yōu)化改寫
流式歸并優(yōu)化:group by 的sql增加order by和分組項(xiàng)相同的排序項(xiàng)/順序
執(zhí)行引擎
?執(zhí)行引擎的目標(biāo)是自動化的平衡資源控制與執(zhí)行效率
連接模式
? ?每個分片查詢維持一個獨(dú)立的數(shù)據(jù)庫連接:利用多線程提供執(zhí)行效率/并行處理io消耗/避免過早將結(jié)果放到內(nèi)存/持有查詢結(jié)果集游標(biāo)位置的引用
? 無法保證每個分片持有獨(dú)立數(shù)據(jù)庫連接,在復(fù)用該庫連接獲取下一張分表查詢結(jié)果集之前,當(dāng)前查詢結(jié)果集全數(shù)加載至內(nèi)存,流式退化為內(nèi)存歸并
? ?抉擇:對庫連接資源控制保護(hù) 更優(yōu)歸并模式對中間件內(nèi)存資源節(jié)省
內(nèi)存限制模式
? 不限制一次操作所耗費(fèi)的數(shù)據(jù)庫連接數(shù)量,多線程并發(fā)處理,執(zhí)行效率最大化
? 且在sql滿足條件情況下,優(yōu)先選擇流式歸并,防止內(nèi)存溢出 避免頻繁垃圾回收
? OLAP:提供吞吐量,聯(lián)機(jī)分析處理 復(fù)雜計(jì)算和統(tǒng)計(jì) 數(shù)據(jù)分析預(yù)測
連接限制模式
? ?控制連接數(shù)量,唯一連接串行執(zhí)行處理,分片散落不同數(shù)據(jù)庫 多線程處理不同庫的操作 一個庫一個連接,防止對一次請求對數(shù)據(jù)庫連接占用過多所帶來的問題,內(nèi)存歸并
? ?OLTP(聯(lián)機(jī)事務(wù)) 實(shí)時性 事務(wù)處理數(shù)據(jù)操作
? ? ??帶分片鍵 路由到單一分片 保證庫資源被更多應(yīng)用使用到
自動化執(zhí)行引擎
由執(zhí)行引擎根場景自動選擇最優(yōu)的執(zhí)行方案
連接模式的選擇粒度細(xì)化至每一次SQL的操作
? ? 據(jù)路由結(jié)果,實(shí)時演算和權(quán)衡,自主選擇:資源 效率最優(yōu)?
? ? 僅配置maxConnectionSizePerQuery一次查詢時每個數(shù)據(jù)庫所允許使用的最大連接數(shù)
準(zhǔn)備階段
結(jié)果集分組 執(zhí)行單元執(zhí)行兩步
- sql路由結(jié)果按數(shù)據(jù)源的名稱分組
- 獲得在數(shù)據(jù)庫實(shí)例在maxConnectionSizePerQuery范圍,一連接需執(zhí)行的SQL路由結(jié)果組,計(jì)算出本次請求的最優(yōu)連接模式
避免死鎖:同步獲取連接,創(chuàng)建執(zhí)行單元 原子性一次性獲取本次sql需要all庫連接
- 避免鎖定一次性只需要1個庫連接的操作,不需鎖定,OLTP分片鍵路由唯一節(jié)點(diǎn) 讀寫分離
- 內(nèi)存限制模式才資源限定,連接限制all結(jié)果集在內(nèi)存后釋放連接資源 不會死鎖
執(zhí)行階段
分組執(zhí)行
? ?準(zhǔn)備執(zhí)行階段生成的執(zhí)行單元下發(fā)到底層并發(fā)執(zhí)行引擎,執(zhí)行過程中關(guān)鍵步驟發(fā)送事件 執(zhí)行引擎僅關(guān)注事件發(fā)布 訂閱感興趣的并處理
歸并結(jié)果
? ?內(nèi)存歸并結(jié)果集或流式歸并結(jié)果集,將其傳遞至結(jié)果歸并引擎 ??
歸并引擎
? ?結(jié)果歸并:從各個數(shù)據(jù)節(jié)點(diǎn)獲取的多數(shù)據(jù)結(jié)果集,組合成結(jié)果集并正確的返回給請求客戶端
? ?返回結(jié)果集方式歸并,減少內(nèi)存消耗
流式歸并:每一次從結(jié)果集中獲取到的數(shù)據(jù),能通過逐條獲取的方式返回正確的單條數(shù)據(jù),與數(shù)據(jù)庫原生的返回結(jié)果集的方式契合
? ?遍歷、排序以及流式分組都屬于流式歸并的一種
內(nèi)存歸并:需將結(jié)果集的all數(shù)據(jù)都遍歷并存儲在內(nèi)存,通過統(tǒng)一的分組、排序及聚合等計(jì)算,再將其封裝成逐條訪問的數(shù)據(jù)結(jié)果集返回
裝飾者歸并:對all結(jié)果集歸并進(jìn)行統(tǒng)一的功能增強(qiáng),分頁歸并和聚合歸并這2種類型
遍歷:將多個數(shù)據(jù)結(jié)果集合并為一個單向鏈表
? ?遍歷完當(dāng)前結(jié)果集,鏈表元素后移一位,繼續(xù)遍歷下一個數(shù)據(jù)結(jié)果集
排序:ORDER BY每個數(shù)據(jù)結(jié)果集自身是有序的,將結(jié)果集當(dāng)前游標(biāo)指向的數(shù)據(jù)值進(jìn)行排序
? ? 將每個結(jié)果集的當(dāng)前數(shù)據(jù)值進(jìn)行比較(通過實(shí)現(xiàn)Java的Comparable接口),將其放入優(yōu)先級隊(duì)列,?獲取下一條數(shù)據(jù)時,只需將隊(duì)列頂端結(jié)果集的游標(biāo)下移,并據(jù)新游標(biāo)重新進(jìn)入優(yōu)先級排序隊(duì)列找到自己的位置即可
? ???
分組:流式分組歸并/內(nèi)存分組歸并
聚合:之前介紹的歸并類的之上追加的歸并能力,比較min max、累加sum count和求平均值avg
分頁:通過結(jié)果集的next方法跳過無需取出的數(shù)據(jù),不會將其存入內(nèi)存
數(shù)據(jù)脫敏
完整、安全、透明化、低改造成本的數(shù)據(jù)加密整合解決方案
- ? 解析用戶輸入的SQL進(jìn)行,依據(jù)用戶提供的加密規(guī)則改寫SQL,實(shí)現(xiàn)對原數(shù)據(jù)加密,將原文數(shù)據(jù)(可選)及密文數(shù)據(jù)同時存儲到底層數(shù)據(jù)庫
- 查詢數(shù)據(jù),從數(shù)據(jù)庫中取出密文數(shù)據(jù),并對其解密,將解密后的原始數(shù)據(jù)返回給用戶。
- 自動化 & 透明化數(shù)據(jù)加密過程,無需關(guān)注數(shù)據(jù)加密的細(xì)節(jié),像使用普通數(shù)據(jù)那樣使用加密數(shù)據(jù)
? ? 加密模塊攔截?SQL ,語法解析器進(jìn)行解析、理解 SQL 行為,依傳入的加密規(guī)則,找出需加密的字段和所使用的加解密算法對目標(biāo)字段進(jìn)行加解密處理后,與底層數(shù)據(jù)庫交互
? ? 在用戶查詢時,將密文從數(shù)據(jù)庫中取出進(jìn)行解密后返回給終端用戶。 屏蔽對數(shù)據(jù)的加密解密處理過程
加密規(guī)則
加密處理過程
解決方案
新業(yè)務(wù)直接配置?
老業(yè)務(wù)
新的數(shù)據(jù) 走配置 新增字段 自動賦值
舊數(shù)據(jù)?自行加密清洗
將明文刪除,建立映射關(guān)系 底層使用密文處理
加密算法
EncryptAlgorithm
?encrypt decrypt
? ? insert/delete/update ,按配置 sql解析/改寫/路由 encrypt加密 存儲到庫
? ? 查詢decrypt從庫取出加密 逆向解密,原始數(shù)據(jù)返回
md5 不可逆,aes可選,rc4可逆
QueryAssistedEncryptAlgorithm
相同的數(shù)據(jù),庫中也應(yīng)該是不一樣的
encrypt()階段,設(shè)置某個變動種子,如時間戳。
? ? 針對原始數(shù)據(jù)+變動種子組合的內(nèi)容進(jìn)行加密,加密數(shù)據(jù)是不一樣的
decrypt()可依據(jù)之前規(guī)定的加密算法,利用種子數(shù)據(jù)進(jìn)行解密
輔助查詢列queryAssistedEncrypt
? ?另一種方式加密原始數(shù)據(jù),針對原始數(shù)據(jù)相同的數(shù)據(jù),產(chǎn)生的加密數(shù)據(jù)是一致的
事務(wù)
xa
X/OPEN組織定義的DTP模型抽象的 AP(應(yīng)用程序), TM(事務(wù)管理器)和 RM(資源管理器)
??
? ? set autoCommit=0 ,XAShardingSphereTransactionManager 為調(diào)用具體的 XA 事務(wù)管理器開啟 XA 全局事務(wù),以 XID 的形式進(jìn)行標(biāo)記
? ?XAResource注冊XA事務(wù)中,事務(wù)管理器?XAResource.start,庫收到XAResource.end前,all的sql操作標(biāo)記為xa事務(wù)
? ?XAShardingSphereTransactionManager收到接入端提交命令,委托xa事務(wù)管理器提交,收集到all注冊xaResource, 發(fā)送XAResource.end 指令,依次發(fā)送prepare,手機(jī)xaResource投票,all均正確 commit最終提交,否rollback回滾
Saga
? ?一個Saga事務(wù)是一個有多個短時事務(wù)組成的長時的事務(wù)
? ?分布式事務(wù)場景下,一個Saga分布式事務(wù)看做是一個由多個本地事務(wù)組成的事務(wù),每個本地事務(wù)都有一個與之對應(yīng)的補(bǔ)償事務(wù)
? ?在Saga事務(wù)的執(zhí)行過程中,如某一步執(zhí)行出現(xiàn)異常,Saga事務(wù)會被終止,同時會調(diào)用對應(yīng)的補(bǔ)償事務(wù)完成相關(guān)的恢復(fù)操作
自動反向補(bǔ)償
? ? ?Saga事務(wù)管理器根程序執(zhí)行結(jié)果生成一張有向無環(huán)圖,在需要執(zhí)行回滾操作時,據(jù)該圖依次按照相反的順序調(diào)用反向補(bǔ)償操作
? ? Saga事務(wù)管理器只用于控制何時重試,何時補(bǔ)償,補(bǔ)償?shù)木唧w操作需開發(fā)者提供
ShardingSphere采用反向SQL技術(shù),將對數(shù)據(jù)庫進(jìn)行更新操作的SQL自動生成反向SQL,并交由saga-actuator執(zhí)行,無需關(guān)注如何實(shí)現(xiàn)補(bǔ)償,柔性事務(wù)管理器的應(yīng)用范疇定位回了數(shù)據(jù)庫層面
Seata
彈性伸縮
對現(xiàn)有的分片集群進(jìn)行彈性擴(kuò)容或縮容,4.1.0
臨時建兩個庫集群,伸縮完切換
? ?解析舊分片規(guī)則,提取配置中的數(shù)據(jù)源、數(shù)據(jù)節(jié)點(diǎn)等,之后創(chuàng)建伸縮作業(yè)工作流
壓測
? ?解析 SQL,對傳入的 SQL 進(jìn)行影子判定,根配置文件設(shè)置的影子規(guī)則,路由到生產(chǎn)庫或者影子庫
?以 INSERT 語句為例,對 SQL 進(jìn)行解析,據(jù)配置文件規(guī)則,構(gòu)造一條路由鏈
? ?在當(dāng)前版本的功能中(很老的版本), 影子功能處于路由鏈中的最后一個執(zhí)行單元:如果有其他需要路由的規(guī)則存在,如分片,據(jù)分片規(guī)則路由到某一個數(shù)據(jù)庫,執(zhí)行影子路由判定流程,判定執(zhí)行SQL滿足影子規(guī)則的配置,數(shù)據(jù)路由到對應(yīng)的影子庫,生產(chǎn)數(shù)據(jù)維持不變
DML:先判斷執(zhí)行SQL表與配置的影子表是否有交集,有:判交集影子表關(guān)聯(lián)的影子算法,任一成功 sql路由到影子庫,無交集 判定失敗 路由到生產(chǎn)庫文章來源:http://www.zghlxwxcb.cn/news/detail-848959.html
DDL:注解影子算法,初始化/修改影子庫使用,執(zhí)行的sql有注解 配置hint判定 成功路由影子庫 否路由生產(chǎn)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-848959.html
到了這里,關(guān)于ShardingSphere再回首的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!