系列文章目录
第一章 Linux学习之MySQL传统主从同步
第二章 Linux学习之MySQL GTID主从同步
第三章 Linux学习之MySQL MHA高可用集群架构
第四章 Linux学习之MySQL MGR集群
第五章 Linux学习之MySQL mycat
第六章 Linux学习之MySQL Redis
第七章 Linux学习之MongoDB 主从同步
前言
linux学习之mysql的GTID主从同步,连接主库与一台从库。
一、什么是GTID?
概念:
从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID保证了每个在主库上提交的事务在集群中有一个唯一的ID。
这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
在原来基于二进制日志的复制,从库需要告知主库要从哪个偏移量进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
下面是一个GTID的具体形式:03a1eb63-c21a-11ec-b07f-000c2987bea6:1-25,冒号分割前边为UUID,后边为TID。
GTID 集合可以包含来自多个 MySQL 实例的事务,它们之间用逗号分隔。
如果来自同一MySQL实例的事务序号有多个范围区间,各组范围之间用冒号分隔。
例如: 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6,03a1eb63-c21a-11ec-b07f-000c2987bea6:1-25
可以使用show master status实时查看当前事务执行数。
原理:
①当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
②binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置GTID_next变量,即告诉Slave,下一个要执行的GTID值。
③sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
④如果有记录,说明该GTID的事务已经执行,slave会忽略。
⑤如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
⑥在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
环境:
角色 | IP | 主机名 |
---|---|---|
master | 192.168.10.11 | server11 |
slave | 192.168.10.12 | server12 |
二、实现步骤
1.配置主库
配置/etc/my.cnf:
log-bin=mysql-bin --------》开启二进制日志
server-id=11 --------》服务器ID,必须唯一
gtid-mode=on --------》开启gtid模式
enforce-gtid-consistency=on --------》强制gtid一致性,开启后对特定的create table不支持
binlog-format=row --------》默认为mixed混合模式,更改成row复制,为了数据一致性
log-slave-updates=1 --------》从库binlog记录主库同步的操作日志
skip-slave-start=1 --------》跳过slave复制线程
binlog-ignore-db=mysql
重启MySQL:
[root@server11 ~]# systemctl restart mysqld
在主数据库里创建一个同步账户授权给从数据库使用:
mysql> grant replication slave on *.* to 'repl'@'192.168.10.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
查看GTID模式状态:
[root@server11 ~]# mysql -uroot -p1234 -e 'show variables like "%GTID%";'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
2.配置从库
配置/etc/my.cnf:
log-bin=mysql-bin
server-id=12
gtid-mode=on
enforce-gtid-consistency=on
binlog-format=row
log-slave-updates=1
skip-slave-start=1
重启MySQL:
[root@server12 ~]# systemctl restart mysqld
查看GTID模式状态:
[root@server12 ~]# mysql -uroot -p1234 -e 'show variables like "%GTID%";'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
3.开启主从同步
使用GTID方式同步的时候,必须指定master_auto_position=1
GTID使用master_auto_position=1代替了基于binlog和position号的主从同步方式,更便于主从同步的搭建
[root@server12 ~]# mysql -uroot -p1234
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
master_host='192.168.10.11',
master_user='repl',
master_password='1234',
master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.11
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: server12-relay-bin.000002
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
......
1 row in set (0.00 sec)
查看主从库的信息是否同步:
查看主库
[root@server11 ~]# mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
查看从库
[root@server12 ~]# mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
4.测试主从同步
主库创建数据:
CREATE DATABASE BOOK;
USE BOOK;
CREATE TABLE book (name char(66),price int,pages int);
INSERT INTO book(name,price,pages) VALUES('Linux','30','666');
INSERT INTO book(name,price,pages) VALUES('Cloud Computing','60','666');
INSERT INTO book(name,price,pages) VALUES('Operation System','80','666');
INSERT INTO book(name,price,pages) VALUES('Artificial Intelligence','166','666');
select * from book;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| BOOK |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from BOOK.book;
+-------------------------+-------+-------+
| name | price | pages |
+-------------------------+-------+-------+
| Linux | 30 | 666 |
| Cloud Computing | 60 | 666 |
| Operation System | 80 | 666 |
| Artificial Intelligence | 166 | 666 |
+-------------------------+-------+-------+
4 rows in set (0.00 sec)
从库查看数据:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| BOOK |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from BOOK.book;
+-------------------------+-------+-------+
| name | price | pages |
+-------------------------+-------+-------+
| Linux | 30 | 666 |
| Cloud Computing | 60 | 666 |
| Operation System | 80 | 666 |
| Artificial Intelligence | 166 | 666 |
+-------------------------+-------+-------+
4 rows in set (0.00 sec)
查看状态:
#主库状态
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 | 1620 | | | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
#从库状态
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 | 1584 | | | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
从库停掉同步后,主库数据改变,从库连接后数据同步。
总结
本文介绍了MySQL的GTID主从同步,用于学习笔记。