MySQL5.7配置GTID主从---GTID介绍

一、什么是 GTID
GTID (Global Transaction Identifiers)是对于一个已提交事务的编号,事务的唯一编号,并且是一个全局唯一的编号。GTID 和事务会记录到 binlog 中,用来标识事务。
GTID 是用来替代以前 classic 复制方法,MySQL-5.6.2 开始支持 GTID,在 MySQL-5.6.10 后完善。
有了 GTID,一个事务在集群中就不再孤单,在每一个节点中,都存在具有相同标识符的兄弟们和它作伴,可以避免同一个事务,在同一个节点中出现多次的情况。
GTID 的出现,最直接的效果就是,每一个事务在集群中具有了唯一性的意义,这在运维方面具有更大的意义,因为使用 GTID 后再也不需要为了不断地找点而烦恼了,给 DBA 带来了很大的便利性。

GTID 组成:
GTID 是由 server_uuid:Sequence_Number 。
Server_Uuid:是一个 MySQL 实例的全局唯一标识;存放为在$datadir/auto.cnf
Sequence_Number:是 MySQL 内部的一个事务的编号,一个 MySQL 实例不会重复的序列号(保证服务器内唯一),也表示在该实例上已经提交事务的数量,并且随着事务提交而递增。
根据 GTID 可以知道事务最初是在哪个实例上提交的,方便故障排查和切换

cat /data/mysql/data/auto.cnf
[auto]
server-uuid=b3f31135-4851-11e8-b758-000c29148b03

二、GTID 主从复制原理

(1) 当一个事务在主库端执行并提交时,产生 GTID,一同记录到 binlog 日志中。
(2) binlog 传输到 slave,并存储到 slave 的 relaylog 后,读取这个 GTID 的这个值设置 gtid_next 变量,即告诉 Slave,下一个要执行的 GTID 值。
(3) sql 线程从 relay log 中获取 GTID,然后对比 slave 端的 binlog 是否有该 GTID。
(4) 如果有记录,说明该 GTID 的事务已经执行,slave 会忽略。
(5) 如果没有记录,slave 就会执行该 GTID 事务,并记录该 GTID 到自身的 binlog;
(6) 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

三、GTID 优势和限制

GTID 的优势:
(1) 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的。
(2) 简单的实现 failover,不用以前那样在需要找 log_file 和 log_pos。
(3) 更简单的搭建主从复制,确保每个事务只会被执行一次。
(4) 比传统的复制更加安全。
(5) GTID 的引入,让每一个事务在集群事务的海洋中有了秩序,使得 DBA 在运维中做集群变迁时更加方便,能够做到胸有成竹心中有数。

GTID 的限制:
因为基于 GTID 的复制依赖于事务,所以在使用 GTID 时,有些 MySQL 特性是不支持的。
(1) 不允许在一个 SQL 同时更新一个事务引擎和非事务引擎的表;
事务中混合多个存储引擎,就会产生多个 GTID。当使用 GTID 时,如果在同一个事务中,更新包括了非事务引擎(如 MyISAM)和事务引擎(如 InnoDB)表的操作,就会导致多个 GTID 分配给了同一个事务。
(2) 主从库的表存储引擎必须是一致的;
主从库的表存储引擎不一致,就会导致数据不一致。如果主从库的存储引擎不一致,例如一个是事务存储引擎,一个是非事务存储引擎,则会导致事务和 GTID 之间一对一的关系被破坏,结果就会导致基于 GTID 的复制不能正确运行;
(3) 不支持 create table … select 语句复制(主库直接报错)
由于使用基于行模式的复制时,create table ...select 语句会被记录为两个单独的事件(会生成两个 sql),一个是 DDL 创建表 SQL,一个是 insert into 插入数据的 SQL。由于 DDL 会导致自动提交,所以这个 sql 至少需要两个 GTID,但是 GTID 模式下,只能给这个 sql 生成一个 GTID,如果强制执行会导致和上面(2)中一样的结果。
(4) 在一个复制组中,必须要求统一开启 GTID 或是关闭 GTID;
(5) 开启 GTID 需要重启(5.6 需要,5.7 中不需要)
(6) 开启 GTID 后,就不能在使用原来的传统的复制方式;
(7) 不支持 create temporary table 和 drop temporary table 语句;
使用 GTID 复制时,不支持 create temporary table 和 drop temporary table ,但是在 autocommit=1 情况下可以创建临时表,MASTER 创建临时表不产生 GTID 信息,所以不会同步到 SLAVE 上,但是删除临时表时,产生 GTID 会导致主从复制中断。
(8) 不推荐在 GTID 模式的实例上进行 mysql_upgrade;
因为 mysql_upgrade 的过程要创建或修改系统表(非事务引擎),所以不建议在开启 GTID 的模式的实例上使用带有--write-binlog 选项的 mysql_upgrade;
(9) 不支持 sql_slave_skip_counter;

四、为什么要使用 GTID

比如以下M-S结构

S1→M←S2,当M宕机的时候,其中一台S就必须承担起M的责任,但是由于2台S之间没有关系,很难使S2成为S1的slave。

GTID 的存在方便了 Replication 的 Failover在 MySQL 5.6 GTID 出现之前 Replication failover 的操作过程:修改复制源的命令语法为:

mysql> CHANGE MASTER TO
MASTER_HOST=‘XXXX‘,
MASTER_USER=‘XXXX‘,
MASTER_PASSWORD=‘XXXXX‘,
MASTER_LOG_FILE=‘XXXXX‘,
MASTER_LOG_POS=XXXXX;
而比较麻烦的地方是:由于同一个事务在每台服务器上所在的 binlog 名字和 Postion 位置点都不一样,那么怎么找到 slave2 当前同步停止点,对应 New Master 的 master_log_file 和 Master_log_pos 是什么的时候就成为了难题。这也就是为什么 M-S 复制集群需要使用 MMM,MHA 这样的额外管理工具的一个重要原因。

其实也可以找到,只是比较麻烦,我们都知道主从复制环境中 master 的 binlog 复制到 slave 上后 事务执行时的时间戳是不变的,所有 slave 上同一个事务的时间戳都是相同的。可以根据这个时间戳定位到 Master_log_file 和 Master_log_pos。只是很费时间;麻烦。。。

GTID 出现之后:
在 MySQL 5.6 的 GTID 出现之后,处理这个问题就非常简单了。
由于同一个事务的 GTID 在所有的节点上都是一致的,那么根据 Slave 当前停止点的 GTID 就能唯一定位到 New Master 的 GTID。
更简单的是,由于 MASTER_AUTO_POSITION 功能的出现,我们都不需要知道 GTID 的具体值。直接使用

mysql> CHANGE MASTER TO
MASTER_HOST=‘XXXX‘,
MASTER_USER=‘XXXXX‘,
MASTER_PASSWORD=‘XXXXX‘,
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
命令就可以直接完成 failover 的工作了。使用 GTID 处理这个问题就简单很多。。

原文地址:https://www.cnblogs.com/yangyongchao/p/12335217.html

时间: 2024-10-02 11:03:41

MySQL5.7配置GTID主从---GTID介绍的相关文章

CentOS6.8下MySQL5.6.40基于GTID主从及多线程复制

大纲 一 GTID简介 二 环境准备 三 数据库的安装 四 基于GTID主从配置步骤 五 验证GTID复制功能 一 GTID简介 GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号.GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式3E11FA47-71CA-11E1-9E33-C80AA9429562:23更详

MySQL5.7在线开启/关闭GTID

MySQL5.7在线开启/关闭GTID 环境介绍 Part1:写在最前 截止本文撰写当日,MySQL5.7.16是官网的最新稳定版,本文将用MySQL5.7.16来进行演示.从MySQL5.6开始,支持了GTID复制模式,这种模式其实是把双刃剑,虽然容易搭建主从复制了,但使用不当,就容易出现一些错误,例如error 1236.在MySQL5.6如果开启GTID模式,需要在my.cnf中加入以下几个参数: ①log-bin=mysql-bin ②binlog_format=row ③log_sla

MySQL5.6 新特性之GTID

MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID 即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式: 4e659069-3cd8-11e5-9a49-001c4270714e:1-77 更具体的说明见 官方

MySQL5.6 新特性之GTID【转】

转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的

mysql主从介绍,准备工作,主配置,从配置,主从测试

主从介绍 MySQL主从又叫做Replication.AB复制.简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步. MySQL主从是基于binlog的,主上须开启binlog才能进行主从. 主从过程三个步骤 主将更改操作记录到binlog中 从将主的binlog事件(SQL语句)同步到本机并记录在relaylog中 从根据relaylog里面的SQL语句按顺序执行 该过程有三个线程,主上有一个logdump线程,用来和从的i/o线程传递binlog:从上

源码安装mysql5.6.20&&mysql主从设置(多实例做多个主从)

一.源码安装mysql5.6.20 1.编译环境安装 yum install wget gcc* make openssl openssl-devel openssl-clients -y && yum groupinstall "Development Libraries" -y 2.源码下载(软件见Linux部署源码包) wget -P /usr/local/src/ http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.

配置mysql主从步骤

在公司开发中,有时候为了缓解数据库压力,会把读写分开为两个数据库来操作,读为一个数据库,写为一个数据库,然后两个数据库做同步,这样能明显降低数据库的压力,下面给大家介绍如何进行mysql主从数据库配置(这里仅仅是配置主从,读写分离的功能需要服务器配置双数据源) 安装mysql解压版 1.1 设置了root用户的密码为smallming 1.2 把虚拟机克隆一份. 1.3 主从的ip 1.3.1 主:192.168.17.132 1.3.2 从:192.168.17.133 2.修改主数据库的my

windows和linux虚拟机配置mysql主从

mysql主从复制 1主从复制条件 1mysql版本必须一致且后台以服务运行 本次实验使用的mysql 版本均为mysql5.5 2同一网段要能ping通.注意本地windows和虚拟机配置互为主从时ip 为 双向ping通.linux与windows需要互相通信. 2配置文件 主从都配置在[mysqld]节点下 windows主机修改my.ini配置文件 linux从机修改my.cnf配置文件 windows主机配置 1.server-id=1 [必须]主服务器唯一ID 2.log-bin=自

httpd主配置文档的介绍及小练习

一.httpd 主配置文档的介绍/etc/httpd/conf/httpd.conf ### Section 1: Global Environment 全局环境 ServerRoot "/etc/httpd" 主服务程序在这个目录下 PidFile run/httpd.pid Pid 在主服务目录下的这个文件 Timeout 60 超时时间为60秒 KeepAlive Off 持久连接关闭 MaxKeepAliveRequests 100 最大连接数 KeepAliveTimeout