双主模式是指两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中。
随着业务发展,架构会从主从模式演变为双主模式,建议用双主单写,再引入高可用组件,例如 Keepalived和MMM等工具,实现主库故障自动切换。
前提配置:两台mysql服务器作为master_1 和 master_2
一、master_1配置
-
修改配置文件
vi /etc/my.cnf
在主从配置的基础上追加配置
#主从配置 log_bin=mysql-bin server-id=1 sync-binlog=1 binlog-ignore-db=performance_schema binlog-ignore-db=information_schema binlog-ignore-db=sys #追加双主配置 relay_log=mysql-relay-bin log_slave_updates=1 auto_increment_offset=1 auto_increment_increment=2
配置完后重启mysqlservice mysql restart
-
登入
mysql -uroot -p
-
授权(授权过则跳过授权这一步)
mysql> grant replication slave on *.* to 'root'@'%' identified by 'root'; mysql> grant all privileges on *.* to 'root'@'%' identified by 'root'; mysql> flush privileges;
-
查看状态
mysql> show master status;
上图master_1的File和Position这两个参数在mater_2上要用到,用于建立关系
二、master_2配置
- 修改配置文件
配置如下:vi /etc/my.cnf
log-bin=mysql-bin server-id=3 sync-binlog=1 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys relay_log=mysql-relay-bin log_slave_updates=1 auto_increment_offset=2 auto_increment_increment=2
配置完后重启mysqlservice mysql restart
- 登入
mysql -uroot -p
- 授权
mysql> grant replication slave on *.* to 'root'@'%' identified by 'root'; mysql> grant all privileges on *.* to 'root'@'%' identified by 'root'; mysql> flush privileges;
- 查看状态
mysql> show master status;
上图master_2的File和Position这两个参数在mater_1上要用到,用于建立关系
三、配置双主关系
-
master_1建立和master_2的关系
mysql> change master to master_host='192.168.200.131',master_port=3306,master_user='root',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;
master_host:master_2的host
master_port:master_2的port
master_user:master_2的用户名
master_password:master_2的密码
master_log_file:master_2的log_file,即之前查询出的master_2的File
master_log_pos:master_2的log_pos,即之前查询出的master_2的Position -
master_1启动slave,并查看状态
mysql> start slave; mysql> show slave status \G;
注意没报错并且Slave_IO_Running和Slave_SQL_Running都为YES,则配置成功。 -
master_2建立和master_1的关系
mysql> change master to master_host='192.168.200.128',master_port=3306,master_user='root',master_password='123456',master_log_file=='mysql-bin.000002',master_log_pos=154;
master_host:master_1的host
master_port:master_1的port
master_user:master_1的用户名
master_password:master_1的密码
master_log_file:master_1的log_file,即之前查询出的master_1的File
master_log_pos:master_1的log_pos,即之前查询出的master_1的Position -
master_2启动slave,并查看状态
mysql> start slave; mysql> show slave status \G;
注意没报错并且Slave_IO_Running和Slave_SQL_Running都为YES,则配置成功。
四、测试
-
master_1新建库和表
-
master_2查看
说明master1到master2同步成功 -
接着mater_1和mater_2都插入一条数据,然后查看数据同步状态
首先在master1上插入一条数据
接着在master2上也插入条数据
最后查看master1的数据
可见master_1和master_2都完成了同步