数据库 之 Mysql的主主同步(双主模型)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 之 Mysql的主主同步(双主模型)相关的知识,希望对你有一定的参考价值。
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服务器
[[email protected] ~]#systemctl stop mariadb
[[email protected] ~]#systemctl stop mariadb
编辑配置文件,注意配置不能加read_only选项,server_id要不一样,设置自动增长id,奇偶不一样
主节点71上配置
[[email protected] ~]#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
启动服务
[[email protected] ~]#systemctl start mariadb
主节点73上配置
[[email protected] ~]#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
启动服务
[[email protected] ~]#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)
以上是关于数据库 之 Mysql的主主同步(双主模型)的主要内容,如果未能解决你的问题,请参考以下文章