主从复制之GTID复制

第1章 GTID介绍

1.1 什么是GTID

GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号

1.2 GTID的组成

GTID是由server_id:transaction_id
server_uuid是MySQL Server的只读变量,保存在数据目录下的auto.cnf中,可直接通过cat命令查看
transaction_id,同一个server_uuid下的transaction_id一般是递增的。如果一个事务是通过用户线程执行,那么MySQL在生成的GTID时,会使用它自己的server_uuid,然后再递增一个transaction_id作为该事务的GTID
例如:
GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29

第2章 GTID主从复制原理

1.1 基于主从复制的原理

1. 当一个事务在主库执行并提交时,产生GTID并一同记录到binlog日志中
2. binlog传输到从库后,并存储到从库的relay-log后,读取这个GTID的值并设置gtid_next,即告诉从库,下一个    要执行的GTID值
3. SQL线程从relay-log中获取GTID,然后对比从库是否有该GTID
4. 如果有,说明该GTID已经执行,从库会忽略
5. 如果没有,从库会执行该GTID的事务,并记录到自身的binlog中

第3章 GTID核心参数介绍

1.1 核心参数

gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1

1.2 核心参数说明

gtid-mode=on                        #启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true       #强制GTID的一致性
log-slave-updates=1                 #强制从库记录主库二进制日志,而不是记录自己的二进制日志

第4章 GTID复制的搭建

1.1 规划

主库

ip:10.0.1.27
port: 3306
server_id 27
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录   /data/error

从库1

ip:10.0.1.28
port: 3306
server_28
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录   /data/error

从库2

ip:10.0.1.28
port: 3306
server_id 29
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录   /data/error

1.2 创建相应的目录并授权

主库

mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*

从库1

mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*

从库2

mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*

1.4 编写配置文件

主库

vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#服务器ID号
server_id=27
#二进制日志
log_bin=/data/binlog/mysql-bin
#错误日志路劲
log_error=/data/error/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock

从库1

vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#服务器ID号
server_id=28
#二进制日志
log_bin=/data/binlog/mysql-bin
#错误日志路劲
log_error=/data/eror/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock

从库2

vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#关闭自动提交机制
autocommit=0
#服务器ID号
server_id=29
#二进制日志
log_bin=/data/binlog/mysql-bin
#二进制日志记录模式
binlog_format=row
#错误日志路劲
log_error=/data/error/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock

1.5 编写启动脚本

vim /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

1.6初始化数据

三台机器都执行

mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726  --datadir=/data/mysql/data 

1.7启动数据库

三台机器都执行

systemctl start mysqld

1.8 构建主从

主库创建复制用户并授权

grant replication slave  on *.* to repl@'10.0.1.%' identified by '123';

从库构建主关系(2台从库都执行)

change master to 
master_host='10.0.1.27',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;

开启线程(2台从库都执行)

start slave

1.8.1构建主从注意事项

这里是测试环境,因为没有数据,所有没有备份主库的数据在来导入从库,
实际生产中,要先备份主库的数据,然后在导入到从库
搭建GTID复制备份主库的数据时需要特别注意的事项,一定要确保--set-gtid-purged=on 或者不加(默认是开启的)
原因:
如果这个参数是--set-gtid-purged=off 从库导入数据的时候没有问题,但是IO线程去请求主库新的binlog信息,会把主库所有的binlog信息请求过来,当SQL线程回放的时候,会发现已经导入的数据有了,现在又要重新回放,这样就会导致GTID复制搭建不成功了
主库备份时加入这个参数目录就是为了告诉IO线程,从多少号开启请求从库没有的数据

第5章 GTID复制和普通复制的区别

CHANGE MASTER TO
MASTER_HOST='10.0.1.27',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=444,
MASTER_CONNECT_RETRY=10;

change master to 
master_host='10.0.1.27',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

(0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
(1)额外功能参数(3个)
(2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
(3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
(4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
    SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
    告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。

猜你喜欢

转载自www.cnblogs.com/yufenchi/p/12961686.html