全部產品
Search
文件中心

PolarDB:AUTO模式資料庫與DRDS模式資料庫

更新時間:Jul 06, 2024

本文介紹了什麼是AUTO模式資料庫與DRDS模式資料庫,以及這兩者模式的區別。

PolarDB-X資料庫模式概述

PolarDB-X 5.4.13版本開始,新增支援AUTO模式的資料庫(也稱為自動分區資料庫)。AUTO模式的資料庫支援自動分區,即建立表時無需指定分區鍵,資料即可自動在叢集內均勻分布;同時也支援使用標準的MySQL分區表文法,對錶進行手動分區。可以讓您便捷地享受到分散式資料庫的透明式分布、Auto Scaling和分區管理等諸多紅利。

PolarDB-X 5.4.13版本之前的資料庫稱為DRDS模式的資料庫。這種模式的資料庫不支援自動分區,建立表時需使用DRDS專用的分庫分表文法,指定分庫分表鍵,否則建立的是一張單表。

AUTO模式資料庫和DRDS模式資料庫在5.4.13及以上版本都支援,並且可以共存在一個執行個體中。

注意事項

  • 建立AUTO模式資料庫必須在CREATE DATABASE文法中顯式指定MODE='AUTO'

  • 如果在CREATE DATABASE文法中不指定MODE參數的值,預設建立DRDS模式的資料庫。

  • AUTO模式資料庫下不支援使用DRDS分庫分表的文法建立表,僅支援建立分區表。

  • DRDS模式資料庫下不支援使用分區表的文法建立表,僅支援建立分庫分表。

  • 標準版叢集不支援建立AUTO模式資料庫。

通過MODE參數指定資料庫模式

PolarDB-X在建立資料庫時引入了MODE參數,以決定建立的資料庫是AUTO模式還是DRDS模式。關於MODE參數的作用及其描述,如下表所示:

說明

資料庫建立完成後,MODE不允許修改。

參數

取實值型別

作用

建庫文法

建表文法

MODE

'AUTO'

建立的資料庫為AUTO模式。

樣本:

CREATE DATABASE auto_db MODE='AUTO';

詳情請參見CREATE DATABASE

AUTO模式資料庫下建立的表稱為分區表,採用MySQL標準文法,詳情請參見MySQL分區表文法

'DRDS'(預設值)

說明

若不指定MODE參數,則預設建立DRDS模式資料庫。

建立的資料庫為DRDS模式。

樣本:

  • CREATE DATABASE drds_db MODE='DRDS';
  • CREATE DATABASE drds_db;

詳情請參見CREATE DATABASE

DRDS模式資料庫下建立的表稱為分庫分表,詳情請參見DRDS分庫分表文法

自動分區與手動分區

自動分區

自動分區,指建立表時不指定任何分區定義(如分區鍵、分區策略等),PolarDB-X能夠自動選擇分區鍵並對錶及其索引進行水平資料分割的功能。AUTO模式資料庫支援自動分區,而DRDS模式資料庫不支援。

樣本如下:

使用標準的MySQL文法建立tb表,文法上不包含任何分區定義:

CREATE TABLE tb(a INT, b INT, PRIMARY KEY(a));
  • 上述DDL在DRDS模式資料庫中建立出來的表是一張單表:

    執行SHOW語句,查看完整建表語句:

    SHOW FULL CREATE TABLE tb \G
    *************************** 1. row ***************************
           Table: tb
    Create Table: CREATE TABLE `tb` (
        `a` int(11) NOT NULL,
        `b` int(11) DEFAULT NULL,
        PRIMARY KEY (`a`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
    1 row in set (0.02 sec)
  • 上述DDL在AUTO模式資料庫建來的表將是一分區表:執行SHOW語句,查看完整建表語句:

    SHOW FULL CREATE TABLE tb \G
    *************************** 1. row ***************************
           TABLE: tb
    CREATE TABLE: CREATE PARTITION TABLE `tb` (
        `a` int(11) NOT NULL,
        `b` int(11) DEFAULT NULL,
        PRIMARY KEY (`a`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
    PARTITION BY KEY(`a`)
    PARTITIONS 16
    1 row in set (0.01 sec)

因此,在AUTO模式資料庫下,只需要使用標準的MySQL建表文法(包括建索引文法等)建立表,PolarDB-X的自動資料分割函數可以讓應用便捷地享受到分散式資料庫所帶來的Auto Scaling、分區管理等諸多紅利。

手動分區

手動分區,即建立表時顯式指定分區定義(如分區鍵、分區策略等)。AUTO模式資料庫與DRDS模式資料庫採用手動分區時的建表文法不同。

  • AUTO模式資料庫:建立表使用標準的MySQL分區表文法,並支援HASH、RANGE、LIST等多種分區策略。

    如下樣本,建立tb表時使用PARTITION BY HASH(a)文法,指定了分區鍵a列及HASH的分區策略:

    CREATE TABLE tb (a INT, b INT, PRIMARY KEY(a))
        -> PARTITION by HASH(a) PARTITIONS 4;
    Query OK, 0 rows affected (0.83 sec)
    
    SHOW FULL CREATE TABLE tb\G
    *************************** 1. row ***************************
           TABLE: tb
    CREATE TABLE: CREATE TABLE `tb` (
        `a` int(11) NOT NULL,
        `b` int(11) DEFAULT NULL,
        PRIMARY KEY (`a`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
    PARTITION BY KEY(`a`)
    PARTITIONS 4
    1 row in set (0.02 sec)
  • DRDS模式資料庫:建立表使用DRDS專用的分庫分表文法,僅支援使用HASH策略。

    如下樣本,建立tb表時使用DBPARTITION BY HASH(a) TBPARTITION BY HASH(a)文法,指定分庫分表鍵為a列:

    CREATE TABLE tb (a INT, b INT, PRIMARY KEY(a))
        -> DBPARTITION by HASH(a)
        -> TBPARTITION by HASH(a)
        -> TBPARTITIONS 4;
    Query OK, 0 rows affected (1.16 sec)
    
    SHOW FULL CREATE TABLE tb\G
    *************************** 1. row ***************************
           Table: tb
    Create Table: CREATE TABLE `tb` (
        `a` int(11) NOT NULL,
        `b` int(11) DEFAULT NULL,
        PRIMARY KEY (`a`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`a`) tbpartition by hash(`a`) tbpartitions 4
    1 row in set (0.02 sec)

分區表和分庫分表的路由演算法對比

分區表與分庫分表最重要的區別,是它們的分區會使用完全不同的路由演算法。

  • 分庫分表的路由演算法是HASH值按物理分表數目模數,如果要變更分區數目(例如分表數目由4個變成5個),所有資料都需要進行rehash,因此,DRDS模式的分庫分表無法提供分區級的變更能力;

  • 分區表的預設路由演算法是基於range的一致性HASH演算法,這種演算法天然支援通過分裂、合併作業等變更分區,並且無須rehash所有資料,因此,AUTO模式的分區表具備分區級的變更能力。

功能對比

與DRDS模式資料庫相比,AUTO模式資料庫新增了自動分區、熱點分裂、分區調度和TTL表等新特性,並在很多其它方面(如分區管理、拆分變更等)做了大量工作以最佳化分布式體驗。

AUTO模式資料庫與DRDS模式資料庫主要功能對比:

功能項

AUTO模式資料庫

DRDS模式資料庫

透明分布式

預設主鍵分區

支援。若建表時不指定分區定義,將自動按主鍵進行分區。

不支援。

預設全域二級索引

支援。索引不指定分區列時,將自動索引列分區。

不支援。

負載平衡調度

支援。

不支援。

熱點散列能力

支援。

不支援。

分區策略

Hash分區 & Key分區

支援。採用一致性雜湊的路由演算法,並支援熱點散列。

支援採用按分區數模數的路由演算法,不支援熱點散列。

Range分區 & Range Columns分區

支援,支援熱點散列。

不支援。

List分區 & List Columns分區

支援。

不支援。

向量分區鍵(使用多個列作為分區鍵)

支援。分區鍵支援按向量分區,例如PARTITION BY KEY(c1,c2,c3)

不支援。

分區鍵字元校正集

支援。

不支援。

單表 & 廣播表

支援。

支援。

分區管理

建立、刪除、修改分區

支援。

不支援。

分裂、合并分區

支援。

不支援。

遷移分區

支援。

不支援。

截斷分區

支援。

不支援。

分區透視

即將上線將支援自動分析熱點分區。

不支援。

拆分變更

調整表類型(單表、廣播表與分區表互轉)

支援。

支援。

調整分區定義(包括分區數目、分區鍵類型、分區策略等)

支援。

支援。

彈性擴(縮)容

是否有停寫階段

否。

是(短暫的停寫)。

是否允許其他DDL

是。

否。

Locality

靜態隔離

支援,建立庫、表和分區時指定實體儲存體資源。

支援,建立庫、表時指定實體儲存體資源。

動態隔離

支援,動態調整庫表所在的實體儲存體資源。

不支援。

是否與擴縮容相容

是。

否。

分區裁剪

首碼分區裁剪

支援。

例如,按PARTITION BY KEY(a,b,c)進行分區,向量分區鍵使用a、b、c這3個列。那麼a=100 and b=100或a=100都能命中分區裁剪。

不支援。

計算運算式常量摺疊

支援。

例如,對含計算運算式的條件pk = POW(2, 4)進行分區裁剪。

不支援。分區鍵條件要求必須是常量(如pk = 123);如果分區鍵是計算運算式如pk = POW(2, 4),將執行全表掃描。

分區路由大小寫敏感及忽略行尾空格

支援。

支援通過指定分區鍵的字元校正集(Collation)來決定分區路由是否需要區分大小寫以及是否需要忽略行尾空格。

不支援。分區列不支援使用Collation,Hash演算法只支援大小寫敏感,不支援忽略行尾空格。

JOIN計算下推

支援。

支援在分區的分裂、合并與遷移等操作期間,JOIN計算下推不受影響。

支援。

分區選擇

支援。

支援分區選擇文法查詢特定分區,例如SELECT * FROM tb PARTITIONS (p1)

不支援。

TTL(分區的生命週期管理)

支援。

不支援。

AUTO_INCREMENT

支援。保證全域唯一性、單調遞增和連續性。

支援。保證全域唯一性,不保證單調遞增和連續性。

效能對比

由於DRDS模式分庫分表與AUTO模式分區表使用了不同的路由演算法,為了評估這兩種路由演算法的效能差異,將使用Sysbench對PolarDB-X進行基準測試,觀察它們在不同的Sysbench測試情境下的吞吐(單位:QPS)差異。

測試環境

  • PolarDB-X執行個體規格:polarx.x4.2xlarge.2e

    • CN (16C64G) × 2

    • DN (16C64G) × 2

  • 版本:5.4.13-16415631

  • 分區表和分庫分表配置:

    • 分區表:

      • 32個分區

      • 分區語句:partition by hash(id) partitions 32

      • 表資料總量:16000W

    • 分庫分表:

      • 32個物理分表

      • 分庫分表語句:dbpartition by hash(id) tbpartition by hash(id) tbpartition 2

      • 表資料總量:16000W

測試情境

Sysbench細分情境說明:

  • oltp_point_select:僅含分區鍵的單點等值查詢。

  • oltp_read_only:事務中同時混合分區鍵的單點查詢與小範圍查詢(例如Between)。

  • oltp_read_write:事務中同時混合分區鍵的單點與小範圍的查詢與寫入。

測試結果

  • 分區表使用的一致性HASH路由演算法雖然比原來分庫分表中按HASH模數的路由演算法更為複雜,但在oltp_point_select情境中吞吐並沒有下降太多,基本與原來的持平。

  • 在oltp_read_only&oltp_read_write情境中,由於這些情境會出現小範圍的查詢,SQL的查詢條件運算式會比oltp_point_select複雜,得益於分區表的裁剪最佳化,整體吞吐比原來提升約33%。

FAQ

  • Q1:建庫時,AUTO模式與DRDS模式應該如何選擇?

    A:從5.4.13及以上版本開始,從PolarDB-X 1.0遷移過來的或者全新的應用,均推薦使用AUTO模式。

  • Q2:在AUTO模式下,建表時自動分區與手動分區應該如何選擇?

    A:在測試階段可以完全用自動分區的方式,當發現業務需要調優的時候,可以通過DDL(ALTER PARTITION)語句變更表的分區方式。如果非常瞭解業務的具體SQL,知道具體的表與表之間的關聯關係,可以按照手動分區的方式建表。

  • Q3:DRDS模式的資料庫如何切換到AUTO模式?

    A:核心5.4.16及以上版本可以採用下列任意方式;低於5.4.16的版本,僅支援方法二和方法三。關於如何查看執行個體版本,請參見查看執行個體版本

    • 方法一:從5.4.16版本開始,核心提供了create database like/as文法,可以一鍵將DRDS模式資料庫切換為AUTO模式,使用方法請參見將DRDS模式資料庫轉換為AUTO模式資料庫

    • 方法二:在目標執行個體建立對應的AUTO模式資料庫,在AUTO模式資料庫下將表建立好,然後通過DTS服務,將原DRDS模式的庫同步到AUTO模式的庫。

    • 方法三:通過mysqldump命令將原來的DRDS模式資料庫的資料檔案dump下來(不含建表語句),然後建立對應的AUTO模式資料庫,在AUTO模式資料庫下將表建立好,然後將dump下來的資料檔案通過source命令匯入目標AUTO模式資料庫。

  • Q4:AUTO模式自動分區的預設分區數是多少?

    A:AUTO模式的自動分區數目=執行個體建立時的節點數目×8 。 例如,執行個體建立時使用2個節點,則預設的自動分區數目=2×8=16。 分區數在執行個體完成建立後將一直保持不變(它不會受執行個體擴縮容的影響),除非手動調整對應的參數值。

  • Q5:是否支援手動調整自動分區的預設分區數?

    A:支援。預設分區數對應的參數名稱是AUTO_PARTITION_PARTITIONS,參數的生效層級是執行個體級。因此,該參數被調整後,執行個體中所有的AUTO模式資料庫下新建立的表的自動分區數都將發生改變。需要注意的是,如果新建立的表的分區數與原來已建立的表的分區數不一致,將會導致它們之間的JOIN計算下推失效,影響執行效率,建議手動調整分區數,詳情請參見變更表級分區(AUTO模式)