文章目录
GTID主从
GTID主从简介
GTID是基于mysql生成的事务ID,由服务器ID和事务ID组成。
这个ID在主库及从库上都是唯一的。
这个特性可以让mysql的主从复制变得更加简单,一致性更加可靠。
GTID优势
- 更简单的实现同步,不需要再找log_file和log_pos
- GTID是连续的,没有中断,数据一致性高,不会发生丢失
- 搭建主从更简单
- 比传动主从更安全
GTID劣势
- 不支持主从关系中存在非事务数据库
- 不支持CREATE TABLE … SELECT语句
- 不支持针对临时表的操作:
- 开启 GTID 后不能再使用原来的传统的复制方式;
GTID与传统主从的区别
传统主从请参照传统主从
GTID比传统复制的优势:
1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
2、更简单的搭建主从复制。
3、比传统复制更加安全。
4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术.
MySQL5.6之后增加了GTID复制,GTID就是类似于pos的一个作用,不过它是整个mysql复制架构全局通用的,就是说在这整个mysql冗余架构中,它们的日志文件里事件的GTID值是一致的
两者都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的.
如果使用的是pos,三者的pos不一致,slave2怎么去获取它当前要同步的事件在slave1里的pos呢,很难.
所以就有了GTID,全局的,将所有节点对于同一个event的标记完全一致,当master crash掉之后,slave2根据同一个GTID直接去读取slave1的日志文件,继续同步.
GTID主从配置
环境说明:
数据库角色 | IP | 应用与系统版本 | 有无数据 |
---|---|---|---|
主数据库 | 192.168.96.129 | centos8/redhat8 mysql-5.7 | 无数据 |
从数据库 | 192.168.96.133 | centos8/redhat8 mysql-5.7 | 无数据 |
从数据库 | 192.168.96.134 | centos8/redhat8 mysql-5.7 | 无数据 |
1 mysql安装
分别在主从三台服务器上安装mysql-5.7
版本,此处略过安装步骤,若有疑问请参考MySQL5.7安装
2先把三台服务器的防火墙关闭
#主
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; v>
Active: inactive (dead)
Docs: man:firewalld(1)
May 11 22:30:55 localhost.localdomain systemd[1]: Starting firewalld - dy>
May 11 22:30:56 localhost.localdomain systemd[1]: Started firewalld - dyn>
May 11 22:30:57 localhost.localdomain firewalld[932]: WARNING: AllowZoneD>
May 11 23:10:02 localhost.localdomain systemd[1]: Stopping firewalld - dy>
May 11 23:10:03 localhost.localdomain systemd[1]: firewalld.service: Succ>
May 11 23:10:03 localhost.localdomain systemd[1]: Stopped firewalld - dyn>
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
#从1
[root@localhost ~]# systemctl stop firewalld
[root@