1  概述

互为主从:两个节点各自都要开启binlog和relay log;

1、数据不一致;

2、自动增长id;为了防止id冲突,解决办法是一个服务器使用奇数id,另一个服务器使用偶数id,合并的时候一般不会产生冲突,设置如下

定义一个节点使用奇数id

auto_increment_offset=1

auto_increment_increment=2

另一个节点使用偶数id

auto_increment_offset=2

auto_increment_increment=2

但是一般不建议让mysql自动生成id,因为这样会产生缝隙,如表一插入第一条和第三条数据,表二需要从第四条数据开始插入,这样,表二中第二条数据就没有插入,产生了缝隙。解决办法是由id生成器生成唯一的id,防止有缝隙产

配置:

1、server_id必须要使用不同值; 

2、均启用binlog和relay log;

3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;

服务启动后执行如下两步:

4、都授权有复制权限的用户账号;

5、各把对方指定为主节点;

2  复制时应该注意的问题

2.1  从服务设定为“只读”

在从服务器启动read_only,但仅对非SUPER权限的用户有效;

阻止所有用户:

mysql> FLUSH TABLES WITH READ LOCK;

2.2  尽量确保复制时的事务安全

在master节点启用参数:

sync_binlog = ON #sync_binlog表示当前节点有事务在复制时提交,会把日志直接写入到二进制log里,确保从服务器复制该日志可以提交事务

如果用到的是InnoDB存储引擎,建议启用如下选项

innodb_flush_logs_at_trx_commit=ON#事务提交时就同步日志

innodb_support_xa=ON #让innodb支持分布式事务

2.3  从服务器意外中止时尽量避免自动启动复制线

注意,由于当配置change master to这个命令时,会在目录/var/lib/mysql下生成master.info这个文件,该文件指明使用哪个用户哪个密码连接哪个数据库,使得下次启动时,根据这个文件启动复制的功能。这里的问题是,当上一个语句复制到一半的时候,即从节点复制一半的时候从节点崩溃了,此时再次启动从节点的mysql服务时,这时上次复制一半的语句,重新复制或者不复制都会有问题,因此,出现从服务器意外终止的情况下,建议在重新启动从服务器的时候,不要自动启动该线程,或者是先关闭网络,手动查看是否存在不完整的语句,手动删掉该语句,手动从上一次崩溃的位置开始启动复制线程,也有可能需要重新启动复制,否则得到的数据可能是不一致的。

2.4  从节点:设置参数

sync_master_info=ON #生成master.info这个文件,当信息改变的时候,立即同步到磁盘的该文件中,防止已经复制过的数据再次被复制一遍

sync_relay_log_info=ON  #生成relay-log.info这个文件,记录了已经复制到主节点的二进制文件master-log的哪个位置,对应到从节点relay-log的哪个位置,如果这个文件没更新,重新复制的时候,可能会把之前的中继文件的信息覆盖掉。当从服务器意外崩溃时,除非能确保数据是一致的(有工具可以检查数据是否一致,但是对应运行中的mysql服务主机,不建议进行检查),否则建议重新复制,不过这个根据实际情况而定,如数据已经很大,就不建议重新复制了。

3  例子  实现主主复制

71和73两台服务器作为主主异步复制的机器

停止mysql服务器

[root@CentOS7A ~]#systemctl stop mariadb

[root@CentOS7C ~]#systemctl stop mariadb

编辑配置文件,注意配置不能加read_only选项,server_id要不一样,设置自动增长id,奇偶不一样

主节点71上配置

[root@CentOS7A ~]#vim /etc/my.cnf.d/server.cnf 

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

max_connections = 20000

log_bin = master-log

server_id = 1 

relay_log = relay-log

auto_increment_offset=1

auto_increment_increment=2

启动服务

[root@CentOS7A ~]#systemctl start mariadb

主节点73上配置

[root@CentOS7C ~]#vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

innodb_buffer_pool_size = 256M

max_connections = 2000

relay_log = relay-log

server_id = 2 

log_bin = master-log

auto_increment_offset=2

auto_increment_increment=2

启动服务

[root@CentOS7C ~]#systemctl start mariadb

检查mysql是否拥有拷贝复制权限的账号,如果没有,需要授权,这里有账号sunnycopy

MariaDB [(none)]> select user,host,password from mysql.user;

查看此时二进制文件的文件名和位置

MariaDB [(none)]> show master status;

设置复制参数,注意二进制文件的文件名和位置都是对端要复制的服务器上的

71上设置

MariaDB [(none)]> change master to master_host='192.168.1.73',master_user='sunnycopy',master_password='Pass1234',master_log_file='master-log.000001',master_log_pos=245;

启动线程

MariaDB [(none)]> start slave;

73上设置

MariaDB [(none)]>  change master to master_host='192.168.1.71',master_user='sunnycopy',master_password='Pass1234',master_log_file='master-log.000003',master_log_pos=245;

启动线程

MariaDB [(none)]> start slave;

双主测试,在两台服务器上做任何操作,两台服务器数据都是一样的,但是自动生成插入的id不一样,奇偶不一样

在71上执行如下操作,id是自动生成的,不知道id,则71这台是

MariaDB [sunny]> insert into students (name,age,gender,major)values ("test1",21,"F","maths"),("test2",22,"M","chinese"),("test3",23,"F","english");

通过如下select,确实id是技术,且自动增长

MariaDB [sunny]> select * from students where id>=1050;

+------+--------+------+--------+---------+

| id   | name   | age  | gender | major   |

+------+--------+------+--------+---------+

| 1050 | new005 |   18 | M      | NULL    |

| 1051 | new051 |   18 | M      | maths   |

| 1053 | test1  |   21 | F      | maths   |

| 1055 | test2  |   22 | M      | chinese |

| 1057 | test3  |   23 | F      | english |

+------+--------+------+--------+---------+

5 rows in set (0.00 sec)

73上插入数据,为偶数增长

MariaDB [sunny]>  insert into students (name,age,gender,major)values ("test2",22,"F","maths"),("test4",24,"M","chinese"),("test6",26,"F","english");

MariaDB [sunny]> select * from students where id>=1050;

+------+--------+------+--------+---------+

| id   | name   | age  | gender | major   |

+------+--------+------+--------+---------+

| 1050 | new005 |   18 | M      | NULL    |

| 1051 | new051 |   18 | M      | maths   |

| 1053 | test1  |   21 | F      | maths   |

| 1055 | test2  |   22 | M      | chinese |

| 1057 | test3  |   23 | F      | english |

| 1058 | test2  |   22 | F      | maths   |

| 1060 | test4  |   24 | M      | chinese |

| 1062 | test6  |   26 | F      | english |

+------+--------+------+--------+---------+

8 rows in set (0.00 sec)