mysql8 进阶(四) 主从复制之 GTID 复制实践

GTID复制实践

      • 1、准备工作
        • 1.1 信息概览
        • 1.2 创建挂载目录及配置文件
        • 1.3 master
        • 1.4 Slave
      • 2、启动容器
        • 2.1 拉取镜像
        • 2.2 启动 Master
        • 2.3 启动 Slave
      • 3、启动复制
        • 3.1 Master
        • 3.2 Slave
        • 3.3 验证

本文主要介绍如何搭建一个 GTID 主从复制,关于其原理,在后续文章中介绍。

1、准备工作

1.1 信息概览

Mysql 版本:8.0.12
本次实验类似于搭建异步复制那样,我们准备两个 Mysql 节点,一个用作 Master 节点,一个用作 Slave 节点。如果想部署多个 Slave 节点,操作都是一致的。

节点 容器名 挂载目录 端口
Master mysql-gtid-master /usr/share/mysql/gtid/master 3306
Slave mysql-gtid-slave /usr/share/mysql/gtid/slave 3316
1.2 创建挂载目录及配置文件
mkdir -p /usr/share/mysql/gtid
cd /usr/share/mysql/gtid
mkdir master slave
1.3 master

创建 Master 的挂载目录:

cd /usr/share/mysql/gtid/master
mkdir log data conf mysql-files

创建 Master 的配置文件 my.cnf:

cd /usr/share/mysql/gtid/master/conf
touch my.cnf

将如下配置信息保存到 my.cnf 中:

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init_connect='set collation_connection=utf8mb4_unicode_ci; set names utf8mb4;'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server-id=1 
log-bin=mysql-bin
binlog-ignore-db=mysql
#GTID 复制时,binlog 使用 ROW 模式
binlog_format=row

#gtid 参数
gtid_mode=ON
enforce-gtid-consistency=ON

上述参数中,比较重要的参数介绍:
(1)、server-id:主从复制中必须的参数,且一个主从复制集群中是必须唯一的。
(2)、binlog_format=row :二进制日志的存储模式,GTID 复制时,使用 ROW 行模式。
这两个参数在异步复制中做过详细介绍。

(3)、 gtid_mode=ON:表示开启 GTID 模式的主从复制。如果 为 OFF ,则不启用 GTID 复制模式,而是普通的异步复制模式。

(4)、enforce-gtid-consistency=ON :表示开启强一致性,必须设置为 ON。

到此为止,Master 节点的准备工作就完成了。

1.4 Slave

创建 Slave 的挂载目录:

cd /usr/share/mysql/gtid/slave
mkdir log data conf mysql-files

创建 Slave 的配置文件 my.cnf:

cd /usr/share/mysql/gtid/slave/conf
touch my.cnf

将如下配置信息保存到 my.cnf 中:

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init_connect='set collation_connection=utf8mb4_unicode_ci; set names utf8mb4;'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server-id=2
log-bin=mysql-bin
binlog-ignore-db=mysql
#GTID 复制时,binlog 使用 ROW 模式
binlog_format=row

#gtid 参数
gtid_mode=ON
enforce-gtid-consistency=ON

Slave 的配置文件与 Master 的配置文件基本一致。
完成后 /usr/share/mysql/gtid 下的目录结构如下:
mysql8 进阶(四) 主从复制之 GTID 复制实践_第1张图片

2、启动容器

2.1 拉取镜像
docker pull mysql:8.0.12
2.2 启动 Master
docker run -p 3306:3306 --name mysql_gtid_master --restart=always --privileged=true \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/share/mysql/gtid/master/log:/var/log/mysql \
-v /usr/share/mysql/gtid/master/data:/var/lib/mysql \
-v /usr/share/mysql/gtid/master/conf:/etc/mysql \
-v /usr/share/mysql/gtid/master/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12
2.3 启动 Slave
docker run -p 3316:3306 --name mysql_gtid_slave --restart=always --privileged=true \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/share/mysql/gtid/slave/log:/var/log/mysql \
-v /usr/share/mysql/gtid/slave/data:/var/lib/mysql \
-v /usr/share/mysql/gtid/slave/conf:/etc/mysql \
-v /usr/share/mysql/gtid/slave/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12

执行后两个容器就启动完成了:
在这里插入图片描述

3、启动复制

GTID 复制与异步复制类似,需要在 Master 上创建一个复制用户,从节点 Slave 使用这个用户来连接到 Master 再开启复制即可

3.1 Master

进入 Master 容器:

docker exec -it mysql_gtid_master mysql -uroot -proot

在 Master 上创建用户:

create user 'gtid_repl'@'%' identified with mysql_native_password by '123456';
grant replication slave, replication client on *.* to 'gtid_repl'@'%';
flush privileges;
3.2 Slave

进入 Slave 容器:

docker exec -it mysql_gtid_slave mysql -uroot -proot

连接到 Master:

CHANGE MASTER TO MASTER_HOST='192.168.10.39',MASTER_PORT=3306,MASTER_USER='gtid_repl', MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;

在这里插入图片描述
这里的 MASTER_HOST=‘192.168.10.39’ 是我宿主机的 IP ,你就写你自己主机的 IP。也可以在创建 Master,Slave 容器的时候为他们指定 IP,这里就写你给 Master 容器指定的 IP 即可。

启动复制
在 Slave 节点中执行 start slave; 表示 Slave 的 I/O 线程将从 Master 节点中获取二进制日志文件,并执行后续的日志重放等。

start slave;

启动后,可查看 Slave 的状态:
mysql8 进阶(四) 主从复制之 GTID 复制实践_第2张图片
Slave 的 I/O 、SQL 线程都在 RUNNING 中,则说明 GTID 搭建成功了。若需要多个 Slave 节点加入复制,操作步骤与前面 Slave 一致。

stop salve; 可以使 Slave 退出主从复制,若仍需加入则执行 start slave; 即可。

3.3 验证

前面已经搭建了一主一从的 GTID 复制,现在在 Master 上添加一些数据,看是否能同步到 Slave 节点中。

在 Maste 节点上执行如下 sql 语句

create database test;

use test;

create table user ( id int NOT NULL AUTO_INCREMENT, name varchar(64), primary key(id) )engine=InnoDB auto_increment=1;

insert into user(id,name) values(1,'user1');

select * from user;

mysql8 进阶(四) 主从复制之 GTID 复制实践_第3张图片
进入 Slave 容器,查看数据:
mysql8 进阶(四) 主从复制之 GTID 复制实践_第4张图片
Slave 中已有 Master 中添加的数据,但还不能说明 GTID 复制搭建成功,因为这样还没有体现出 GTID 复制。
在从节点中执行 show slave status\G; 查看 GTID 复制信息:
mysql8 进阶(四) 主从复制之 GTID 复制实践_第5张图片
Retrieved_Gtid_Set 用于记录从节点已经接收到的 GTID 集合。
Executed_Gtid_Set 用于记录从节点已经 relay 成功的 GTID 集合。

如果这两个值一样,则说明基于 GTID 的主从复制搭建成功了

你可能感兴趣的:(mysql,mysql,数据库,database)