MySQL5.7下多源复制知识要点(原创)

架构为两主一从,两主为同一台服务器的多实例,安装方法请参考上篇文章http://blog.haohtml.com/archives/17300

主master1    IP: 192.168.1.116     PORT: 3306
主master2    IP: 192.168.1.116     PORT: 3307
从slave        IP: 192.168.1.200     PORT: 3306

两主为全新安装。如果以前安装过的话,可以将原来的数据库删除掉,再执行 reset master即可。(否则需要将两个主的想着库表使用 mysqldump到从中)

[master1 3306] my.cnf
[client]
port=3306
socket=/data/mysql/mysql3306/tmp/mysql.sock

[mysqld]
basedir=/data/mysql/mysql3306
datadir=/data/mysql/mysql3306/datadir
#socket=/var/lib/mysql/mysql.sock
socket=/data/mysql/mysql3306/tmp/mysql.sock
port=3306

log-bin=mysql-bin
binlog-format=row

# 二进制日志的格式:有row、statement和mixed三种  

# 注:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致; 推荐使用 row 

server-id=1

# 设置server_id,一般建议设置为IP,或者再加一些数字,如端口号[在以前版本为server-id] 

#gtid
gtid-mode=on
enforce-gtid-consistency=1
log-slave-updates=true

skip_slave_start=1

# log-slave-updates/gtid-mode/enforce-gtid-consistency/report-port/report-host:用于启动GTID及满足附属的其它需求[其中启动GTID必须同时设置gtid-mode/enforce-gtid-consistency/]  

master-info-repository=TABLE
relay-log-info-repository=TABLE

# master-info-repository/relay-log-info-repository都设置为TABLE,mysql.slave_master_info与 mysql.slave_relay_log_info 中,table都是innodb类型的,支持事务,比文件安全  

# 默认值是FILE, 比如master info就保存在master.info文件中,relay log info保存在relay-log.info文件中,如果服务器意外关闭,正确的relay info 没有来得及更新到 relay-log.info文件,这样会造成数据丢失 

sync-master-info=1

# 启用之后,使binlog在每N次binlog写入后与硬盘 同步 

slave-parallel-workers=4

# 开启基于库的多线程复制.默认是0,不开启,最大并发数为1024个线程

#binlog-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
#binlog-ignore-db=不需要复制的数据库苦命,如果复制多个数据库,重复设置这个选项即可

user=mysql
# Disabling symbolic-links is recommended to prevent assorted security r
isks
symbolic-links=0

[mysqld_safe]
log-error=/data/mysql/mysql3306/log/mysqld.log
pid-file=/data/mysql/mysql3306/mysqld.pid

对于另一个主master2(3307)的配置文件 my.cnf 与上面差不多 ,只需要将相应的3306字眼修改为3307即可,记得修改server-id=2。

在两个主上执行授权

grant replication slave on *.* to repl@’192.168.1.%’ identified by ‘repl123’;

对于从服务器,配置和上面的差不多。

由于我们这里是多源配置,所以要求两台主数据库的名称不能一致,还有一些授权数据库名(mysql),所以这里我们需要将slave中的mysql数据库忽略掉,需要在my.cnf中添加

binlog-do-db=test
binlog-ignore-db=mysql

#replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
#replicate-ignore-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可

============================================

待主从配置全部配置完以后,在slave中执行

change master to master_host=’192.168.1.116′,master_user=’repl’,master_password=’repl123′,master_port=3306,master_auto_position=1 for channel ‘master-3306’;
change master to master_host=’192.168.1.116′,master_user=’repl’,master_password=’repl123′,master_port=3307,master_auto_position=1 for channel ‘master-3307’;

启用复制

start slave;
show slave status\G;

如果看到两个源的IO/SQL THREAD状态全部为 YES ,则说明配置成功。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

=======================

常见问题:

有时候会产生复制错误,如一些sql语句语句冲突,这个时候只需要跳过去那个事务即可(通过提交一个空事务)

stop slave sql_thread;
set gtid_next=’uuid:N’;
begin;commit;
set gtid_next=’automatic’;
start slave sql_thread: