日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL

發(fā)布時(shí)間:2024/9/3 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:?作者:雁閑、無哈,阿里云數(shù)據(jù)庫技術(shù)專家

概述

X-Engine是阿里自研的數(shù)據(jù)庫存儲(chǔ)引擎,以插件的方式接入到MySQL生態(tài),支持行鎖,事務(wù),MVCC等OLTP場(chǎng)景的核心功能。

X-Engine的核心優(yōu)勢(shì)是低成本,高性價(jià)比,尤其適用于歷史庫場(chǎng)景,目前阿里巴巴內(nèi)部的核心交易歷史庫(原來是Hbase),釘釘消息歷史庫(原來是MySQL(InnoDB)),淘寶商家的圖片空間等業(yè)務(wù)均通過X-Engine解決了成本問題。

同時(shí),X-Engine也賦能阿里云數(shù)據(jù)庫服務(wù),作為云上RDS-MySQL的存儲(chǔ)引擎,對(duì)外售賣,讓更多的用戶享受到新技術(shù)帶來的紅利,有關(guān)X-Engine的詳細(xì)介紹,請(qǐng)移步2019年10月的數(shù)據(jù)庫內(nèi)核月報(bào)。本文主要介紹X-Engine引擎的一個(gè)核心功能,OnlineDDL

OnlineDDL毫無疑問是MySQL生態(tài)的一個(gè)重要的功能,想當(dāng)初MySQL 5.6以前,DBA執(zhí)行DDL變更時(shí),為了保證7*24小時(shí)服務(wù),只能采用最老土的主備切換的方式來進(jìn)行。數(shù)據(jù)庫存儲(chǔ)引擎區(qū)別于NoSQL引擎的一種重要指標(biāo)就是是否支持SQL,是否有schema(數(shù)據(jù)字典)。有了schema,還需靈活地支持在線變更,這樣才能從容應(yīng)對(duì)業(yè)務(wù)快速變化的需求。MySQL生態(tài)中這么多存儲(chǔ)引擎只有InnoDB完整地支持了OnlineDDL,X-Engine作為MySQL生態(tài)的新成員,雖然采用了完全不同于InnoDB的存儲(chǔ)架構(gòu),但OnlineDDL給用戶的體驗(yàn)是一樣的 。

整體流程

X-Engine采用類LSM的分層架構(gòu),數(shù)據(jù)按照時(shí)序邏輯分成多層,每一層數(shù)據(jù)有序,新數(shù)據(jù)在較高的層次,最老的歷史數(shù)據(jù)在最底層。對(duì)于X-Engine來說,每個(gè)主表和二級(jí)索引數(shù)據(jù)都是一棵分層的LSM-tree結(jié)構(gòu),內(nèi)部稱之為Subtable。每個(gè)Subtable分為4層,Memtable,L0,L1和L2,每一層都保持有序,數(shù)據(jù)按新舊順序依次往更深的層次遷移,其中Memtable在內(nèi)存中,其它幾層按需可以在不同的存儲(chǔ)介質(zhì)上。OnlineDDL功能實(shí)現(xiàn)充分利用了X-Engine的數(shù)據(jù)組織特點(diǎn),將新build數(shù)據(jù)分為兩部分,基線數(shù)據(jù)和增量數(shù)據(jù)。基線數(shù)據(jù)是指變更開始時(shí),通過拿snapshot能遍歷得到的數(shù)據(jù);增量數(shù)據(jù)是指,變更開始后,用戶寫入的新數(shù)據(jù)。拿Snapshot過程需要短時(shí)間禁寫,因?yàn)槲覀儚?qiáng)依賴這個(gè)一致性位點(diǎn),確?;€+增量數(shù)據(jù)的完整性。

OnlineDDL總共包括了4個(gè)階段,包括Prepare階段,Inplace-build階段,Commit階段和Post-ddl階段。

1、Prepare階段,這個(gè)階段主要是準(zhǔn)備數(shù)據(jù)字典,構(gòu)建底層存儲(chǔ)數(shù)據(jù)的Subtable,為后續(xù)的增量寫入做準(zhǔn)備。

2、 Inplace-build階段,這個(gè)階段OnlineDDL的核心階段,一方面通過Snapshot獲取基線,另一方面還需要實(shí)時(shí)維護(hù)增量數(shù)據(jù),利用X-Engine的數(shù)據(jù)組織的append-only特性,將基線和增量合并,即完成了OnlineDDL新數(shù)據(jù)構(gòu)建的過程。這個(gè)過程的詳細(xì)邏輯會(huì)在下一個(gè)小節(jié)詳細(xì)介紹。

3.、Commit階段,這個(gè)階段是OnlineDDL引擎層變更生效階段,如果整個(gè)OnlineDDL過程中沒有出現(xiàn)異?;蝈e(cuò)誤,那么Commit階段會(huì)生效新的數(shù)據(jù)字典,生效新的數(shù)據(jù)。
4、 Post-ddl階段,這個(gè)階段是OnlineDDL真正生效階段,這個(gè)階段完成后,才會(huì)返回給用戶DDL成功。這個(gè)階段的引入,主要是因?yàn)镸ySQL通過Server層+引擎層這樣的一個(gè)二層結(jié)構(gòu)實(shí)現(xiàn)擴(kuò)展,而每一層都有自己的數(shù)據(jù)字典,在Commit階段只能保證引擎層的數(shù)據(jù)和數(shù)據(jù)字典是完整的,為了保證DDL變更的原子性(Server層和引擎層數(shù)據(jù)字典保持一致),引入Post-ddl階段做清理和善后工作,有關(guān)DDL原子性的討論會(huì)在下面的章節(jié)詳細(xì)介紹。

核心邏輯

OnlineDDL的核心邏輯在于如何做到執(zhí)行DDL變更時(shí),不堵塞用戶對(duì)該表的DML和SELECT操作。X-Engine實(shí)現(xiàn)OnlineDDL有兩個(gè)關(guān)鍵點(diǎn),第1,利用X-Engine的數(shù)據(jù)組織append-only特點(diǎn),增量維護(hù)在Memtable,L0,L1中,而基線數(shù)據(jù)維護(hù)在L2中;第2,維護(hù)增量時(shí),采用雙寫,同時(shí)維護(hù)old-table和new-table中的數(shù)據(jù)。與InnoDB引擎類似,根據(jù)DDL是否涉及到數(shù)據(jù)記錄格式變更,將DDL變更分為Inplace-rebuild和Inplace-norebuild兩種類型。對(duì)于X-Engine來說,兩者本質(zhì)是一樣的,區(qū)別在于維護(hù)的索引個(gè)數(shù)。Inplace-rebuild類型的DDL需要同時(shí)維護(hù)new-table中所有索引;而Inplace-norebuild類型的DDL只需要維護(hù)new-table的新增的索引。

整個(gè)Inplace-Build按照時(shí)間序有3個(gè)關(guān)鍵節(jié)點(diǎn),t0時(shí)刻是獲取快照的時(shí)間點(diǎn),t1時(shí)刻是build基線完成的時(shí)間點(diǎn),t2時(shí)刻是唯一約束檢查完成的時(shí)間點(diǎn)。那么兩個(gè)階段的主要邏輯如下:t0-->t1主要工作是在build新表的基線,通過將old-table的數(shù)據(jù)結(jié)合new-table的數(shù)據(jù)字典生成新的記錄,最終寫入新表對(duì)應(yīng)的L2層;在build新表基線的過程中,產(chǎn)生的增量寫入到新表的(Mem,L0,L1)。DDL過程中,需要對(duì)后臺(tái)的Compaction任務(wù)做一定的控制,確保不執(zhí)行合并到L2的Compaction任務(wù)。t1-->t2是唯一性校驗(yàn)階段,確保新增的主鍵或者唯一索引的唯一性,t2時(shí)刻將(Mem,L0,L1,L2)中的數(shù)據(jù)合并,最終得到new-table的全量數(shù)據(jù)。記錄轉(zhuǎn)換的過程如下:
其中,DDL事務(wù)表示DDL線程,它的任務(wù)是掃描基線,生成新表的基線數(shù)據(jù);DML事務(wù)表示DDL過程中,并發(fā)的DML事務(wù),它們的任務(wù)是,通過雙寫機(jī)制同時(shí)維護(hù)新表和老表的增量。

對(duì)比InnoDB實(shí)現(xiàn)邏輯

雖然X-Engine與InnoDB的OnlineDDL都是采用基線+增量的方式實(shí)現(xiàn),但具體邏輯是不同的,主要是因?yàn)镮nnoDB采用的的是原地更新操作并且通過row-log機(jī)制來維護(hù)增量,而X-Engine是一個(gè)append-only的存儲(chǔ)引擎,天然地支持?jǐn)?shù)據(jù)的多版本存儲(chǔ),可以實(shí)時(shí)維護(hù)增量數(shù)據(jù),在基線建立完成后只需要將基線與增量數(shù)據(jù)合并,即使基線中的數(shù)據(jù)在增量中被修改,但增量中數(shù)據(jù)的版本比基線數(shù)據(jù)版本更新,從而在合并時(shí)會(huì)覆蓋基線中老版本的數(shù)據(jù)。下圖是InnoDB引擎OnlineDDL過程。

可以看到InnoDB引擎的OnlineDDL也包括3個(gè)關(guān)鍵時(shí)間點(diǎn),與X-Engine引擎的區(qū)別在于,t1-->t2 是InnoDB追row-log過程,而對(duì)應(yīng)X-Engine是唯一約束檢查的過程。當(dāng)然對(duì)于X-Engine來說,t1-->t2不是必需的,因?yàn)镈DL變更可能并不涉及唯一索引操作。

Instant-DDL

與MySQL8.0(InnoDB)類似,X-Engine同樣也支持Instant-DDL。在所有支持的OnlineDDL中,若DDL操作只涉及修改表的屬性信息,或只是做了加列操作,不需要修改記錄格式,也不需要新增索引,那么這些OnlineDDL操作可以優(yōu)化成Instant-DDL。這些DDL操作可以“極速”完成,用戶基本無感知。由于Instant-DDL執(zhí)行時(shí),并沒有真正涉及引擎數(shù)據(jù)的修改,為了后續(xù)查詢結(jié)果和DDL操作的正確性,需要對(duì)于引擎的記錄格式做一定的調(diào)整,加一些控制元信息。新增一個(gè)1字節(jié)來標(biāo)示生成這個(gè)記錄時(shí),表是否執(zhí)行過instant-ddl。同時(shí),生成記錄時(shí),還需要記錄有多少個(gè)列是已有的,以及有多少個(gè)null列等;在讀取解析記錄時(shí),根據(jù)字典信息,就能知道有多少個(gè)列是需要根據(jù)instant列信息來補(bǔ)充,確保instant-DDL后,返回查詢結(jié)果的正確性。

DDL原子性保證

從OnlineDDL的整體流程中我們了解到,OnlineDDL最后一個(gè)階段是Post-ddl階段。MySQL8.0以前,Server層的元數(shù)據(jù)都是通過文件來存儲(chǔ),比如frm文件,par文件以及trg文件等。一個(gè)DDL操作修改,涉及到文件修改,引擎數(shù)據(jù)修改以及引擎字典的修改,這些操作無法做成一個(gè)事務(wù),必然導(dǎo)致整個(gè)DDL操作無法做到原子性。若DDL過程中出現(xiàn)異常,就可能會(huì)導(dǎo)致Server層和引擎層數(shù)據(jù)不一致,以及殘余的垃圾沒有清理等問題。MySQL8.0將Server層的所有字典信息統(tǒng)一存儲(chǔ)在DD(DataDictionary)中,并且通過InnoDB引擎存儲(chǔ),那么DDL過程中,我們只要保證Server層數(shù)據(jù)字典的修改,以及引擎層數(shù)據(jù)字典的修改封裝成一個(gè)事務(wù)即可。

對(duì)于InnoDB引擎而言,DD數(shù)據(jù)字典操作,InnoDB引擎數(shù)據(jù)字典操作都是通過InnoDB引擎存儲(chǔ),通過InnoDB事務(wù)特征來保證原子性。對(duì)于X-Engine引擎而言,DD數(shù)據(jù)字典操作,X-Engine引擎數(shù)據(jù)字典操作分別采用InnoDB引擎和X-Engine引擎,除了依賴于InnoDB和X-Engine自身是事務(wù)引擎特征,還需要借助于內(nèi)部的2PC協(xié)議來保證整個(gè)事務(wù)的原子性。如果MySQL開啟了binlog,那么就是binlog,X-Engine,InnoDB三者一起通過2PC協(xié)議保證事務(wù)的原子性。而Post-ddl階段就是做善后和清理工作,如果最終整個(gè)事務(wù)提交,Post-ddl階段負(fù)責(zé)真正清理old-table數(shù)據(jù);如果最終整個(gè)事務(wù)回滾,那么Post-ddl階段負(fù)責(zé)清理臨時(shí)產(chǎn)生的new-table數(shù)據(jù),確保DDL變更前后,數(shù)據(jù)庫的狀態(tài)是一致的。

使用體驗(yàn)

X-Engine作為MySQL的一個(gè)新引擎,在語法使用層面完全與MySQL(InnoDB)相同,通過algorithm_option指定Online類型,通過lock_option指定DDL過程中,是否允許其它并發(fā)的DML和SELECT操作。通常情況下,這兩個(gè)選項(xiàng)都不用特別指定,采用默認(rèn)值即可,MySQL內(nèi)部會(huì)優(yōu)先選擇Instant類型和Inplace類型,對(duì)于不支持Online的DDL操作,選擇Copy類型。在功能層面也與MySQL(InnoDB)相同,目前X-Engine暫時(shí)還不支持全文索引,虛擬列,外鍵等功能,因此與這些功能相關(guān)的DDL操作會(huì)不支持,其它DDL操作與MySQL(InnoDB)相同。常用的DDL操作分類如下:

后續(xù)工作

X-Engine作為一個(gè)新的數(shù)據(jù)庫存儲(chǔ)引擎,通過集團(tuán)業(yè)務(wù)場(chǎng)景的打磨,已經(jīng)體現(xiàn)了它的價(jià)值,我們希望通過云上RDS場(chǎng)景,讓更多用戶享受到新技術(shù)帶來的紅利。當(dāng)然,目前X-Engine還有一些不足,尤其是相對(duì)于傳統(tǒng)成熟的MySQL(InnoDB)和Oracle,所以X-Engine引擎在優(yōu)化自身的穩(wěn)定性和性能同時(shí),會(huì)持續(xù)不斷地豐富數(shù)據(jù)庫功能,包括支持外鍵,全文索引,虛擬列等。除了公有云的RDS輸出,基于X-Engine的一體化分布式數(shù)據(jù)庫PolarDB-X也是一個(gè)重要方向,我們會(huì)以專有云形式輸出,服務(wù)更多對(duì)分布式數(shù)據(jù)庫有強(qiáng)需求的用戶。

總結(jié)

以上是生活随笔為你收集整理的揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。