Skip to content

数据库集群GTID同步复制

介绍

GTID(global transaction id)是对于一个已提交事务的唯一编号,并且是一个全局唯一编号(主从复制过程);

是数据库5.6版本开始的一个功能新特性,主要是用于解决主从复制的一致性问题;

复制原理机制:

  • master节点在更新数据的时候,会在事务前产生GTID信息,一同记录到binlog日志中;
  • slave节点的io线程将主库推送的binlog写入到本地relay log中;
  • 然后SQL线程从relay log中读取GTID,设置gtid_next的值为该gtid,然后对比slave端的binlog是否有记录;
  • 如果有记录的话,说明该GTID的事务已经运行,slave会忽略;
  • 如果没有记录的话,slave就会执行该GTID对应的事务,并记录到binlog中。

GITD环境配置

功能应用实践:

① 主从复制GTID功能实现环境:

为了实现GTID机制的主从复制,需要准备好主从架构环境:

主机角色主机名称地址信息
主库服务器db-01192.168.10.101
从库服务器db-02192.168.10.102
从库服务器db-03192.168.10.103

对原有数据库服务环境清理:

shell
# 在所有主从节点均进行清理操作:
[root@xiaoQ-01 ~]# pkill mysqld
[root@xiaoQ-01 ~]# rm -rf /data/3306/*
[root@xiaoQ-01 ~]# rm -rf /data/binlog/*
[root@xiaoQ-01 ~]# mv /etc/my.cnf /tmp
[root@xiaoQ-01 ~]# mkdir -p /data/3306/data /data/binlog
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
-- 所有数据库主从节点均进行以上清理操作;

主从复制GTID功能配置编写

② 主从复制GTID功能配置编写

shell
# 配置参数信息
gtid-mode=on
-- 启用gtid复制方式,默认采用传统的复制方式
enforce-gtid-consistency=true
-- 开启gtid所有节点的强制一致性,主要会限制 CREATE TABLE SELECT 类似语句的执行;
log-slave-updates=1
-- 定义slave更新是否记入二进制日志,从而增强数据一致性,是在高可用架构中重要配置环节

# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF

# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
#autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF

# 主库db03配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
#autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF

# 进行数据库所有节点初始化操作
[root@xiaoQ-01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@xiaoQ-02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@xiaoQ-03 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

# 启动数据库所有节点服务
[root@xiaoQ-01 ~]# /etc/init.d/mysqld start
[root@xiaoQ-02 ~]# /etc/init.d/mysqld start
[root@xiaoQ-03 ~]# /etc/init.d/mysqld start

主从操作

③ 主从复制GTID配置重构主从

shell
# 重构主从关系-主库操作
db01 [(none)]>create user repl@'192.168.30.%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)
db01 [(none)]>grant replication slave on *.* to repl@'192.168.30.%';
Query OK, 0 rows affected (0.00 sec)
-- 主库上创建主从复制用户信息

# 重构主从关系-从库操作
db02 [(none)]>change master to
master_host='192.168.10.103 ',
master_port=3307,
master_user='repl',
master_password='123456',
master_auto_position=1;
-- 表示让从库自己找寻复制同步数据的起点;
-- 在第一次启动gtid功能时,会读取从库中的binlog日志信息,根据主库uuid信息,获取从库中执行过的主库gtid信息
-- 从从库中没有执行过的主库gtid信息之后进行进行数据同步操作
db02 [(none)]> start slave;
-- 其他从库一并操作

感谢阅读,欢迎交流!