mysql基于GTID主从复制

概念

众所周知,传统的主从备份主要依赖于二进制日志文件位置的复制,也就是基于binlog+pos(binlog filename + position),pos每个主节点和从节点都不一样,这样会导致一个问题,在主节点down掉之后,其他从节点升为主节点,此时再进行主从复制,由于pos不一致的原因,导致很难保持数据一致性。从mysql5.6之后,支持基于GTID的方式进行主从复制(binlog+gtid),与传统复制最大的不同就是GTID和pos的不同,pos是基于每个主从节点的,而GTID是基于全局的。

工作原理

  • 当一个事务在主库提交时,会产生一个全局的GTID,并且记录到binlog中;
  • binlog传输到slave,并且写入到本地的relaylog中,即告诉Slave,下一个要执行的GTID值;
  • sql线程从relaylog中获取GTID,然后对比slave端的binlog中是否存在这个GTID,如果存在则忽略,如果不存在,则执行此GTID事务,并且保存GTID到自身的binlog中;

前提条件

  • mysql版本5.6++;
  • 不支持非事务数据库;
  • 不支持CREATE TABLE … SELECT语句(原因:会生成两个sql, 一个是DDL创建表SQL, 一个是insert into 插入数据的 sql; 由于DDL会导致自动提交, 所以这个sql至少需要两个GTID, 但是GTID模式下, 只能给这个sql生成一个GTID);
  • 在传统的主从复制中,slave端不用开启binlog;但是在GTID主从复制中,必须开启binlog;

主从配置

主机配置
# 主库配置
# 设置server_id,一般设置为IP,保证唯一就好
server_id=1

#开启gtid模式
gtid_mode=on

#强制gtid一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on

#通过同步产生的变化将记录在自己的binlog中,即可以当从也可以当主
log-slave-updates=1

#skip_slave_start=1

# 开启binlog,名字可以随意取
log-bin=mysql-master-binlog

## binlog日志格式,(mixed,statement,row,默认格式是statement)
#binlog日志格式,强烈建议,其他格式可能造成数据不一致
binlog_format=row

## 日志自动删除日期,默认值为0,表示不自动删除。
expire_logs_days=7

#要同步的数据库,无法指定多个库,逗号和复制多行都不行,5.7版本测试,在从库指定即可,从库可指定多个
#binlog-do-db=ride_share

## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql,information_schema,sys,performance_schema

#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
sync_binlog = 1

#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
#auto_increment_offset = 1

#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
#auto_increment_increment = 2
从机配置
# 从库配置
# 设置server_id,一般设置为IP,保证唯一就好
server_id=3

#开启gtid模式
gtid_mode=on

#强制gtid一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on

#通过同步产生的变化将记录在自己的binlog中,即可以当从也可以当主
log-slave-updates=1

#跳过启动复制
skip_slave_start=1

# 开启binlog,名字可以随意取
log-bin=mysql-slave-binlog

## binlog日志格式,(mixed,statement,row,默认格式是statement)
#binlog日志格式,强烈建议,其他格式可能造成数据不一致
binlog_format=row

## 日志自动删除日期,默认值为0,表示不自动删除。
expire_logs_days=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=all
#需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
#多个库不能使用,号连接,必须分行写,5.7版本测试是这样
replicate-do-db=ride_share
#replicate-do-db=test_data
#当只针对某些库的某张表进行同步时,多个不同库表,可以配置将上下两行多配置几个
#replicate-wild-do-table = ride_share.user

## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
replicate-ignore-db=mysql,information_schema,sys,performance_schema

多主多从

slave配置不变,加上这两行即可;

master_info_repository = table
relay_log_info_repository = table

每个主节点都需要授权用户给从节点;

grant replication slave on *.* to 'repl'@'%' identified by '123456';

从节点连接主节点;

stop slave;
#channel对应每个主节点的server_id
change master to master_host='192.168.2.189',master_user='repl',master_password='123456',master_auto_position=1 for channel '1';

change master to master_host='192.168.150.129',master_user='repl',master_password='123456',master_auto_position=1 for channel '2';

start slave;

show slave status

提示:

#通过同步产生的变化将记录在自己的binlog中,即可以当从也可以当主(主从一体必备配置项)
log-slave-updates=1

你可能感兴趣的:(#,mysql,mysql)