本文主要介绍如何搭建一个 GTID 主从复制,关于其原理,在后续文章中介绍。
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 |
mkdir -p /usr/share/mysql/gtid
cd /usr/share/mysql/gtid
mkdir master slave
创建 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 节点的准备工作就完成了。
创建 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 下的目录结构如下:
docker pull mysql:8.0.12
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
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
GTID 复制与异步复制类似,需要在 Master 上创建一个复制用户,从节点 Slave 使用这个用户来连接到 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;
进入 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 的状态:
Slave 的 I/O 、SQL 线程都在 RUNNING
中,则说明 GTID 搭建成功了。若需要多个 Slave 节点加入复制,操作步骤与前面 Slave 一致。
stop salve;
可以使 Slave 退出主从复制,若仍需加入则执行 start slave;
即可。
前面已经搭建了一主一从的 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;
进入 Slave 容器,查看数据:
Slave 中已有 Master 中添加的数据,但还不能说明 GTID 复制搭建成功,因为这样还没有体现出 GTID 复制。
在从节点中执行 show slave status\G;
查看 GTID 复制信息:
Retrieved_Gtid_Set
用于记录从节点已经接收到的 GTID 集合。
Executed_Gtid_Set
用于记录从节点已经 relay 成功的 GTID 集合。
如果这两个值一样,则说明基于 GTID 的主从复制搭建成功了。