这里是系统是Centos7.6, MySQL版本8.0.24
目录结构
/mysql-gtid/
├── docker-compose.yml
├── master.cnf
├── slave.cnf
└── setup_gtid_replication.sh
1.docker-compase.yml
version: "3.8"
services:
mysql-master:
image: mysql:8.0.24
container_name: mysql-master
command:
- --server-id=1
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
- --log-bin=mysql-bin
- --binlog-format=ROW
- --default-authentication-plugin=mysql_native_password
volumes:
- master_data:/var/lib/mysql
- ./master.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: rootpass
ports:
- "3306:3306"
networks:
- mysqlnet
mysql-slave:
image: mysql:8.0.24
container_name: mysql-slave
depends_on:
- mysql-master
command:
- --server-id=2
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
- --log-bin=mysql-bin
- --relay-log=mysql-relay-bin
- --binlog-format=ROW
- --default-authentication-plugin=mysql_native_password
volumes:
- slave_data:/var/lib/mysql
- ./slave.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: rootpass
ports:
- "3307:3306"
networks:
- mysqlnet
networks:
mysqlnet:
volumes:
master_data:
slave_data:
2. master.cnf
[mysqld]
server-id=1
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
binlog-format=ROW
3. slave.cnf
[mysqld]
server-id=2
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
relay-log=mysql-relay-bin
binlog-format=ROW
4.setup_gtid_replication.sh
#!/bin/bash
set -e
M_MASTER="mysql-master"
M_ROOT="root"
M_ROOT_PWD="rootpass"
REPL_USER="repl"
REPL_PWD="replpass"
docker exec mysql-master mysql -u$M_ROOT -p$M_ROOT_PWD -e "
CREATE USER IF NOT EXISTS '$REPL_USER'@'%' IDENTIFIED WITH mysql_native_password BY '$REPL_PWD';
GRANT REPLICATION SLAVE ON *.* TO '$REPL_USER'@'%';
FLUSH PRIVILEGES;
"
docker exec mysql-slave mysql -u$M_ROOT -p$M_ROOT_PWD -e "
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='$M_MASTER',
SOURCE_USER='$REPL_USER',
SOURCE_PASSWORD='$REPL_PWD',
SOURCE_AUTO_POSITION=1,
GET_SOURCE_PUBLIC_KEY=1;
START REPLICA;
SHOW REPLICA STATUS\G
"
4的脚本内容可以自己在容器内手动执行。
可以手动指定source_host(主库的ip) 查看主从库的ip ,要使用主库的容器ip
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-slave
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master
5.验证测试
docker exec mysql-master mysql -uroot -prootpass -e "
CREATE DATABASE IF NOT EXISTS testgtid;
USE testgtid;
CREATE TABLE t(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
INSERT INTO t(name) VALUES('X'),('Y');
"
docker exec mysql-slave mysql -uroot -prootpass -e "
USE testgtid;
SELECT * FROM t;
"
