一、主主复制说明

  MySQL主主复制结构区别于主从复制结构。在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。 这就比使用主从复制具有更好的性能。


二、关于主主复制过程中server-id的说明

  因为主主复制架构中是两台服务器互为主从,所以两台服务器必须都有填制日志和中继日志,而且他们的server-id必须不能一样。如果server-id一样了,那么:

  1、数据写入到A服务器的数据文件和二进制文件中,然后发送给B的中继日志;B根据中继日志写入到磁盘数据文件中

  2、同样的,此时B服务器发生数据修改,所以它会把记录写入到二进制日志文件中,然后再发送给A服务器的中继日志;A根据中继日志写入到数据文件中

  3、A、B都有中继日志,所以从中继日志中读过来的数据修改操作会写入到二进制文件中;这样,双方的二进制日志一变化,就会发送给对方的中继日志(而数据其实是相同的),这样不停地来来回回,就造成了死循环

  4、为了避免这种情况,就应该为A、B服务器指定不同的sercer-id,每个服务器在复制数据时,会保留对方信息的server-id;因此,A服务器通过B服务器复制过来的信息到中继日志,发现server-id就是自己的,就没有必要在写在本地了,这样就避免了循环复制


三、主主复制的实现

1、A服务器的配置

ip为172.16.8.8

vim /etc/my.cnf
添加如下内容
server-id       = 1
log-bin=/binlog/mysql-bin
innodb_file_per_table=1
relay-log=/relay/relay-mysql
auto-increment-offset=2       //设置插入数据时起始值为2
auto-increment-increment=2    //设置步长为2


创建一个复制帐号:

MariaDB [(none)]> grant replication slave,replication client on *.* to "backup"@'172.16.8.7' identified by '123';


2、B服务器的配置

ip为172.16.8.7

vim /etc/my.cnf
添加如下内容
server-id       = 2
log-bin=/binlog/mysql-bin
innodb_file_per_table=1
relay-log=/relay/relay-mysql
auto-increment-offset=1       //设置插入数据时起始值为1
auto-increment-increment=2    //设置步长为2


创建一个复制帐号:

MariaDB [(none)]> grant replication slave,replication client on *.* to "backup"@'172.16.8.8' identified by '123';


3、在A服务器上连接B服务器

查看B服务器的二进制日志

MariaDB的主主复制_第1张图片


在A服务器上连接B服务器

MariaDB [(none)]> change master  to master_host='172.16.8.7' ,master_user='backup',master_password='123',master_log_file='mysql-bin.000016',master_log_pos=479;


4、在B服务器上连接A服务器

查看A服务器的二进制日志

MariaDB的主主复制_第2张图片


在B服务器上连接A 服务器

MariaDB [(none)]>  change master  to master_host='172.16.8.8' ,master_user='backup',master_password='123',master_log_file='mysql-bin.000021',master_log_pos=393;


5、在A服务器上启动slave

MariaDB [(none)]> start slave;

MariaDB的主主复制_第3张图片


6、在B服务器上启动slave

MariaDB [(none)]> start slave;

MariaDB的主主复制_第4张图片


7、测试

在A服务器

在hellodb.students表中插入二条数据

MariaDB [hellodb]>use hellodb
MariaDB [hellodb]> insert into students (name,age) values ('tom',11),('luxi',12);

MariaDB的主主复制_第5张图片


在B服务器上,同样插入2条数据

MariaDB [hellodb]>use hellodb
MariaDB [hellodb]> insert into students (name,age) values ('OMG',11),('WAWA',12);

MariaDB的主主复制_第6张图片


由此可见双主复制已经配置成功!