天天看點

資料庫同步别再主從和備份遷移了,來試試克隆操作吧~

作者:老男孩IT教育

資料庫克隆概念介紹

在資料庫MySQL 8.0(8.0.17+)版本中,引入了資料庫的克隆功能,主要是借助clone-plugin實作的,是對資料頁底層克隆;

克隆的資料是InnoDB存儲引擎中的實體快照資訊,包括schemas, tables, tablespaces, and data dictionary metadata;

在資料庫中出現克隆功能,主要是為了滿足目前雲原生的技術應用場景,同時也是為了海量資料備份而誕生的;

在資料庫中實作克隆功能應用有兩種方式:

本地克隆(Local Cloning):

啟動克隆操作的MySQL資料庫伺服器執行個體中的資料,将會克隆到同伺服器或同節點上的一個目錄裡;

資料庫同步别再主從和備份遷移了,來試試克隆操作吧~

遠端克隆(Remote Cloning):

預設情況下,遠端克隆操作會删除接受者(recipient)資料目錄中的資料,并将其替換為捐贈者(donor)的克隆資料;

也可以将資料克隆到接受者的其他目錄中,以避免删除現有資料;(屬于可選操作);

主要用于實作資料遠端的快速熱遷移操作,在遷移過程中,除了DDL操作情況,其他操作都不會出現阻塞情況;

還可以利用遠端克隆技術,實作快速建構資料庫的主從架構環境,實作主從資料資訊快速複制同步;

資料庫同步别再主從和備份遷移了,來試試克隆操作吧~

2. 資料庫克隆原理說明

在進行資料庫克隆操作時,會經曆幾個重要的過程或步驟:

01 Page copy

在進行資料頁複制操作時,會涉及到兩個操作動作:

開啟redo archiving功能,從目前點開始存儲新增的redo_log,這樣從目前位置點開始所有的增量修改都不會丢失;

同時上一步在page track的page被發送到目标端,確定目前位置點之前所有做的變更一定發送到目标端;

關于redo archiving實際上這是官方早就存在的功能,主要用于官方的企業級備份工具,clone利用了該特性來維持記錄增量産生的redo

在開始克隆前會做一次checkpoint;

對于redo archiving功能應用,會開啟一個背景線程log_archiver_thread()來做日志歸檔;

當有新的寫入時(notify_about_advanced_write_lsn),也會通知線程去進行歸檔,當arch_log_sys處于活躍狀态時

線程會控制日志寫入以避免未歸檔的日志被覆寫(log_write_wait_on_archiver),注意如果log_write等待時間過長的話,archive任務會被中斷掉;

02 Redo copy

停止redo archiving功能,所有歸檔的日志被發送到目标端,這些日志包含了從page copy階段開始到現在的所有日志;

另外可能還需要記下目前的複制點,例如:最後一個事務送出時的binlog位置點或者gtid資訊,在系統頁中可以找到;

03 Done

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

克隆原理過程分析參考連結:https://zhuanlan.zhihu.com/p/437760913

說明:整個克隆過程都會以事件資訊記錄,可以很清晰的看到克隆的流程,如果克隆過程中斷,也會以追加方式進行繼續克隆;

在進行克隆功能應用時,也是存在一些限制性操作的:(結合官方列出的限制)

對于MySQL 8.0.27之前版本,在進行克隆操作期間,是不允許在捐贈者和接受者上進行DDL操作,包括:truncate table操作;

對于MySQL 8.0.27之後版本,在捐贈者上預設允許并發DDL操作,對于捐贈者上并發DDL的支援由clone_block_DDL變量控制;

對于不同版本的MySQL資料庫執行個體之間,是不能進行克隆操作的。對于捐贈者和接受者必須是确切相同資料庫服務版本;

例如:你不能克隆資料在between MySQL 5.7 and MySQL 8.0. or between MySQL 8.0.19 and MySQL 8.0.20;

這個克隆功能隻支援在資料庫8.0.17版本或之後的版本

參考官方連結說明:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-limitations.html

3. 資料庫克隆功能實踐

實作本地克隆操作過程:

克隆需求:實作快速建立和源資料庫服務一模一樣的多執行個體服務程式;

克隆操作步驟01:加載克隆插件資訊

# 進行克隆插件加載配置
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或者
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
# 檢視克隆插件加載情況
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+------------------+----------------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------+----------------------+
| clone | ACTIVE |
+------------------+----------------------+
1 row in set (0.00 sec)           

克隆操作步驟02:建立克隆專用使用者

mysql> create user clone_user@'%' identified by 'password';
mysql> grant backup_admin on *.* to 'clone_user';
-- backup_admin權限是mysql 8.0才有的備份鎖的權限;           

克隆操作步驟03:進行本地克隆操作

[root@xiaoQ-01 ~]# mkdir -p /data/test
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/
[root@xiaoQ-01 ~]# mysql -uclone_user -ppassword
mysql> clone local data directory = '/data/test/clonedir';
-- 完成本地資料庫目錄的克隆操作           

克隆操作步驟04:觀測本地克隆狀态

mysql> select stage,state,end_time from performance_schema.clone_progress;
+---------------+----------------+-----------------------------------+
| stage | state | end_time |
+---------------+----------------+-----------------------------------+
| DROP DATA | Completed | 2022-11-28 01:11:17.715901 |
| FILE COPY | Completed | 2022-11-28 01:11:17.752819 |
| PAGE COPY | Completed | 2022-11-28 01:11:17.756830 |
| REDO COPY | Completed | 2022-11-28 01:11:17.757802 |
| FILE SYNC | Completed | 2022-11-28 01:11:17.912679 |
| RESTART | Not Started | NULL |
| RECOVERY | Not Started | NULL |
+---------------+----------------+-----------------------------------+
7 rows in set (0.00 sec)
-- 當克隆資料量比較大的時候,可以使用此SQL語句進行克隆狀态檢視           

克隆操作步驟05:實作克隆日志觀測

mysql> set global log_error_verbosity=3;
[root@xiaoQ-01 ~]# tail -f db01.err
mysql> clone local data directory = '/data/test/clonedir'           

克隆操作步驟06:啟動運作克隆執行個體

[root@xiaoQ-01 ~]# mysqld_safe --datadir=/data/test/clonedir --port=3333 --socket=/tmp/mysql3333.sock --user=mysql --mysqlx=off &
[root@xiaoQ-01 ~]# netstat -lntup|grep 3333
tcp6 0 0 :::3333 :::* LISTEN 52674/mysqld           

實作遠端克隆操作過程:

在進行實作遠端克隆操作步驟之前,可以利用虛拟軟體再次克隆出一台新的資料庫8.0版本的伺服器主機;

克隆操作步驟01:克隆操作環境準備

# 在克隆接收者主機上清理資料庫服務環境:
[root@xiaoQ-02 ~]# pkill mysqld
[root@xiaoQ-02 ~]# rm -rf /data/3306/data/*
[root@xiaoQ-02 ~]# rm -rf /data/3306/binlog/*
[root@xiaoQ-02 ~]# rm -rf /data/3306/logs/*
# 在克隆接收者主機上進行執行個體初始化操作:
[root@xiaoQ-02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@xiaoQ-02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
-- 修改克隆接收者主機上的server_id的配置資訊
# 在克隆接收者主機上進行執行個體的運作操作:
[root@xiaoQ-02 ~]# /etc/init.d/mysqld start           

克隆操作步驟02:加載克隆插件資訊

# 進行克隆插件加載配置
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或者
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
-- 克隆插件資訊需要在克隆主機的捐贈者和接受者上都進行安裝
# 檢視克隆插件加載情況
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+------------------+----------------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------+----------------------+
| clone | ACTIVE |
+------------------+----------------------+
1 row in set (0.00 sec)
-- 克隆插件資訊需要在克隆主機的捐贈者和接受者上都進行安裝後确認           

克隆操作步驟03:建立克隆專用使用者

# 在克隆捐贈者主機上進行授權(資料庫01主機上設定)
mysql> create user test_jz@'%' identified by 'password';
mysql> grant backup_admin on *.* to test_jz@'%' ;
-- backup_admin權限是mysql 8.0才有的備份鎖的權限;
# 在克隆接收者主機上進行授權(資料庫02主機上設定)
mysql> create user test_js@'%' identified by 'password';
mysql> grant clone_admin on *.* to test_js@'%' ;
-- clone_admin權限是mysql 8.0才有的克隆同步資料的權限;           
說明:可以在克隆捐贈者主機上和接收者主機上均建立兩個使用者資訊,防止克隆同步資料後,接收者主機上不再含有接收使用者資訊;

克隆操作步驟04:進行遠端克隆操作

# 在克隆接收者主機上進行設定
mysql> set global clone_valid_donor_list='192.168.30.101:3306';
-- 設定克隆同步資料的信任清單
# 在克隆接收者主機上進行克隆
[root@xiaoq-02 ~]# mysql -utest_js -ppassword -h192.168.30.102 -P3306
mysql> clone instance from test_jz@'192.168.30.101':3306 identified by 'password';
-- 在接收者主機上實作遠端克隆操作           

克隆操作步驟05:觀測本地克隆狀态

mysql> select stage,state,end_time from performance_schema.clone_progress;
+---------------+----------------+-----------------------------------+
| stage | state | end_time |
+---------------+----------------+-----------------------------------+
| DROP DATA | Completed | 2022-11-29 00:15:34.002378 |
| FILE COPY | Completed | 2022-11-29 00:15:35.218397 |
| PAGE COPY | Completed | 2022-11-29 00:15:35.225659 |
| REDO COPY | Completed | 2022-11-29 00:15:35.229777 |
| FILE SYNC | Completed | 2022-11-29 00:15:35.773431 |
| RESTART | Completed | 2022-11-29 00:15:39.189607 |
| RECOVERY | Completed | 2022-11-29 00:15:39.978301 |
+---------------+----------------+-----------------------------------+
7 rows in set (0.00 sec)
-- 當克隆資料量比較大的時候,可以使用此SQL語句進行克隆狀态檢視,在克隆接收者主機上進行檢視
mysql> show databases;
-- 此時克隆接收者主機上檢視到的資料資訊,與克隆捐贈者主機上檢視到的資料資訊一緻,即遠端克隆操作完成           

老男孩教育Linux運維雲計算課程彙集了虛拟化、雲計算、安全攻防、Python開發、SRE等技術,課堂效率高、内容豐富全面,由淺入深,循序漸進,幫助學員穩紮穩打,夯實基礎,在有限的時間内幫助學員高效提升,成為符合企業需求的技術型人才。

需要擷取資料配套視訊教程的小夥伴

評論區回複‘666’or背景絲我哦~

繼續閱讀