双主模式是指两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中。
随着业务发展,架构会从主从模式演变为双主模式,建议用双主单写,再引入高可用组件,例如 Keepalived和MMM等工具,实现主库故障自动切换。
两台mysql服务器作为master1 和 master2
修改配置文件:
1 | vim /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
1、配置完后重启mysql
service mysqld restart
2、登录master1的mysql数据库
mysql -uroot -p
3、在master1服务器上创建用于复制的用户,并授权:
mysql> grant replication slave on *.* to 'root'@'%' identified by 'Admin@123';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Admin@123';
mysql> flush privileges;
将“root”替换为你自定义的用户名,将“Admin@123”替换为对应的密码。
4、查看master1状态
mysql> show master status;
master_1的File和Position这两个参数在mater_2上要用到,用于建立关系。
1、修改配置文件
vi /etc/my.cnf
2、master2配置如下
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
3、配置完重启master2
service mysqld restart
4、登录master2数据库
mysql -uroot -p
5、在master2服务器上创建用于复制的用户,并授权:
mysql> grant replication slave on *.* to 'root'@'%' identified by 'Admin@123';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Admin@123';
mysql> flush privileges;
6、查看master2状态
mysql> show master status;
master2的File和Position这两个参数在mater1上要用到,用于建立关系。
1、master1建立和master2的关系
mysql> change master to master_host='172.16.100.233',master_port=3306,master_user='root',master_password='Admin@123',master_log_file='mysql-bin.000008',master_log_pos=3802974;
master_host:master2的host
master_port:master2的port
master_user:master2的用户名
master_password:master2的密码
master_log_file:master2的log_file,即之前查询出的master2的File
master_log_pos:master2的log_pos,即之前查询出的master2的Position
2、master1启动slave,并查看状态
mysql> start slave;
mysql> show slave status \G;
注意没报错并且Slave_IO_Running和Slave_SQL_Running都为YES,则配置成功。
3、master2建立和master1的关系
mysql> change master to master_host='172.16.106.200',master_port=3306,master_user='root',master_password='Admin@123',master_log_file=='mysql-bin.000003',master_log_pos=6021336;
master_host:master1的host
master_port:master1的port
master_user:master1的用户名
master_password:master1的密码
master_log_file:master1的log_file,即之前查询出的master2的File
master_log_pos:master1的log_pos,即之前查询出的master2的Position
4、master2启动slave,并查看状态
mysql> start slave;
mysql> show slave status \G;
注意没报错并且Slave_IO_Running和Slave_SQL_Running都为YES,则配置成功。
1、登录master1,创建数据库 test_slave
CREATE DATABASE test_slave;
2、创建表
CREATE TABLE `test_tbl` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`update_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3、插入数据
INSERT INTO `test_slave`.`test_tbl`(`id`, `title`, `update_date`) VALUES (1, '白色', '2020-07-10');
4、更新数据
UPDATE `test_slave`.`test_tbl` SET `title` = '黑色', `update_date` = '2020-07-10' WHERE `id` = 1;
查看master1、master2 节点数据是否相同