天天看點

What is new? 阿裡雲 RDS for MySQL 8.0 上線 獨家技術解讀

原作者: 阿裡雲進階技術專家 冷香

MySQL 8.0 簡介

MySQL 5.7 到 8.0,Oracle 官方跳躍了 Major Version 版本号,随之而來的就是在 MySQL 8.0 上做了許多重大更新,在往企業級資料庫的路上大步前行,全新 Data Dictionary 設計,支援 Atomic DDL,全新的版本更新政策,安全和賬号管理加強,InnoDB 功能增強等,目前小版本已經 release 到 8.0.16,新的功能仍然在持續推出。
           

RDS MySQL 8.0 産品是阿裡雲推出的 MySQL 系列雲産品之一,使用完全相容 MySQL 8.0 的阿裡雲 AliSQL 8.0 分支,除了官方在 MySQL 8.0 推出的全新功能外,AliSQL 沉澱了許多在 Alibaba 集團電商業務和雲上幾十萬客戶在使用 MySQL 過程中遇到的問題和需求,以此來加強AliSQL, 提升 AliSQL 的性能和穩定性。

下面分别對 MySQL 8.0 和 AliSQL 8.0 相關的版本和功能做簡短的介紹:

MySQL 8.0 版本更新

  1. 資料字典

    MySQL 8.0 摒棄了 Server Layer 定義的 FRM 檔案和其它非事務表,使用了一組 InnoDB 表來儲存資料字典,支援事務特性。

  2. Atomic DDL

    在 Data Dictionary 支援事務特性的基礎上,8.0 增加了一個 DDL log 字典表,用來協調在 DDL 過程中,對資料字典,檔案系統 和 事務系統的修改,做到原子性。

  1. 更新

    從 8.0.16 開始,對于系統表的修改,抛棄了 mysql_upgrade工具,使用在系統重新開機的時候,進行更新。

  2. 安全和賬号管理

    賬号方面,從 8.0 開始,支援 role 對權限進行便捷管理,以及新增多個系統權限,分别對應新增了 ROLE_EDGES,GLOBAL_GRANTS 兩個系統表;mysql schema 下的涉及權限和使用者相關的表更改成 InnoDB 引擎,支援事務特性,保證了賬号管理語句的原子性。

認證方面,caching_sha2_password 作為預設的認證 plugin,以提升安全,但要注意并不能和 8.0 之前的client進行相容。

鍊路加密,如果編譯了OpenSSL 1.1.1 及以上,MySQL 8.0 SSL 将支援到 TLSv1.3 版本。

系統賬号,在 8.0.16 新增 SYSTEM_USER 權限,用于區分 系統賬号還是普通賬戶,可以對使用者進行分類管理。

  1. Auto increment 持久化

    在 InnoDB 引擎中,新增了一個引擎私有的系統表 innodb_dynamic_metadata,自增值就儲存在這個表裡,在對每張表進行修改 auto increment 值的時候,都使用 redo log 進行保護,在做 checkpoint 的時候,持久化到這個系統表中,保證下次重新開機後,auto increment 能夠從持久化中恢複出來,并且不受事務上下文復原而影響。

  1. 死鎖檢測

    在高并發的情況下,InnoDB 引擎中對于事務鎖的死鎖檢測,将是影響性能 scale 的重要因素,8.0 後提供了一個參數 innodb_deadlock_detect,用來打開或者關閉引擎的死鎖檢測,在業務能夠明确相關風險的情況下,關閉死鎖檢測,能大幅提升并發能力。

  2. 臨時表

    在 InnoDB 引擎中,使用者建立的臨時表将統一到 ibtmp 檔案的臨時表空間中; 對于系統運作過程中産生記憶體臨時表,8.0後啟用了新的 TempTable 引擎,支援 blob 字段,功能上優于 memory engine。

  3. Lock

    SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 新增了 NOWAIT 和 SKIP LOCKED 文法,減少長時間和非必要的阻塞。

  4. Instant add column

    InnoDB 解決了長期困擾 DBA 的加字段要 copy 整張表資料的問題。現在可以快速的增加字段,隻修改資料字典,而不用修改表中的記錄本身。

  5. 并行查詢

    InnoDB 目前支援在 clustered index 上進行并行查詢,提供 innodb_parallel_read_threads 參數控制session内的并行度。

  6. Redo優化

    Redo的寫入一直是 InnoDB 高并發情況下的瓶頸,8.0 開始:

1)使用者線程可以并發的copy redo 日志到 log buffer中

2)使用者線程可以以更松散的方式把 dirty block 加入到髒塊連結清單中

3)獨立的寫線程完成 redo 的持久化

  1. Json加強

    在Json上,8.0 增加了更多的功能性,詳見 MySQL 8.0 的 document。

  2. Partial update on lob

    InnoDB 繼續優化 partial update on lob data,對于僅僅修改很少位元組的 lob 字段,能夠大幅減少 undo data,并提升效率。

  3. 優化器和對象相關

    1)支援 invisible index,友善使用者和 DBA 調試 statement。

2)descending indexes,提升降序掃描的效率。

3)Common table expressions,支援 with 文法完成。

4)Window functions,增加大量視窗函數

5)Regular expression,重新設計了正規表達式的支援。

AliSQL 8.0 功能介紹

除了 MySQL 8.0 官方的特性以外,AliSQL 8.0 在新功能,性能提升,穩定性保證,可診斷性上做了大量的改進:

  1. 診斷

    Top SQL:

AliSQL 在 statement 級别上,增加了新的性能診斷名額,友善更快更準确的量化 SQL 的開銷:

Include three categories:
      1) CPU:   Elapsed time, CPU time
      2) LOCK:  Server MDL lock time, Storage transaction lock time.
                Mutex conflict(only for debug mode)
                RWLOCK conflict(demonstrate the block/index->lock conflict)
      3) IO:    DATA File read and time
                DATA File write and time
                Log File write and time
                Logical read, Physical read, Physical async read.
           

效果如下所示:

What is new? 阿裡雲 RDS for MySQL 8.0 上線 獨家技術解讀

表和索引統計

新增表和索引級别的統計:

What is new? 阿裡雲 RDS for MySQL 8.0 上線 獨家技術解讀
What is new? 阿裡雲 RDS for MySQL 8.0 上線 獨家技術解讀

InnoDB IO 統計

What is new? 阿裡雲 RDS for MySQL 8.0 上線 獨家技術解讀
  1. Sequence

    AliSQL 8.0 增加對 Sequence 對象的支援,友善和高效的擷取單調唯一值:

SYNTAX:

      CREATE SEQUENCE SYNTAX:

      CREATE SEQUENCE [IF NOT EXISTS] schema.seq
         [START WITH <constant>]
         [MINVALUE <constant>]
         [MAXVALUE <constant>]
         [INCREMENT BY <constant>]
         [CACHE <constant> | NOCACHE]
         [CYCLE | NOCYCLE]
        ;

      SHOW SYNTAX:
        SHOW CREATE SEQUENCE schema.seq;

      QUERY SYNTAX:
        SELECT [nextval | currval | *] FROM seq;
        SELECT nextval(seq),currval(seq);
        SELECT seq.currval, seq.nextval from dual;
           
  1. 大檔案異步删除

    InnoDB 大檔案删除帶來穩定性開銷,是以 AliSQL 8.0 提供了異步删資料檔案的機制:

參數設定:

INNODB_DATA_FILE_PURGE: Whether enable the async purge strategy
   INNODB_DATA_FILE_PURGE_IMMEDIATE: Unlink data file rather than truncate
   INNODB_DATA_FILE_PURGE_ALL_AT_SHUTDOWN: Cleanup all when normal shutdown
   INNODB_DATA_FILE_PURGE_DIR: Temporary file directory
   INNODB_DATA_FILE_PURGE_INTERVAL: Purge time interval (by milliseconds)
   INNODB_DATA_FILE_PURGE_MAX_SIZE: Purge max size every time (by MB)
   INNODB_PRINT_DATA_FILE_PURGE_PROCESS: Print the process of file purge worker
           

展示臨時檔案清單:

mysql> select * from innodb_purge_files;
    +--------+---------------------+---------------+---------------+------------------------+--------------+
    | log_id | start_time          | original_path | original_size | temporary_path         | current_size |
    +--------+---------------------+---------------+---------------+------------------------+--------------+
    |     36 | 2019-05-14 23:06:38 | ./test/t.ibd  |      37748736 | purge/#FP_1557846107_1 |     20971520 |
    +--------+---------------------+---------------+---------------+-----------------------+--------------+
           
  1. 隐含主鍵

    AliSQL 針對使用者沒有建 PK 的表,預設添加一個隐含主鍵,以加速 slave 端的 SQL apply。

檢視方法:

mysql> set show_ipk_info=on;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL,
  `__#alibaba_rds_row_id#__` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Implicit Primary Key by RDS',
  KEY `__#alibaba_rds_row_id#__` (`__#alibaba_rds_row_id#__`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
           
  1. 事務逾時

    AliSQL 新增 kill_idle_transaction_timeout 參數,以便對逾時的事務連接配接進行 kill,防止事務長時間未送出帶來的系統風險。

  2. Rotate slow log

    AliSQL 8.0 針對 slow log 收集過程中,對使用者執行個體的影響,以及truncate帶來的阻塞可能,提供了rotate slow log table的功能,影響更小,更快捷,并保證零資料丢失的收集方式。

set session rotate_log_table = on;
flush slow logs;

mysql> show variables like '%rotate_log_table%';
      +----------------------------+---------------------------------+
      | Variable_name              | Value                           |
      +----------------------------+---------------------------------+
      | rotate_log_table           | ON                              |
      | rotate_log_table_last_name | ./mysql/slow_log_1556373907.CSV |
      +----------------------------+---------------------------------+
           
  1. 審計日志

    AliSQL 8.0 重新設計的 audit log 子產品,提供了四種重新整理政策,分别是:

ASYNCHRONOUS:     Log asynchronously. Wait for space in the output buffer

      PERFORMANCE:       Log asynchronously. Drop requests for which there is

                                        insufficient space in the output buffer

      SEMISYNCHRONOUS: Log synchronously. Permit caching by the operating system

      SYNCHRONOUS:     Log synchronously. Call sync() after each request
           

提供适合不同業務模式的 audit log 配置供使用者選擇。

  1. 安全特性

    AliSQL 針對 SSL 鍊路,靜态編譯了OpenSSL 1.0 版本,目前支援到 TLSv1.2 版本。

  2. 優化

    AliSQL 針對 semi sync 和 MDL 進行了性能優化,提升了 semi sync 的性能,大幅減少了 MDL 鎖阻塞的可能性。

繼續閱讀