Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
即:在两台服务器上既执行master的操作又执行slave的操作(注意:两台数据库都必须是可写的)
互为主从复制过程
互为主从:两个节点各自都要开启binlog和relay log;
1、数据不一致;
2、自动增长id;
什么是自增长ID?
对于某些唯一性的字段,可以通过设置自增长ID来实现,自增长ID的数据,代表这个表中存在一条唯一的记录;而自增长id是肯定不会重复的;
创建表,设置ID为自增长
create table userInfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
两边插入数据看数据增长
insert into userInfo(name) value('xiao'),('da'),('lao');
定义一个节点使用奇数id
auto_increment_increment=2 #表示自增长字段每次递增的量
auto_increment_offset=1 #表示自增长字段从那个数开始
另一个节点使用偶数id
auto_increment_increment=2
auto_increment_offset=2
配置:
1、server_id必须要使用不同值;
2、均启用binlog和relay log; read only = 0(因为互为主从,所以必须是可写的)
3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;
服务启动后执行如下两步:
4、都授权有复制权限的用户账号;
5、各把对方指定为主节点;
实验:数据库互为主从复制步骤 1.修改mysql配置文件
一台数据库服务器上
vim /etc/my.cnf
server-id = 1
log_bin = mysql_bin
relay_log = relay-log
skip-name-resolve = on
log_slave_updates = 1
auto_increment_increment=2
auto_increment_offset=1
另一台数据库服务器上
vim /etc/my.cnf
server-id = 2
relay_log = relay-log
log_bin = mysql-log
skip-name-resolve = on
log_slave_updates = 1
auto_increment_increment=2
auto_increment_offset=2
修改完配置文件后,重启数据库服务
systemctl restart mariadb
2.创建复制帐号分别在两台数据库服务器上创建复制账号
mysql
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
3.启动从服务器复制线程让slave连接master,并开始重做master二进制日志中的事件。
mysql
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_USER='slave',
MASTER_PASSWORD='magedu',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=278;
执行start slave;# 启动复制线程。
另一台数据库服务器也是如此
4、查看从服务器状态可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看前复制态:
mysql
SHOW SLAVE STATUS\G
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
两台数据库服务器都显示如上结果就ok。
5.创建表,设置ID为自增长,两边插入数据看数据增长在一台数据库服务器上
mysql
create database dnf;
use dnf;
create table userinfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20) NOT NULL);
insert into userinfo (name) values('ni'),('wo'),('ta');
然后查看表,因为是自增长id,从1开始,步长为2,所以添加的数据id为1,3,5