這篇文章主要介紹了MySQL 8 新特性Clone Plugin是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、城中網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為城中等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
Clone Plugin是MySQL 8.0.17引入的一個重大特性,為什么要實(shí)現(xiàn)這個特性呢?個人感覺,主要還是為Group Replication服務(wù)。在Group Replication中,添加一個新的節(jié)點(diǎn),差異數(shù)據(jù)的補(bǔ)齊是通過分布式恢復(fù)(Distributed Recovery)來實(shí)現(xiàn)的。
在MySQL 8.0.17之前,只支持一種恢復(fù)方式-Binlog。但如果新節(jié)點(diǎn)需要的Binlog已經(jīng)被Purge了,這個時候,只能先借助于備份工具(XtraBackup,mydumper,mysqldump)做個全量數(shù)據(jù)的同步,然后再通過分布式恢復(fù)同步增量數(shù)據(jù)。
這種方式,雖然也能實(shí)現(xiàn)添加節(jié)點(diǎn)的目的,但總歸還是要借助于外部工具,需要一定的工作量和使用門檻。要知道,其競爭對手,PXC,默認(rèn)集成了XtraBackup進(jìn)行State Snapshot Transfer(類似于全量同步),而MongoDB則更進(jìn)一步,原生就實(shí)現(xiàn)了Initial Sync同步全量數(shù)據(jù)。從易用性來看,單就集群添加節(jié)點(diǎn)這一項而言,MySQL確實(shí)不如其競爭對手??蛻趔w驗(yàn)上,還有很大的提升空間。
好在MySQL官方也正視到這個差距,終于在MySQL 8.0.17實(shí)現(xiàn)了Clone Plugin。當(dāng)然,對于官方來說,實(shí)現(xiàn)這個特性并不算難,畢竟有現(xiàn)成的物理備份工具(MySQL Enterprise Backup)可供借鑒。
本文將從以下幾個方面展開:
- Clone Plugin的安裝
- Clone Plugin的使用
- 如何查看克隆操作的進(jìn)度
- 如何基于克隆數(shù)據(jù)搭建從庫
- Clone Plugin的實(shí)現(xiàn)細(xì)節(jié)
- Clone Plugin的限制
- Clone Plugin與XtraBackup的對比
- Clone Plugin的參數(shù)解析
Clone Plugin支持以下兩種安裝方式:
(1)配置文件指定
[mysqld] plugin-load-add=mysql_clone.so clone=FORCE_PLUS_PERMANENT復(fù)制代碼
這里的clone,嚴(yán)格來說,不是參數(shù)名,而是插件名,可加可不加,F(xiàn)ORCE_PLUS_PERMANENT 控制插件的行為。
有四個取值:
(2)動態(tài)加載
[mysqld] plugin-load-add=mysql_clone.so clone=FORCE_PLUS_PERMANENT復(fù)制代碼
查看插件是否安裝成功
mysql> show plugins; ... | clone | ACTIVE | CLONE | mysql_clone.so | GPL | ...復(fù)制代碼
clone狀態(tài)顯示為”ACTIVE“代表插件加載成功。
Clone Plugin支持兩種克隆方式:本地克隆和遠(yuǎn)程克隆。
本地克隆是在實(shí)例本地發(fā)起的,其語法如下:
CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';復(fù)制代碼
其中,clone_dir是克隆目錄。
下面看個具體的Demo。
創(chuàng)建克隆用戶
mysql> create user 'clone_user'@'%' identified by 'clone_pass'; mysql> grant backup_admin on *.* to 'clone_user'@'%';復(fù)制代碼
創(chuàng)建克隆目錄
# mkdir /data/mysql # chown -R mysql.mysql /data/mysql復(fù)制代碼
創(chuàng)建本地克隆
# mysql -uclone_user -pclone_pass mysql> clone local data directory='/data/mysql/3307';復(fù)制代碼
其中,“/data/mysql/3307” 是克隆目錄,其需滿足以下幾點(diǎn)要求:
- 克隆目錄必須是絕對路徑。
- “/data/mysql”必須存在,且MySQL對其有可寫權(quán)限。
- 3307不能存在。
查看克隆目錄的內(nèi)容
# ll /data/mysql/3307 total 172996 drwxr-x--- 2 mysql mysql 89 May 24 22:37 #clone -rw-r----- 1 mysql mysql 3646 May 24 22:37 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 May 24 22:37 ibdata1 -rw-r----- 1 mysql mysql 50331648 May 24 22:37 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 May 24 22:37 ib_logfile1 drwxr-x--- 2 mysql mysql 6 May 24 22:37 mysql -rw-r----- 1 mysql mysql 25165824 May 24 22:37 mysql.ibd drwxr-x--- 2 mysql mysql 20 May 24 22:37 slowtech drwxr-x--- 2 mysql mysql 28 May 24 22:37 sys -rw-r----- 1 mysql mysql 10485760 May 24 22:37 undo_001 -rw-r----- 1 mysql mysql 11534336 May 24 22:37 undo_002復(fù)制代碼
相對于Xtrabackup,無需Prepare,直接即可啟動使用。
# /usr/local/mysql/bin/mysqld --no-defaults --datadir=/data/mysql/3307 --user mysql --port 3307 &復(fù)制代碼
遠(yuǎn)程克隆涉及兩個實(shí)例,其中,待克隆的實(shí)例是Donor,接受克隆數(shù)據(jù)的實(shí)例是Recipient。克隆命令需在Recipient上發(fā)起,語法如下:
CLONE INSTANCE FROM 'user'@'host':port IDENTIFIED BY 'password' [DATA DIRECTORY [=] 'clone_dir'] [REQUIRE [NO] SSL];復(fù)制代碼
其中,host,port 是待克隆實(shí)例的(Donor)的IP和端口,user,password是Donor上的克隆用戶和密碼,需要backup_admin權(quán)限,如上面創(chuàng)建的clone_user。
DATA DIRECTORY指定備份目錄,不指定的話,則默認(rèn)克隆到Recipient的數(shù)據(jù)目錄下。
REQUIRE [NO] SSL,是否開啟SSL通信。
下面,看個具體Demo。
首先,在Donor實(shí)例上創(chuàng)建克隆用戶,加載Clone Plugin。
mysql> create user 'donor_user'@'%' identified by 'donor_pass'; mysql> grant backup_admin on *.* to 'donor_user'@'%'; mysql> install plugin clone soname 'mysql_clone.so';復(fù)制代碼
backup_admin是克隆操作必需權(quán)限。
接著,在Recipient實(shí)例上創(chuàng)建克隆用戶,加載Clone Plugin。
mysql> create user 'recipient_user'@'%' identified by 'recipient_pass'; mysql> grant clone_admin on *.* to 'recipient_user'@'%'; mysql> install plugin clone soname 'mysql_clone.so';復(fù)制代碼
這里的clone_admin,隱式含有backup_admin(阻塞DDL)和shutdown(重啟實(shí)例)權(quán)限。
設(shè)置Donor白名單。Recipient只能克隆白名單中的實(shí)例。
mysql> set global clone_valid_donor_list = '192.168.244.10:3306';復(fù)制代碼
設(shè)置該參數(shù)需要SYSTEM_VARIABLES_ADMIN權(quán)限。
在Recipient上發(fā)起克隆命令
# mysql -urecipient_user -precipient_pass mysql> clone instance from 'donor_user'@'192.168.244.10':3306 identified by 'donor_pass'; Query OK, 0 rows affected (36.97 sec)復(fù)制代碼
遠(yuǎn)程克隆會依次進(jìn)行以下操作:
**(1)****獲取備份鎖。**備份鎖和DDL互斥。注意,不僅僅是Recipient,Donor上的備份鎖同樣會獲取。
**(2)****DROP用戶表空間。**注意,DROP的只是用戶數(shù)據(jù),不是數(shù)據(jù)目錄,也不包括mysql,ibdata等系統(tǒng)表空間。
**(3)從Donor實(shí)例拷貝數(shù)據(jù)。**對于用戶表空間,會直接拷貝,如果是系統(tǒng)表空間 ,則會重命名為xxx.#clone,不會直接替代原文件。
ll /data/mysql/3306/data/ ... -rw-r----- 1 mysql mysql 3646 May 25 07:20 ib_buffer_pool -rw-r----- 1 mysql mysql 3646 May 27 07:31 ib_buffer_pool.#clone -rw-r----- 1 mysql mysql 12582912 May 27 07:31 ibdata1 -rw-r----- 1 mysql mysql 12582912 May 27 07:31 ibdata1.#clone -rw-r----- 1 mysql mysql 50331648 May 27 07:32 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 May 27 07:31 ib_logfile0.#clone ... -rw-r----- 1 mysql mysql 25165824 May 27 07:31 mysql.ibd -rw-r----- 1 mysql mysql 25165824 May 27 07:31 mysql.ibd.#clone ...復(fù)制代碼
**(4)重啟實(shí)例。**在啟動的過程中,會用xxx.#clone替換掉原來的系統(tǒng)表空間文件。
查看克隆操作的進(jìn)度主要依托于performance_schema.clone_status和performance_schema.clone_progress這兩張表。
首先看看performance_schema.clone_status表。
mysql> select * from performance_schema.clone_status\G *************************** 1\. row *************************** ID: 1 PID: 0 STATE: Completed BEGIN_TIME: 2020-05-27 07:31:24.220 END_TIME: 2020-05-27 07:33:08.185 SOURCE: 192.168.244.10:3306 DESTINATION: LOCAL INSTANCE ERROR_NO: 0 ERROR_MESSAGE: BINLOG_FILE: mysql-bin.000009 BINLOG_POSITION: 665197555 GTID_EXECUTED: 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560 1 row in set (0.06 sec)復(fù)制代碼
顧名思義,該表記錄了克隆操作的當(dāng)前狀態(tài)。
其中,
**PID:**Processlist ID。對應(yīng)show processlist中的Id,如果要終止當(dāng)前的克隆操作,執(zhí)行kill processlist_id命令即可。
**STATE:**克隆操作的狀態(tài),Not Started(克隆尚未開始),In Progress(克隆中),Completed(克隆成功),F(xiàn)ailed(克隆失?。?。如果是Failed狀態(tài),ERROR_NO,ERROR_MESSAGE會給出具體的錯誤編碼和錯誤信息。
**BEGIN_TIME,END_TIME:**克隆操作開始,結(jié)束時間。
**SOURCE:**Donor實(shí)例的地址。
**DESTINATION:**克隆目錄?!癓OCAL INSTANCE”代表當(dāng)前實(shí)例的數(shù)據(jù)目錄。
**GTID_EXECUTED,BINLOG_FILE(BINLOG_POSITION):**克隆操作結(jié)束時,主庫已經(jīng)執(zhí)行的GTID集合,及一致性位置點(diǎn)??衫眠@些信息來搭建從庫。
接下來看看performance_schema.clone_progress表。
mysql> select * from performance_schema.clone_progress; +------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+ | ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED | +------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+ | 1 | DROP DATA | Completed | 2020-05-27 07:31:28.581661 | 2020-05-27 07:31:35.855706 | 1 | 0 | 0 | 0 | 0 | 0 | | 1 | FILE COPY | Completed | 2020-05-27 07:31:35.855952 | 2020-05-27 07:31:58.270881 | 2 | 482463294 | 482463294 | 482497011 | 0 | 0 | | 1 | PAGE COPY | Completed | 2020-05-27 07:31:58.271250 | 2020-05-27 07:31:58.719085 | 2 | 10977280 | 10977280 | 11014997 | 0 | 0 | | 1 | REDO COPY | Completed | 2020-05-27 07:31:58.720128 | 2020-05-27 07:31:58.930804 | 2 | 465408 | 465408 | 465903 | 0 | 0 | | 1 | FILE SYNC | Completed | 2020-05-27 07:31:58.931094 | 2020-05-27 07:32:01.063325 | 2 | 0 | 0 | 0 | 0 | 0 | | 1 | RESTART | Completed | 2020-05-27 07:32:01.063325 | 2020-05-27 07:32:59.844119 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | RECOVERY | Completed | 2020-05-27 07:32:59.844119 | 2020-05-27 07:33:08.185367 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+ 7 rows in set (0.00 sec)復(fù)制代碼
該表記錄了克隆操作的進(jìn)度信息。
**STAGE:**一個克隆操作可依次細(xì)分為DROP DATA,F(xiàn)ILE COPY,PAGE COPY,REDO COPY,F(xiàn)ILE SYNC,RESTART,RECOVERY等7個階段。當(dāng)前階段結(jié)束了才會開始下一個階段。
**STATE:**當(dāng)前階段的狀態(tài)。有三種狀態(tài):Not Started,In Progress,Completed。
**BEGIN_TIME,END_TIME:**當(dāng)前階段的開始時間和結(jié)束時間。
**THREADS:**當(dāng)前階段使用的并發(fā)線程數(shù)。
**ESTIMATE:**預(yù)估的數(shù)據(jù)量。
**DATA:**已經(jīng)拷貝的數(shù)據(jù)量。
**NETWORK:**通過網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。如果是本地克隆,該列的值為0。
**DATA_SPEED,NETWORK_SPEED:**當(dāng)前數(shù)據(jù)拷貝的速率和網(wǎng)絡(luò)傳輸?shù)乃俾省?/p>
注意,是當(dāng)前值。
在前面,我們介紹過performance_schema.clone_status表,該表會記錄Donor實(shí)例的一致性位置點(diǎn)信息。我們可以利用這些信息來搭建從庫。
mysql> select * from performance_schema.clone_status\G *************************** 1\. row *************************** ... BINLOG_FILE: mysql-bin.000009 BINLOG_POSITION: 665197555 GTID_EXECUTED: 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560 1 row in set (0.06 sec)復(fù)制代碼
這里,區(qū)分兩種場景,GTID復(fù)制和基于位置點(diǎn)的復(fù)制。
mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num, ... MASTER_AUTO_POSITION = 1; mysql> START SLAVE;復(fù)制代碼
需要注意的是,無需額外執(zhí)行set global gtid_purged操作。通過克隆數(shù)據(jù)啟動的實(shí)例,gtid_purged已經(jīng)初始化完畢。
mysql> show global variables like 'gtid_purged'; +---------------+--------------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------------+ | gtid_purged | 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560 | +---------------+--------------------------------------------+ 1 row in set (0.00 sec)復(fù)制代碼
這里,同樣要區(qū)分兩種場景。
場景1,Recipient要作為Donor的從庫。
mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status; mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num, ... MASTER_LOG_FILE = 'master_log_name', MASTER_LOG_POS = master_log_pos; mysql> START SLAVE;復(fù)制代碼
其中,
master_host_name,master_port_num:Donor實(shí)例的IP和端口。
master_log_name,master_log_pos:performance_schema.clone_status 中的BINLOG_FILE, BINLOG_POSITION。
場景2,Donor本身就是一個從庫,Recipient要作為Donor主庫的從庫。
mysql> SELECT MASTER_LOG_NAME, MASTER_LOG_POS FROM mysql.slave_relay_log_info; mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num, ... MASTER_LOG_FILE = 'master_log_name', MASTER_LOG_POS = master_log_pos; mysql> START SLAVE;復(fù)制代碼
其中,
master_host_name,master_port_num:Donor主庫的IP和端口。
master_log_name,master_log_pos:mysql.slave_relay_log_info中的Master_log_name,Master_log_pos(分別對應(yīng) SHOW SLAVE STATUS 中的 Relay_Master_Log_File,Exec_Master_Log_Pos)。
在搭建從庫時,建議設(shè)置--skip-slave-start。該參數(shù)默認(rèn)為OFF,實(shí)例啟動后,會自動執(zhí)行START SLAVE操作。
如果Donor是個從庫,Recipient會基于mysql.slave_master_info,mysql.slave_relay_log_info中的信息自動建立復(fù)制,很多時候,這未必是我們的預(yù)期行為。
克隆操作可細(xì)分為以下5個階段。
[INIT] ---> [FILE COPY] ---> [PAGE COPY] ---> [REDO COPY] -> [Done]復(fù)制代碼
**1、INIT:**初始化一個克隆對象。
**2、FILE COPY:**拷貝所有數(shù)據(jù)文件。在拷貝之前,會記錄一個LSN,作為“CLONE START LSN”,這個LSN其實(shí)是當(dāng)前CHECKPOINT的LSN,同時啟動“Page Tracking”特性。
“Page Tracking”會跟蹤“CLONE START LSN”之后被修改的頁,具體來說,會記錄該頁的Tablespace ID和page ID。數(shù)據(jù)文件拷貝結(jié)束后,會將當(dāng)前CHECKPOINT的LSN記為“CLONE FILE END LSN”。
**3、PAGE COPY:**拷貝“CLONE START LSN”和“CLONE FILE END LSN”之間的頁,在拷貝之前,會對這些頁進(jìn)行排序-基于Tablespace ID和page ID,盡量避免拷貝過程中出現(xiàn)隨機(jī)讀寫。同時,開啟“Redo Archiving”特性。
“Redo Archiving”會在后臺開啟一個歸檔線程將Redo文件中的內(nèi)容按Chunk拷貝到歸檔文件中。通常來說,歸檔線程的拷貝速度會快于Redo日志的生成速度。即使慢于,在寫入新的Redo日志時,也會等待歸檔線程完成拷貝,不會出現(xiàn)還未拷貝的Redo日志被覆蓋的情況。當(dāng)所有修改的頁拷貝完畢后,會獲取實(shí)例的一致性位置點(diǎn)信息,此時的LSN記為“CLONE LSN”。
4、REDO COPY:拷貝歸檔文件中“CLONE FILE END LSN”與“CLONE LSN”之間的Redo日志。
**5、Done:**調(diào)用snapshot_end()銷毀克隆對象。
1、克隆期間,不允許執(zhí)行DDL命令。同樣,DDL會阻塞克隆命令的執(zhí)行
2、Clone Plugin不會拷貝Donor的配置參數(shù)。
3、Clone Plugin不會拷貝Donor的二進(jìn)制日志文件。
4、Clone Plugin只會拷貝InnoDB表的數(shù)據(jù),對于其它存儲引擎的表,只會拷貝表結(jié)構(gòu)。
5、Donor實(shí)例中如果有表通過DATA DIRECTORY指定了絕對路徑,在進(jìn)行本地克隆時,會提示文件已存在。在進(jìn)行遠(yuǎn)程克隆時,絕對路徑必須存在且有可寫權(quán)限。
6、不允許通過MySQL Router連接Donor實(shí)例。
7、執(zhí)行CLONE INSTANCE操作時,指定的Donor端口不能為X Protocol端口。
除此之外,在進(jìn)行遠(yuǎn)程克隆時,還會進(jìn)行如下檢查:
ERROR 3864 (HY000): Clone Donor MySQL version: 8.0.20 is different from Recipient MySQL version 8.0.19.復(fù)制代碼
ERROR 3634 (HY000): Too many concurrent clone operations. Maximum allowed - 1.復(fù)制代碼
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).復(fù)制代碼
1、在實(shí)現(xiàn)上,兩者都有FILE COPY和REDO COPY階段,但Clone Plugin比XtraBackup多了一個PAGE COPY,由此帶來的好處是,Clone Plugin的恢復(fù)速度比XtraBackup更快。
2、XtraBackup沒有Redo Archiving特性,有可能出現(xiàn)未拷貝的Redo日志被覆蓋的情況。
3、GTID下建立復(fù)制,無需額外執(zhí)行set global gtid_purged操作。
需要注意的是,如果在執(zhí)行DDL時,有CLONE命令在執(zhí)行,DDL同樣會因獲取不到備份鎖被阻塞,只不過,DDL操作的等待時長由lock_wait_timeout參數(shù)決定,該參數(shù)的默認(rèn)值為31536000s,即365天。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享MySQL 8 新特性Clone Plugin是什么內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!