基础知识
GTID
GTID全称(Global Transaction Identifier) 全局事务标识
长这样 source_id:transaction_id
每个mysql-server实例,会有一个自己唯一的uuid,也就是source_id,每次在这个实例上提交一个事务,transaction_id就会+1,默认是从1开始计数
可以通过show variables like 'server%';来查看当前server的一些信息
show variables like 'server%';
+----------------+--------------------------------------+
| Variable_name | Value |
+----------------+--------------------------------------+
| server_id | 239 |
| server_id_bits | 32 |
| server_uuid | 7e9d00b7-e083-11e6-8ae0-005056923d77 |
+----------------+--------------------------------------+
show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.27.238
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 386868694
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 386868904
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 386868694
Relay_Log_Space: 386869109
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 238
Master_UUID: 1b8c5a6f-e083-11e6-8add-0050569206a1
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 1b8c5a6f-e083-11e6-8add-0050569206a1:1-853
Executed_Gtid_Set: 1b8c5a6f-e083-11e6-8add-0050569206a1:1-853
Auto_Position: 1
GTID的生命流程
在事务被server应用之前,会被分配一个GTID,在事务本身写入binlog之前,会先将这个GTID写入binlog
当master的binlog被传送到slave(应该是由slave的io thread负责向master拉取),并写入slave的relay log。之后slave读取这个GTID,将此值设置到gtid_next系统变量中,这个作用就是告诉slave下一个要被执行的事务必须是用这个GTID标记的
slave检查这个GTID,并且确保此GTID并没有在本slave实例中执行过。当且仅当此GTID与gtid_next值相同,且没有被本slave执行过,slave就会将GTID和相应的事务写入它自己的binlog中并且执行相应的事务。通过这种执行事务之前的GTID检查,slave能够保证之前没有这个GTID被执行过,并且没有其他会话读取了这个GTID但是没提交事务。换言之,多个client是不允许并发的应用同一个事务。
搭建步骤
修改my.cnf配置文件
[mysqld]
max_connections=1000
gtid_mode=on
enforce_gtid_consistency=on
#唯一的服务辨识号,数值位于 1 到 2^32-1之间.
server_id=1
log-bin=mysql-bin
log-slave-updates=1
binlog_format=row
#当binlog_format=row时,用于记录原始的sql语句
binlog_rows_query_log_events=on
init-connect='SET NAMES utf8'
collation_server=utf8_general_ci
character_set_server=utf8
# 记录慢速查询
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
# 慢查询最小值,大于此时间,则为慢查询,单位为秒
long_query_time=6
创建用于同步的用户slave,如果是要做双主双向同步的,只需要在其中一台主上执行下面的操作,备机再做slave 这台主,就会同步相应操作,然后在备机上再执行change master 就可以做到双向同步了。(如果一开始就在两台机器上各自做了create操作,那会操作在同步的时候发现无法创建用户等问题,因为已经存在用户了,就要人工手动一个个去跳过gtid
create user 'slave'@'192.168.27.%' identified by 'slave123#@!';
grant replication slave on *.* to 'slave'@'192.168.27.%';
flush privileges;
配置master信息
change master to master_host='192.168.27.239', master_user='slave', master_password='slave123#@!',master_auto_position=1;
start slave;
如果需要重装mysql,记得需要把(默认数据存放路径)/var/lib/mysql下的文件删除,否则重新安装之后,如果没有改数据目录,会继续读取之前的数据库及slave同步信息等。