0
点赞
收藏
分享

微信扫一扫

基于Docker部署MySQL 8.0.37的主从以及克隆(Clone)

1. MySQL 8.0.37的克隆(Clone)简介

MySQL 8.0.17推出的克隆插件允许在本地或从远程 MySQL 实例在线克隆数据,从此搭建从库不再需要使用备份工具(如PXB或mysqldump)。克隆的数据是InnoDB中的物理快照,包括库、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。

克隆插件支持两种克隆方式:

本地克隆:将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里。

远程克隆:默认情况下,远程克隆操作会删除接受者(recipientdsss)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。

可以选择将数据克隆到接受者的其他目录,以避免删除现有数据。

远程克隆和本地克隆操作克隆的数据没有区别。克隆插件支持复制。除克隆数据外,克隆操作还从捐赠者中提取并传输复制位置信息,并将其应用于接受者,从而可以使用克隆插件来配置组复制或主从复制。

使用克隆插件进行配置比复制大量事务更快且效率更高。


下面的实验是在一台mac笔记本上进行

官网地址:MySQL Clone Plugin

2. 初始化主从复制环境

Master: 172.72.0.80 (port: 3306) 捐赠者

Slave: 172.72.0.81 (port: 3306) 接受者

# 下载镜像

docker pull mysql:8.0.37

# 删除已存在的容器

docker rm -f mysql8037M1 mysql8037S1

# 创建MySQL参数文件路径以及数据持久化路径

mkdir -p /Users/$USER/mysql8037M1/{conf,data}
mkdir -p /Users/$USER/mysql8037S1/{conf,data}

# 创建docker-composer文件路径

mkdir -p /Users/$USER/mysql_clustr_type

# 创建一个名为 docker-compose.yml 的文件,并将以下内容添加到该文件中:

cat > /Users/$USER/mysql_clustr_type/docker-compose.yml <<"EOF"
services:
  mysql_master:
    image: mysql:8.0.37
    container_name: mysql8037M1
    hostname: mysql8037M1
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
    volumes:
      - /Users/$USER/mysql8037M1/conf:/etc/mysql/conf.d   # 配置文件路径
      - /Users/$USER/mysql8037M1/data:/var/lib/mysql      # 数据持久化路径
    ports:
      - "13380:3306"
    networks:
      mysql_network:
        ipv4_address: 172.72.0.80
  mysql_slave:
    image: mysql:8.0.37
    container_name: mysql8037S1
    hostname: mysql8037S1
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
    volumes:
      - /Users/$USER/mysql8037S1/conf:/etc/mysql/conf.d   # 配置文件路径
      - /Users/$USER/mysql8037S1/data:/var/lib/mysql      # 数据持久化路径
    ports:
      - "13381:3306"
    networks:
      mysql_network:
        ipv4_address: 172.72.0.81
networks:
  mysql_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.72.0.0/24
EOF

# 配置主库 my.cnf

cat > /Users/$USER/mysql8037M1/conf/my.cnf <<EOF
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=803713380
default-time-zone='+8:00'
log_timestamps=SYSTEM
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
skip-name-resolve
log_slave_updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
max_allowed_packet=500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=master-relay-bin
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=writeset
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave-preserve-commit-order=ON
bind-address=0.0.0.0
EOF

# 配置从库 my.cnf

cat > /Users/$USER/mysql8037S1/conf/my.cnf <<EOF
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=803713381
read-only=on
default-time-zone='+8:00'
log_timestamps=SYSTEM
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
skip-name-resolve
log_slave_updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
max_allowed_packet=500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=slave1-relay-bin
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=writeset
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave-preserve-commit-order=ON
bind-address=0.0.0.0
EOF

# 启动容器

cd /Users/$USER/mysql_clustr_type
docker-compose up -d

基于Docker部署MySQL 8.0.37的主从以及克隆(Clone)_mysql

# 重启主从环境

docker restart mysql8037M1 mysql8037S1

  1. 使用Clone技术搭建主从复制

3.1. 主库和从库都创建复制用户和克隆用户

# 主库

mysql -uroot -p123456 -h172.72.0.80 -P3306


# 从库

mysql -uroot -p123456 -h172.72.0.81 -P3306



-- 创建复制用户(主从都要创建)

CREATE USER repl@'%' IDENTIFIED BY 'aabb1122';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;


-- 创建克隆用户(主从都要创建)

CREATE USER 'clone_user'@'%' IDENTIFIED BY 'aabb1122';
GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'clone_user'@'%';
FLUSH PRIVILEGES;

3.2. 创建测试数据库和表

-- 连接到主库

mysql -uroot -p123456 -h172.72.0.80 -P3306

-- 创建测试数据库和表

CREATE DATABASE ceshi1 CHARSET utf8mb4;
USE ceshi1;
CREATE TABLE student (
    no VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    sex VARCHAR(10) NOT NULL,
    birthday DATE,
    class VARCHAR(20)
);

-- 插入测试数据

INSERT INTO student VALUES
('101', 'Jerry', 'Male', '1997-09-01', '95033'),
('102', 'Tom', 'Male', '1995-10-02', '95031'),
('103', 'Mary', 'Female', '1996-01-23', '95033'),
('104', 'Eric', 'Male', '1996-02-20', '95033'),
('105', 'Susu', 'Female', '1995-02-10', '95031'),
('106', 'Tony', 'Male', '1994-06-03', '95031'),
('107', 'Ronaldo', 'Male', '1996-02-20', '95033'),
('108', 'Kimi', 'Male', '1995-02-10', '95031'),
('109', 'Sano', 'Male', '1994-06-03', '95031');

-- 验证数据插入成功

SELECT * FROM student;

3.3. 主库和从库安装克隆插件

-- 分别连接到主库和从库

mysql -uroot -p123456 -h172.72.0.80 -P3306
mysql -uroot -p123456 -h172.72.0.81 -P3306

-- 检查克隆插件是否已经安装(主从都要检查)

SELECT plugin_name, plugin_status FROM information_schema.plugins WHERE plugin_name = 'clone';

-- 如果未安装,执行以下命令安装克隆插件(主从都要安装)

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

3.4. 从库开始克隆

-- 连接到从库

mysql -uroot -p123456 -h172.72.0.81 -P3306

-- 设置克隆有效捐赠者

SET GLOBAL clone_valid_donor_list='172.72.0.80:3306';

-- 使用克隆用户进行克隆操作

CLONE INSTANCE FROM clone_user@'172.72.0.80':3306 IDENTIFIED BY 'aabb1122';

# 如果遇到错误 ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process),需要手动重启从库的容器

docker restart mysql8037S1

-- 完成克隆后,新节点mysqld进程会自动重启(原有数据会被自动 删除)

-- 状态查看

select * from performance_schema.clone_status;
select * from performance_schema.clone_progress;

4. 配置并启动主从复制

-- 连接到从库

mysql -uroot -p123456 -h172.72.0.81 -P3306

-- 配置主从复制

CHANGE REPLICATION SOURCE TO

source_host='172.72.0.80',

source_port=3306,

source_user='repl',

source_password='aabb1122',

source_auto_position=1;

-- 启动复制

START REPLICA;

-- 查看复制状态

SHOW REPLICA STATUS \G

5. 测试主从同步

-- 连接到主库

mysql -uroot -p123456 -h172.72.0.80 -P3306

-- 创建新的测试数据库和表

CREATE DATABASE ceshi2 CHARSET utf8mb4;
USE ceshi2 ;
CREATE TABLE teacher (
    no VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    sex VARCHAR(10) NOT NULL,
    birthday DATE,
    profession VARCHAR(20) NOT NULL,
    department VARCHAR(500) NOT NULL
);

-- 主库插入测试数据

INSERT INTO teacher VALUES
('804', 'Li Cheng', 'Male', '1958-12-02', 'Associate Professor', 'Computer Science Department'),
('856', 'Zhang Xu', 'Male', '1969-03-12', 'Lecturer', 'Electronic Engineering Department'),
('825', 'Wang Ping', 'Female', '1972-05-05', 'Assistant Lecturer', 'Computer Science Department'),
('831', 'Liu Bing', 'Female', '1977-08-14', 'Assistant Lecturer', 'Electronic Engineering Department');

-- 验证数据插入成功

SELECT * FROM teacher;

-- 连接到从库

mysql -uroot -p123456 -h172.72.0.81 -P3306

-- 验证数据同步成功

SELECT * FROM ceshi2.teacher;

举报

相关推荐

0 条评论