TDSQL MySQL版(TDSQL for MySQL)是部署在騰訊雲上的一種支持自動水平拆分、Shared Nothing 架構的分布式數據庫。TDSQL MySQL版 即業務獲取的是完整的邏輯庫表,而后端會將庫表均勻的拆分到多個物理分片節點。
水平分表
概述
水平拆分方案是 TDSQL MySQL版 的基礎原理,它的每個節點都參與計算和數據存儲,且每個節點都僅計算和存儲一部分數據。因此,無論業務的規模如何增長,我們僅需要在分布式集群中不斷的添加設備,用新設備去應對增長的計算和存儲需要即可。
通過如下視頻,您可以了解水平拆分的過程與原理:https://cloud.tencent.com/document/product/557/10521
水平切分
水平切分(分表):是按照某種規則,將一個表的數據分散到多個物理獨立的數據庫服務器中,形成“獨立”的數據庫“分片”。多個分片共同組成一個邏輯完整的數據庫實例。
常規的單機數據庫中,一張完整的表僅在一個物理存儲設備上讀寫。
分布式數據庫中,根據在建表時設定的分表鍵,系統將根據不同分表鍵自動分布到不同的物理分片中,但邏輯上仍然是一張完整的表。
在 TDSQL MySQL版 中,數據的切分通常就需要找到一個分表鍵(shardkey)以確定拆分維度,再采用某個字段求模(HASH)的方案進行分表,而計算 HASH 的某個字段就是 shardkey。 HASH 算法能夠基本保證數據相對均勻地分散在不同的物理設備中。
寫入數據( SQL 語句含有 shardkey )
- 業務寫入一行數據。
- 網關通過對 shardkey 進行 hash。
- 不同的 hash 值范圍對應不同的分片(調度系統預先分片的算法決定)。
- 數據根據分片算法,將數據存入實際對應的分片中。
數據聚合
數據聚合:如果一個查詢 SQL 語句的數據涉及到多個分表,此時 SQL 會被路由到多個分表執行,TDSQL MySQL版 會將各個分表返回的數據按照原始 SQL 語義進行合並,並將最終結果返回給用戶。
注意:
執行 SELECT 語句時,建議您在 where 條件帶上 shardKey 字段,否則會導致數據需要全表掃描然后網關才對執行結果進行聚合。全表掃描響應較慢,對性能影響很大。
讀取數據(有明確 shardkey 值)
- 業務發送 select 請求中含有 shardkey 時,網關通過對 shardkey 進行 hash。
- 不同的 hash 值范圍對應不同的分片。
- 數據根據分片算法,將數據從對應的分片中取出。
讀取數據(無明確 shardkey 值)
- 業務發送 select 請求沒有 shardkey 時,將請求發往所有分片。
- 各個分片查詢自身內容,發回 Proxy 。
- Proxy 根據 SQL 規則,對數據進行聚合,再答復給網關。
讀寫分離
功能簡介
當處理大數據量讀請求的壓力大、要求高時,可以通過讀寫分離功能將讀的壓力分布到各個從節點上。
TDSQL MySQL版 默認支持讀寫分離功能,架構中的每個從機都能支持只讀能力,如果配置有多個從機,將由網關集群(TProxy)自動分配到低負載從機上,以支撐大型應用程序的讀取流量。
基本原理
讀寫分離基本的原理是讓主節點(Master)處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),讓從節點(Slave)處理查詢操作(SELECT)。
只讀賬號
只讀帳號是一類僅有讀權限的帳號,默認從數據庫集群中的從機(或只讀實例)中讀取數據。
通過只讀帳號,對讀請求自動發送到備機,並返回結果。
彈性擴展
概述
TDSQL MySQL版 支持在線實時擴容,擴容方式分為新增分片和現有分片擴容兩種方式,整個擴容過程對業務完全透明,無需業務停機。擴容時僅部分分片存在秒級的只讀或中斷,整個集群不會受影響。
擴容過程
TDSQL MySQL版 主要是采用自研的自動再均衡技術保證自動化的擴容和穩定。
新增分片擴容
- 在 TDSQL MySQL版控制台 對需要擴容的 A 節點進行擴容操作。
- 根據新加 G 節點配置,將 A 節點部分數據搬遷(從備機)到 G 節點。
- 數據完全同步后,A、G 節點校驗數據庫,存在一至幾十秒的只讀,但整個服務不會停止。
- 調度通知 proxy 切換路由。
現有分片擴容
基於現有分片的擴容相當於更換了一塊更大容量的物理分片。
說明:
基於現有分片的擴容沒有增加分片,不會改變划分分片的邏輯規則和分片數量。
- 按需要升級的配置分配一個新的物理分片(以下簡稱新分片)。
- 將需要升級的物理分片(以下簡稱老分片)的數據、配置等同步數據到新分片中。
- 同步數據完成后,在騰訊雲網關做路由切換,切換到新分片繼續使用。
相關操作
分布式數據庫由多個分片組成,如您需要將現有 TDSQL MySQL版 實例的規格升級到更高規格,請參見 升級實例。
強同步
背景
傳統數據復制方式有如下三種:
- 異步復制:應用發起更新請求,主節點(Master) 完成相應操作后立即響應應用,Master 向從節點(Slave)異步復制數據。
- 強同步復制:應用發起更新請求,Master 完成操作后向 Slave 復制數據,Slave 接收到數據后向 Master 返回成功信息,Master 接到 Slave 的反饋后再應答給應用。Master 向 Slave 復制數據是同步進行的。
- 半同步復制:應用發起更新請求,Master 在執行完更新操作后立即向 Slave 復制數據,Slave 接收到數據並寫到 relay log 中(無需執行) 后才向 Master 返回成功信息,Master 必須在接受到 Slave 的成功信息后再向應用程序返回響應。
存在問題
當 Master 或 Slave 不可用時,以上三種傳統數據復制方式均有幾率引起數據不一致。
數據庫作為系統數據存儲和服務的核心能力,其可用性要求非常高。在生產系統中,通常都需要用高可用方案來保證系統不間斷運行,而數據同步技術是數據庫高可用方案的基礎。
解決方案
MAR 強同步復制方案是騰訊自主研發的基於 MySQL 協議的並行多線程強同步復制方案,只有當備機數據完全同步(日志)后,才由主機給予應用事務應答,保障數據正確安全。
原理示意圖如下:
在應用層發起請求時,只有當從節點(Slave)返回信息成功后,主節點(Master)才向應用層應答請求成功,以確保主從節點數據完全一致。
MAR 強同步方案在性能上優於其他主流同步方案,具體數據詳情可參見 強同步性能對比數據。主要特點如下:
一致性的同步復制,保證節點間數據強一致性。
對業務層面完全透明,業務層面無需做讀寫分離或同步強化工作。
將串行同步線程異步化,引入線程池能力,大幅度提高性能。
支持集群架構。
支持自動成員控制,故障節點自動從集群中移除。
支持自動節點加入,無需人工干預。
每個節點都包含完整的數據副本,可以隨時切換。
無需共享存儲設備。