MySQL8.0新特性_02_Clone-plugin[支持版本8.0.17+]
0)引入
clone-plugin 需要使用版本要在 8017+后才可以使用,可以实现快速的进行数据同步,主从,MGR ,自愈,适应当今的云平台,docker k8s 等等的便利之处。同时又是物理的克隆,速度很快 。
有兴趣的可以查看官档仔细了解下.
官档: https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
1)Clone Plugin介绍
克隆提供了两种方式:本地克隆和远程克隆
本地克隆:
启动克隆操作的MySQL服务器实例中的数据,克隆到同服务器或同节点上的一个目录里
远程克隆:
默认情况下,远程克隆操作会删除接收者(recipient)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。您也可以将数据克隆到接收者的其他目录,以避免删除现有数据。(可选)
2)Clone Plugin原理
第一步:PAGE COPY (数据页拷贝)
这里有两个动作
第一个动作 ---> 开启 redo archiving 功能,从当前点开始存储新增的redo log,这样从当前点开始所有的增量修改都不会丢失。同时上一步在page track的page被发送到目标端。确保当前点之前所做的变更一定发送到目标端。
第二个动作 ---> 在开始前会做一次 checkpoint, 开启一个后台线程 log_archiver_thread() 来做日志归档。当有新的写入notify_about_advanced_write_lsn 也会通知它去archive。
当arch_log_sys处于活跃状态时,它会控制日志写入以避免未归档的日志被覆盖(log_writer_wait_on_archiver), 注意如果log_writer等待时间过长的话, archive任务会被中断掉.
说明:
关于redo archiving,实际上这是官方早就存在的功能,主要用于官方的企业级备份工具(MEP),但这里clone利用了该特性来维持增量修改产生的redo。
第二步:Redo Copy (redo拷贝)
停止Redo Archiving , 所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志,另外可能还需要记下当前的复制点,例如最后一个事务提交时的binlog位点或者gtid信息,在系统页中可以找到。
第三步:Done (完成)
目标端需要重启一次实例,通过crash recovery将redo log应用上去。建议使用mysqld_safe启动
3)Clone Plugin限制
管档:
https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-limitations.html
https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
克隆插件受以下限制:
1.DDL不允许在克隆操作期间。在选择数据源时应该考虑这个限制。一个解决方案是使用专用的donor实例,它可以容纳在复制数据时阻塞的DDL操作。允许并发DML。
2.不能从不同的MySQL服务器版本克隆一个实例。捐赠者和接受者必须拥有相同的MySQL服务器版本。例如,不能在MySQL 5.7和MySQL 8.0之间克隆。克隆插件仅在MySQL 8.0.17及更高版本中支持。
3.一次只能克隆一个MySQL实例。不支持在一次克隆操作中克隆多个MySQL实例。
4.不支持远程克隆操作的X协议端口
5.克隆插件不支持克隆MySQL服务器配置。
6.克隆插件不支持克隆二进制日志。
7.克隆插件只克隆存储在InnoDB中的数据。其他存储引擎数据未被克隆。
8.不支持通过MySQL路由器连接到donor MySQL server实例。
9.本地克隆操作不支持用绝对路径创建的通用表空间的克隆。与源表空间文件路径相同的克隆表空间文件将导致冲突。
The clone plugin is subject to these limitations:
* DDL, is not permitted during a cloning operation. This limitation should be considered when selecting data sources. A workaround is to use dedicated donor instances, which can accommodate DDL operations being blocked while data is cloned. Concurrent DML is permitted.
* An instance cannot be cloned from a different MySQL server version. The donor and recipient must have the same MySQL server version. For example, you cannot clone between MySQL 5.7 and MySQL 8.0. The clone plugin is only supported in MySQL 8.0.17 and higher.
* Only a single MySQL instance can be cloned at a time. Cloning multiple MySQL instances in a single cloning operation is not supported.
* The X Protocol port specified byis not supported for remote cloning operations
* The clone plugin does not support cloning of MySQL server configurations.
* The clone plugin does not support cloning of binary logs.
* The clone plugin only clones data stored in `InnoDB`. Other storage engine data is not cloned.
* Connecting to the donor MySQL server instance through MySQL Router is not supported.
* 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.
4)Clone Plugin应用-本地克隆
Clone Plugin应用-本地克隆
应用场景:
在1台主机上,多实例的环境,做主从的时候需要使用,要比 xbk 省事的多,直接clone 就可以了。
1)加载插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或 永久生效
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
查看插件加载状态
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
#ACTIVE 加载成功
2)创建克隆专用用户
CREATE USER clone_user@'%' IDENTIFIED by 'password';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
说明:
必须是 BACKUP_ADMIN 权限 才享有轻量的权限, BACKUP_ADMIN是MySQL8.0 才有的备份锁的权限
3)本地克隆
3.1 创建用于存储克隆数据的位置目录,不能和之前的数据路径一致
[root@db01 data]# mkdir -p /data/clone/
[root@db01 data]# chown -R mysql.mysql /data/clone/
3.2 使用专用的用户登陆到数据库,执行clone
mysql -uclone_user -ppassword
CLONE LOCAL DATA DIRECTORY = '/data/clone/3307';
说明:
/data/clone/clonedir "clonedir" 这个目录可以定制,这里就比如克隆到本地3307里面吧,在存储目录内自动生成目录并存储数据
3.3 查看克隆状态
mysql -uroot -p123
SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-------------+----------------------------+
| DROP DATA | Completed | 2021-01-12 23:53:13.929199 | #删除数据
| FILE COPY | Completed | 2021-01-12 23:53:14.948120 | #拷贝文件
| PAGE COPY | Completed | 2021-01-12 23:53:14.961490 | #拷贝数据页
| REDO COPY | Completed | 2021-01-12 23:53:14.962721 | #拷贝redo
| FILE SYNC | Completed | 2021-01-12 23:53:15.576960 | #传输文件
| RESTART | Not Started | NULL | #远程的话,重启远端实例
| RECOVERY | Not Started | NULL | #远程的话,执行类似故障恢复,将redo应用
+-----------+-------------+----------------------------+
拓展- 查看克隆全过程的日志配置方法:
mysql -uroot -p123
set global log_error_verbosity=3;
tail -f /data/3306/db01.err
CLONE LOCAL DATA DIRECTORY = '/data/clone/3308';
4)启动新实例
这个实例是可以直接构建主从的 ,有gtid的话 ,直接change master to 就可以了。
[root@db01 data]# mysqld_safe --datadir=/data/clone/3307 --port=3333 --socket=/tmp/mysql3333.sock --user=mysql --mysqlx=OFF &
[root@db01 data]# netstat -lntp | grep 3333
tcp6 0 0 :::3333 :::* LISTEN 40936/mysqld
[root@db01 data]# mysql -uroot -p123 -S /tmp/mysql3333.sock
登录后和原来的3306的库的数据都是一样的,配置参数,都是一样。
5)Clone Plugin应用-远程克隆
环境:
主机 | 版本 |
---|---|
db01-192.168.170.51 捐赠者 donor | mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL) |
db03-192.168.170.53 接收者 recipient | mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL) |
Clone Plugin应用-远程克隆
注意事项:
1. mysql版本要相同,8.0.X 以上版本
2. 需要2台机器,每次只能克隆1台主机
应用场景:
MHA架构中/MGR中,当一个down机后,快速克隆一个 加入到集群中。
1)加载插件 db01 db03 两台都需要加载插件,确保2台都是加载成功的状态
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或 永久生效
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
查看插件加载状态 db01 db03
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
#ACTIVE 加载成功
2)创建远程clone用户
2.1 授权 db01 捐赠者(donor)
create user backup_admin@'%' identified by '123';
grant backup_admin on *.* to backup_admin@'%';
grant backup_admin,clone_admin on *.* to backup_admin@'%'; #建议授权为这个 既可以克隆别人,又可以给别人克隆
2.2 授权 db03 接受者(recipient)
create user clone_admin@'%' identified by '123';
grant clone_admin on *.* to clone_admin@'%';
grant backup_admin,clone_admin on *.* to clone_admin@'%'; #建议授权为这个 既可以克隆别人,又可以给别人克隆
说明:
两端的用户权限都有各自专用的。
3) db03 指定远程clone列表
指定db03端去找db01端进行克隆,db01端为本次克隆的对象。
mysql
SET GLOBAL clone_valid_donor_list='192.168.170.51:3306';
4)db03 开始克隆,触发克隆命令clone instance
mysql -uclone_admin -p123 -h192.168.170.5153 -P3306
CLONE INSTANCE FROM backup_admin@'192.168.170.51':3306 IDENTIFIED BY '123';