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 強同步方案在效能上優於其他主流同步方案,具體資料詳情可參見 強同步效能對比資料。主要特點如下:
一致性的同步複製,保證節點間資料強一致性。
對業務層面完全透明,業務層面無需做讀寫分離或同步強化工作。
將串行同步執行緒非同步化,引入執行緒池能力,大幅度提高效能。
支援叢集架構。
支援自動成員控制,故障節點自動從叢集中移除。
支援自動節點加入,無需人工干預。
每個節點都包含完整的資料副本,可以隨時切換。
無需共享儲存裝置。