天天看點

MySQL8.0.17 - 初探 Clone Plugin

MySQL8.0.17推出了一個重量級的功能:clone plugin。允許使用者可以将目前執行個體進行本地或者遠端的clone。這在某些場景尤其想快速搭建複制備份或者在group replication裡加入新成員時非常有用。本文主要試玩下該功能,并試圖闡述下其實作的機制是什麼。

我們以本地clone為例,因為去除網絡部分,了解起來會相對簡單點。 也不會過度接觸代碼部分,僅僅做簡單的原理性闡述

示例

本地clone

本地clone無需啟動額外mysqld, 隻要在執行個體上執行一條sql語句,指定下目标目錄即可:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';


root@test 03:49:43>SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE     | STATE       | END_TIME                   |
+-----------+-------------+----------------------------+
| DROP DATA | Completed   | 2019-07-26 12:07:12.285611 |
| FILE COPY | Completed   | 2019-07-26 12:07:18.270998 |
| PAGE COPY | Completed   | 2019-07-26 12:07:18.472560 |
| REDO COPY | Completed   | 2019-07-26 12:07:18.673061 |
| FILE SYNC | Completed   | 2019-07-26 12:07:32.090219 |
| RESTART   | Not Started | NULL                       |
| RECOVERY  | Not Started | NULL                       |
+-----------+-------------+----------------------------+
7 rows in set (0.00 sec)           

需要BACKUP_ADMIN權限

遠端clone:
CLONE INSTANCE FROM USER@HOST:PORT
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];           

mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';

mysql> CLONE INSTANCE FROM [email protected]:3306

IDENTIFIED BY 'password';
           

mysql> CLONE INSTANCE FROM [email protected]:3306

IDENTIFIED BY 'password'
   DATA DIRECTORY = '/path/to/clone_dir';
              
  • 需要指定絕對路徑,并且路徑目錄必須不存在
  • 在接受機器上啟動mysqld,執行上述語句連接配接到目标機器,就能從目标機器上clone資料到本地,注意如果沒有指定data directory的話,就預設配置的目錄,已有的檔案會被清理掉,并在clone完成後重新開機
  • 兩個執行個體上都需要安裝clone plugin
  • 必須有相同的字元集設定

官方文檔列出的一些限制:

  1. ddl包括truncate table在clone期間不允許執行 //被block住
  2. An instance cannot be cloned from a different MySQL server version. The donor and recipient must have the same MySQL server version.
  3. the X Protocol port specified by mysqlx_port is not supported for remote cloning operations
  4. The clone plugin does not support cloning of MySQL server configurations
  5. 不支援clone binlog
  6. The clone plugin only clones data stored in InnoDB. Other storage engine data is not cloned
  7. Connecting to the donor MySQL server instance through MySQL Router is not supported.
  8. Local cloning operations do not support cloning of general tablespaces that were created with an absolute path. A cloned tablespace file with the same path as the source tablespace file would cause a conflict.

主要流程

主要流程包含如下幾個過程:

[INIT] ---> [FILE COPY] ---> [PAGE COPY] ---> [REDO COPY] -> [Done]

INIT階段

需要持有backup lock, 阻止ddl進行

FILE COPY

按照檔案進行拷貝,同時開啟page tracking功能,記錄在拷貝過程中修改的page, 此時會設定buf_pool->track_page_lsn為目前lsn,track_page_lsn在flush page階段用到:

buf_flush_page:

    if (!fsp_is_system_temporary(bpage->id.space()) &&
        buf_pool->track_page_lsn != LSN_MAX) {
      page_t *frame;
      lsn_t frame_lsn;

      frame = bpage->zip.data;

      if (!frame) {
        frame = ((buf_block_t *)bpage)->frame;
      }
      frame_lsn = mach_read_from_8(frame + FIL_PAGE_LSN); //對于在track_page_lsn之後的page, 如果frame_Lsn大于track_page_lsn, 表示已經記錄下page id了,無需重複記錄

      arch_page_sys->track_page(bpage, buf_pool->track_page_lsn, frame_lsn,
                                false);  // 将page id記錄下來,表示在track_page_lsn後修改過的page
    }

會建立一個後套線程page_archiver_thread(),将記憶體記錄的page id flush到disk上           
PAGE COPY

這裡有兩個動作

  • 開啟redo archiving功能,從目前點開始存儲新增的redo log,這樣從目前點開始所有的增量修改都不會丢失
  • 同時上一步在page track的page被發送到目标端。確定目前點之前所做的變更一定發送到目标端

關于redo archiving,實際上這是官方早就存在的功能,主要用于官方的企業級備份工具,但這裡clone利用了該特性來維持增量修改産生的redo。 在開始前會做一次checkpoint, 開啟一個背景線程log_archiver_thread()來做日志歸檔。當有新的寫入時(

notify_about_advanced_write_lsn

)也會通知他去archive

當arch_log_sys處于活躍狀态時,他會控制日志寫入以避免未歸檔的日志被覆寫(

log_writer_wait_on_archiver

), 注意如果log_writer等待時間過長的話, archive任務會被中斷掉

Redo Copy

停止Redo Archiving", 所有歸檔的日志被發送到目标端,這些日志包含了從page copy階段開始到現在的所有日志,另外可能還需要記下目前的複制點,例如最後一個事務送出時的binlog位點或者gtid資訊,在系統頁中可以找到

Done

目标端重新開機執行個體,通過crash recovery将redo log應用上去。

參考文檔

官方部落格:Clone: Create MySQL instance replica The Clone Plugin WL#9209: InnoDB: Clone local replica WL#9210: InnoDB: Clone remote replica WL#9682: InnoDB: Support cloning encrypted and compressed database WL#9211: InnoDB: Clone Replication Coordinates WL#11636: InnoDB: Clone Remote provisioning