利用 MySQL 克隆插件搭建主從
前言:
MySQL 的 Clone 插件是一個(gè)強(qiáng)大的功能,首次引入于 MySQL 8.0.17 版本。簡(jiǎn)單來(lái)說(shuō),Clone Plugin 是一款物理克隆數(shù)據(jù)工具,它能夠幫助我們快速、高效地克隆或復(fù)制數(shù)據(jù)庫(kù),極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)遷移、備份和恢復(fù)的過(guò)程,讓我們?cè)谔幚泶罅繑?shù)據(jù)時(shí)更加得心應(yīng)手。本篇文章我們一起來(lái)學(xué)習(xí)下如何使用克隆插件。
克隆插件介紹
克隆插件的工作原理是創(chuàng)建存儲(chǔ)在 InnoDB 中的 schema、table、tablespaces 和 data dictionary metadata的物理快照。這個(gè)快照實(shí)際上是一個(gè)完整的數(shù)據(jù)目錄,MySQL克隆插件可以使用這個(gè)目錄來(lái)配置并恢復(fù)一個(gè) MySQL 服務(wù)器。
使用克隆插件,用戶可以執(zhí)行本地克隆和遠(yuǎn)程克隆兩種操作:
- 本地克?。簩?shù)據(jù)從啟動(dòng)克隆操作的 MySQL 服務(wù)器克隆到該服務(wù)器主機(jī)上的指定目錄下。
- 遠(yuǎn)程克?。荷婕暗奖镜?MySQL 服務(wù)器(接收方)和遠(yuǎn)程 MySQL 服務(wù)器(發(fā)送方),克隆的數(shù)據(jù)通過(guò)網(wǎng)絡(luò)從發(fā)送方傳輸?shù)浇邮辗?。默認(rèn)情況下,遠(yuǎn)程克隆操作會(huì)刪除接收方數(shù)據(jù)目錄中的現(xiàn)有數(shù)據(jù),并用克隆的新數(shù)據(jù)替換。
不過(guò)克隆插件的使用也是有一定的限制的,參考官方文檔,總結(jié)幾點(diǎn)如下:
- DDL阻塞與兼容性:
在早期版本中,克隆操作期間會(huì)阻塞源服務(wù)器(Donor)上的所有 DDL 操作,但從 MySQL 8.0.27 開始,克隆命令不再阻塞 Donor 上的 DDL 操作。
克隆操作要求源和目標(biāo) MySQL 服務(wù)器版本兼容,通常不允許跨大版本克隆。直至最近更新(如MySQL 8.0.37),小版本間的克隆限制有所放寬,但仍需注意版本兼容性。
- 存儲(chǔ)引擎限制:
克隆操作僅支持InnoDB表,對(duì)于其他存儲(chǔ)引擎的表,只會(huì)克隆其表結(jié)構(gòu)而不會(huì)復(fù)制數(shù)據(jù)。
- 配置與日志不復(fù)制:
克隆插件不會(huì)復(fù)制 Donor 服務(wù)器的配置參數(shù)和二進(jìn)制日志(Binlog)設(shè)置,這意味著目標(biāo)實(shí)例需要獨(dú)立配置。
- 操作系統(tǒng)與網(wǎng)絡(luò)限制:
捐贈(zèng)者和接受者必須運(yùn)行在相同的操作系統(tǒng)上,并且在某些情況下,要求網(wǎng)絡(luò)連接直接而不通過(guò)MySQL Router。
指定的 Donor 端口不能是X Protocol端口。
- 字符集與排序規(guī)則:
源和目標(biāo) MySQL 服務(wù)器必須具有相同的字符集和排序規(guī)則。
利用 Clone Plugin 搭建主從
下面我們來(lái)具體操作下如何利用遠(yuǎn)程克隆來(lái)搭建主從復(fù)制:
# 主從服務(wù)器安裝克隆插件
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
# 寫入my.cnf配置文件
[mysqld]
plugin-load-add=mysql_clone.so
# 查看插件狀態(tài) 確認(rèn)為 ACTIVE
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'clone';
+------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------+---------------+
| clone | ACTIVE |
+------------------------+---------------+
# 從節(jié)點(diǎn)執(zhí)行遠(yuǎn)程克隆
# 遠(yuǎn)程克隆語(yǔ)法:
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
DATA DIRECTORY:是一個(gè)可選子句,用于在接收端指定要克隆的數(shù)據(jù)的目錄。
如果不想刪除接受方原數(shù)據(jù)目錄中的現(xiàn)有數(shù)據(jù),可以使用此選項(xiàng)修改數(shù)據(jù)copy的目錄,必須有絕對(duì)路徑,且目錄必須不存在。
不指定的話,則默認(rèn)克隆到接受方的數(shù)據(jù)目錄下。
# 執(zhí)行克隆操作,用戶需要有BACKUP_ADMIN權(quán)限,建議使用管理員賬號(hào)
mysql> CLONE INSTANCE FROM 'root'@'172.16.255.49':3306 IDENTIFIED BY 'xxxxxxx';
Query OK, 0 rows affected (12.40 sec)
# 克隆完成后 數(shù)據(jù)庫(kù)服務(wù)會(huì)自動(dòng)重啟,再次進(jìn)入查看克隆狀態(tài)
mysql> select * from performance_schema.clone_status\G;
*************************** 1. row ***************************
ID: 1
PID: 0
STATE: Completed
BEGIN_TIME: 2024-07-03 16:41:34.473
END_TIME: 2024-07-03 16:41:56.788
SOURCE: 172.16.255.49:3306
DESTINATION: LOCAL INSTANCE
ERROR_NO: 0
ERROR_MESSAGE:
BINLOG_FILE: bin-log.000007
BINLOG_POSITION: 153538
GTID_EXECUTED: 4bab9d8c-0ea8-11ef-a209-0050569c2bf5:1-380
# 狀態(tài)無(wú)誤后,從庫(kù)即可開啟主從復(fù)制
mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='172.16.255.49',
-> SOURCE_PORT = 3306,
-> SOURCE_USER='repl',
-> SOURCE_PASSWORD='xxxx',
-> MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected, 3 warnings (0.05 sec)
mysql> start REPLICA;
Query OK, 0 rows affected (0.02 sec)
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 172.16.255.49
Source_User: repl
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: bin-log.000007
Read_Source_Log_Pos: 154754
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 414
Relay_Source_Log_File: bin-log.000007
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
自己做過(guò)一遍才發(fā)現(xiàn),使用克隆插件搭建主從真的方便快速很多,原來(lái)搭建主從至少需要源端備份+目標(biāo)端恢復(fù)兩個(gè)步驟,遇到數(shù)據(jù)庫(kù)比較大的情況將非常耗時(shí)。而有了克隆插件,只需一條命令即能實(shí)現(xiàn)物理克隆,確實(shí)方便快速很多。
其實(shí) MySQL 克隆插件使用場(chǎng)景還有很多,下面列舉幾種使用場(chǎng)景:
- 快速構(gòu)建測(cè)試環(huán)境:在開發(fā)和測(cè)試環(huán)境中快速創(chuàng)建與生產(chǎn)環(huán)境數(shù)據(jù)一致的數(shù)據(jù)庫(kù)副本,以進(jìn)行功能測(cè)試、性能測(cè)試等。
- 災(zāi)難恢復(fù):在數(shù)據(jù)庫(kù)發(fā)生故障時(shí),可以快速?gòu)膫浞莼蛄硪粋€(gè)健康實(shí)例克隆數(shù)據(jù),以減少恢復(fù)時(shí)間和業(yè)務(wù)中斷。
- 數(shù)據(jù)庫(kù)遷移:在升級(jí)硬件、切換服務(wù)器時(shí),使用克隆插件可以快速遷移數(shù)據(jù)而無(wú)需長(zhǎng)時(shí)間的停機(jī)。
- 水平擴(kuò)展:在數(shù)據(jù)庫(kù)需要增加讀取能力時(shí),可以快速克隆數(shù)據(jù)庫(kù)到新的服務(wù)器上,作為只讀從庫(kù)。
- 數(shù)據(jù)庫(kù)物理備份:克隆插件可以用于構(gòu)建本地或遠(yuǎn)程的熱備節(jié)點(diǎn),以提高數(shù)據(jù)的可用性和容錯(cuò)能力。
總結(jié):
綜上所述,MySQL 克隆插件適用于需要快速、高效地復(fù)制數(shù)據(jù)庫(kù)的場(chǎng)景,尤其是在對(duì)數(shù)據(jù)一致性、速度和停機(jī)時(shí)間敏感的應(yīng)用中。然而,其使用也受限于一定的條件和環(huán)境,因此在具體應(yīng)用時(shí)需充分評(píng)估其適用性和局限性。
參考: