MySQL8.0.17 - 初探 Clone Plugin

MySQL8.0.17推出了一個重量級的功能:clone plugin。容許用戶能夠將當前實例進行本地或者遠程的clone。這在某些場景尤爲想快速搭建複製備份或者在group replication里加入新成員時很是有用。本文主要試玩下該功能,並試圖闡述下其實現的機制是什麼。html

咱們以本地clone爲例,由於去除網絡部分,理解起來會相對簡單點。 也不會過分接觸代碼部分,僅僅作簡單的原理性闡述mysql

示例

本地clonesql

本地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:sqlserver

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 clone_user@example.donor.host.com:3306url

IDENTIFIED BY 'password';

mysql> CLONE INSTANCE FROM user_name@example.donor.host.com:3306spa

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

 

本文做者 :zhaiwx_yinfeng 

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索