一 、gtid简介
gtid(global transaction identifier,统一事务标志符),是MySQL 5.6 的新特性之一。全局事务 ID 的官方定义是:GTID = source_id:transaction_id,其中source_id表示执行事务的主库 uuid(server_uuid),数据保存在auto.cnf 文件 ,transaction_id 是一个从 1 开始的自增计数,表示在这个主库上执行的第 n 个事务,MySQL 会保证事务与 GTID 之间的 1 : 1 映射。
二、gtid方式和传统复制模式的区别
1)在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后change master to指向新的master,比较麻烦,也容易出错;
2)gtid复制方式不用找binlog和pos点,只需要知道master的ip、端口、账号密码就行。因为复制是自动的,MySQL会通过内部机制GTID自动找点同步;
3)传统复制方式slave的复制是单线程的,一个事件一个事件的读取应用,但master是并发写入的,所以会造成从数据库的数据延时;
4)gtid复制方式是多线程复制(基于库),可以把多个表放在多个库,这样就可以使用多线程复制,当只有1个库,多线程复制是没有用的。
三、搭建master-slave环境
1)准备安装3台mysql服务器,1台master、2台slave。master服务器的服务名为mysqlmaster,二台slave服务器的服务名分贝为mysqlslave、mysqlslave2;
2)修改master服务器的my.ini文件,我的配置文件的内容是
[mysqld]
innodb_buffer_pool_size = 128M
server-id=1
log-bin=master-bin.log
log-slave-updates=true
#开启gtid
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
#解决重启服务器时,数据重复问题
sync-master-info=1
#设置从服务器复制线程数
slave-parallel-workers=2
#设置binlog校验算法(循环冗余校验码)
binlog-checksum=CRC32
#设置主服务器是否校验
master-verify-checksum=1
#设置从服务器是否校验
slave-sql-verify-checksum=1
binlog-rows-query-log-events=1
#mysql安装位置
basedir=D:\mysqlcuster\mysqlmaster
#mysql数据存放位置
datadir=D:\mysqlcuster\mysqlmaster\data
#mysql端口号
port=3307
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#服务端的编码方式
character-set-server=utf8
[client]
port=3307
default-character-set=utf8
3)修改slave服务器的my.ini文件,以mysqlslave为例
[mysqld]
innodb_buffer_pool_size = 128M
server-id=2
log-bin=slave-bin.log
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log-events=1
basedir=D:\mysqlcuster\mysqlslave
datadir=D:\mysqlcuster\mysqlslave\data
port=3308
#设置从节点只读,防止从节点写入数据,导致主从数据库数据不一致
read_only=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#服务端的编码方式
character-set-server=utf8
[client]
port=3308
default-character-set=utf8
4)分别启动mysqlmaster、mysqlslave、mysqlslave2服务;
5)在mysqlmaster服务器执行grant replication slave on *.* to [email protected] identified by 'repl_password';创建数据同步使用的账号;
5)分别登录3台服务器。在mysqlslave、mysqlslave2服务器中设置主服务器信息,运行
change master to
master_host='127.0.0.1',
master_port=3307,
master_user='repl_user',
master_password='repl_password',
master_auto_position=0;
命令,之后再运行start slave;查看slave节点的状态show slave status;
不过在安装过程中遇到了一个问题,错误日志为
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but themaster has purged binary logs containing GTIDs that the slave requires.
通过修改slave服务器的gtid_executed、GTID_PURGED的值解决的
问题及解决方法的源url地址:https://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/
6)测试