腾讯数据库内核团队资深架构师:TXSQL Internals @2018
在ODF2018開源數據庫論壇暨首屆MariaDB中國用戶者大會上,來自騰訊技術工程事業群TEG基礎架構部數據庫內核團隊資深架構師王少華,做了主題為「TXSQL Internals@2018」的分享。
我們同步了嘉賓現場沙龍分享視頻,請點擊下方「騰訊技術課小程序」卡片即可查看:
同時附上整理好的演講稿:
CDB作為公司規模最大的關系型數據庫服務平臺,為公司內部業務和騰訊云提供native MySQL服務。從最初重點支持社交、游戲等場景業務,到今天覆蓋了游戲、移動互聯網和金融等全場景業務,CDB在架構、基礎管控平臺和垂直行業服務等維度不斷的演進和升華。
在CDB一次次業務和技術突破的背后,CDB的內核:Tencent MySQL(TXSQL)宛如威力巨大的核彈頭,擊潰來犯的性能、功能和穩定性等各種高難度挑戰。
本次分享將圍繞性能優化、企業級特性和線上穩定性等多個維度,結合云上數據庫特征,和您一起來探討TXSQL如何支撐全場景業務。
王少華,現為TEG基礎架構部數據庫內核團隊資深架構師,負責TXSQL技術架構與核心開發。
2007年華中科技大學數據庫所研究生畢業后,先后在達夢,Teradata,Oracle等公司從事數據庫內核研發,專注于數據庫10+年。其中在Oracle MySQL全球研發團隊工作4+年,作為InnoDB核心成員,設計和開發了批量建立索引,數據緩沖區mutex分拆,全文索引插件支持,SKIP LOCKED/NO WAIT以及8.0中DDL的原子性等重要功能。
一、TXSQL的介紹?
騰訊云是中國領先的云服務提供商,QQ和微信兩大即時通訊工具都是騰訊云的客戶,騰訊云為QQ和微信提供計算,存儲,數據庫以及安全等等服務。目前,騰訊云被來自各行各行業的超過1百萬開發者所信賴。
CDB是Cloud Database的簡稱,是騰訊云上提供的關系數據庫服務。CDB提供了關系數據庫服務,實現了全平臺管控和用戶0運維,提供了良好的應用兼容性,以及對多數據庫存儲引擎的支持。
目前,CDB在騰訊云和公司內部廣泛使用,已經成為國內TOP的MySQL集群服務。
在騰訊云上,主要服務于游戲、互聯網和金融等數以萬計的外部企業客戶;在公司內部,CDB對SNG、CDG、OMG和IEG等很多內部業務場景進行了支撐。
CDB是整個數據庫云服務的平臺,而TXSQL則是這個平臺里的數據庫內核,提供數據庫引擎和復制這兩個核心功能。TXSQL是TengXun MySQL的簡稱,也叫Tecent MySQL,是由TEG基礎架構部維護的MySQL分支。
TXSQL是基于ORACLE官方的MySQL內核版本進行深度定制。在可用性,性能優化,企業級特性等等方面進行了很大的改進和提升。
二、TXSQL可用性
異步刪除表
在運維過程中,當用戶刪除一個大表時,如果文件特別大,比如2G。在刪除這個大文件的過程中,文件系統IO達到峰值,持續1-2秒,這樣會導致文件系統無法響應其他數據庫實例的IO請求,對上層應用表現為數據庫無發響應。在有些業務中,如果有2秒數據庫沒有響應,就是很嚴重的事故。為了讓刪除大文件的IO更平滑,我們實現了這個異步刪除表的功能。
基本原理如下:
1. 刪除文件時,將數據文件重命名為一個臨時文件;
2. 后臺每隔一段時間,將文件截斷固定的大小,如128M;
3. 當文件足夠小的時候,刪除之。
修改表結構DDL的NO_WAIT和WAIT選項
在運維中,經常需要在線修改表的結構。這個操作有時會因為一些增刪改查操作占用Metadata Lock(MDL)鎖的時間較長而被阻塞。為了避免這種情況,我們在修改表結構的DDL語句中增加了NO_WAIT和WAIT選項。當使用NO_WAIT選項時,如果DDL語句無法立刻獲取到MDL鎖,則返回失敗;當使用WAIT [n] 選項時,如果DDL語句在等待MDL鎖n秒后依然無法獲得鎖,則返回失敗。
目前支持的DDL語句如下:
ALTER TABLE
DROP TABLE
TRUNCATE TABLE
OPTIMIZE TABLE
RENAME TABBLE
CREATE INDEX
CREATE FULLTEXT INDEX
CREATE SPATITAL INDEX
DROP INDEX
Information schema中metadata lock信息視圖
MySQL中通過information schema或者performance schema可以獲取到很多系統內部的監控和狀態信息。可是無法獲得metadata lock的信息,導致運維過程中進行系統診斷非常不便。有了該視圖之后,就很方便的了解到MDL鎖相關的占用和等待等信息。
三、TXSQL優化特性?
下面講從復制,優化器和存儲引擎三個方面來講一下TXSQL所做的優化特性。
復制優化主要有三條:
1. Slave中鎖拆分
2. Slave中IO優化
3. 并行復制
Slave鎖拆分
Slave中有一個mutex叫Lock_log,是用來同步SQL線程和IO線程對binlog文件的訪問。在圖中藍線可以看到,隨著系統壓力變大,SQL線程的吞吐量直線降低(注:用更新行衡量),導致主從延遲逐漸拉大。主要原因是Lock_log被IO thread的占用量變大。
實際上,SQL線程和IO線程只有在訪問同一個binlog文件,而且文件偏移重疊的情況下才會有沖突。因此在大多數情況下,兩個線程不沖突。為了解決這問題,我們對Lock_log mutex進行了拆分。如圖橙線可以看到SQL 線程的吞吐量非常穩定。
Slave IO優化
通常IO線程在收到一個event之后,會寫入到binlog,并sync到磁盤中。由于sync操作代價很高,所以IO線程的吞吐量很容易到瓶頸(如圖藍線所示)。為了減小sync的次數,我們對event進行緩存,當收到一個事務(transaction)的所有event之后,一并寫入binlog,再sync到磁盤中。
如圖橙線所示,吞吐量得到了很大的提升(>50%)。
并行復制
在MySQL 5.6的版本中,首次引入了并行復制功能。系統架構是由SQL線程來進行binlog的解析以及任務的分發和同步,多個工作線程來執行任務。SQL線程是基于庫(database)來進行分發的,也就是說不同數據庫的事務是并發執行的。
但是在線上環境中,很多用戶往往只有一個庫,按庫的并行復制和單線程復制效果一樣。因此,我們開發了按表(table)的分發算法,即不同表的事務由不同的工作線程來執行。在我們的性能測試中,按表的測試效果和按logic clock不相上下。
查詢優化
在應用中,分頁操作以及聚集操作如sum,count是非常常見的。可是在大數據量的條件下,這些查詢效率不夠高,或者有時候非常差。為了解決這個問題,我們將這些操作下推到存儲引擎執行,極大地提高了查詢執行效率。
原因有兩個:
其一避免了server層和存儲引擎層的過多的交互和函數調用;
其二避免了行數據格式在server層和存儲引擎層的轉換。
InnoDB存儲引擎的read view優化
我們對事務系統做了深度的優化,包括mutex,read view等方面,并且取得了不錯的效果。如圖中藍線所示,隨著并發的增大,寫性能一直很穩定。
經過優化后,橙線所示,寫性能得到大幅提升,達2倍之多。
四、TXSQL企業特性
TXSQL企業級特性
TXSQL審計功能
審計功能是一個很重要的企業級特性,在線上用戶也有強烈的需求。而MySQL社區版本不提供審計功能,只提供了審計插件的接口。因為我們在TXSQL中開發了獨立的審計插件。
在審計插件中,審計記錄首先寫入緩沖區中,由一個flush線程負責將緩沖區中的記錄寫到磁盤的審計文件里。在一臺物理機上,有一個審計代理,負責將審計文件中的記錄讀取并發送到后臺存儲,后臺存儲則是CTSDB集群。CTSDB是騰訊云上提供的時序數據庫服務,擁有強大的查詢性能和壓縮功能。
在當前架構下,審計功能開啟后對性能的影響能低至5%。
TXSQL加密功能
MySQL社區版本提供透明加密功能(Transparent Data Encryption),密鑰在keyring里面。目前只提供keyring_file插件,即密碼保存在本地文件中,而且是明文。商業版本中則提供keyring_okv插件,與Oracle Key Vault工具進行了深度集成。
TXSQL與騰訊云平臺的KMS和CAM進行集成,開發了keyring_kms插件。密鑰在騰訊提供的密鑰管理服務中保護,安全可靠。
TXSQL線程池
TXSQL線程池功能吸收了其他開源社區如percona等的一些優點,并解決了其中一些痛點。比如在percona版本中存在的由于持有鎖的低優先級事務餓死導致的死鎖問題。
在調度算法上,如果持有鎖的低優先級事務與高優先級事務可以獲得同等的調度機會,從而避免死鎖。
通過上圖可以看到,在并發線程大于500時,開啟線程池功能,性能更好更穩定。
五、TXSQL未來發展方向:
1. AI和查詢的結合,開發更智能的查詢優化器;
2. 分布式數據庫;
3. 新硬件支持,尤其是非易逝性內存,如NVMe;
4. 存儲和計算分離的結構。
總結
以上是生活随笔為你收集整理的腾讯数据库内核团队资深架构师:TXSQL Internals @2018的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯AI Lab宣布将于9月底开源“Te
- 下一篇: 大牛书单 | 数据库专题好书分享