主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=1for 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: