当前位置:文档之家› mysql数据库主主同步方案

mysql数据库主主同步方案

Mysql 数据库主主(master-master)同步方案一、MySQL同步概述1.MySQL数据的复制的基本介绍目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧!MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。

主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。

这些日志可以记录发送到从服务器的更新。

当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。

从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。

否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

单向复制有利于健壮性、速度和系统管理:健壮性:主服务器/从服务器设置增加了健壮性。

主服务器出现问题时,你可以切换到从服务器作为备份。

速度快:通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。

SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。

但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。

如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。

系统管理:使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。

在备份过程中主服务器可以继续处理更新。

2.MySQL数据复制的原理MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。

因此,要进行复制,必须在主服务器上启用二进制日志。

每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。

任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。

如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。

将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。

请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。

并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。

当我们执行表的无锁热备份时,则不再需要全局读锁定。

MySQL数据复制的原理图大致如下:从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现:其中1个在主服务器上,另两个在从服务器上。

当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。

主服务器创建一个线程将二进制日志中的内容发送到从服务器。

该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。

从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。

第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。

在前面的描述中,每个从服务器有3个线程。

有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。

这样读取和执行语句被分成两个独立的任务。

如果语句执行较慢则语句读取任务没有慢下来。

例如,如果从服务器有一段时间没有运行了,当从服务器启动时,其 I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程远远滞后。

如果从服务器在SQL线程执行完所有索取的语句前停止,I/O 线程至少已经索取了所有内容,以便语句的安全拷贝保存到本地从服务器的中继日志中,供从服务器下次启动时执行。

这样允许清空主服务器上的二进制日志,因为不再需要等候从服务器来索取其内容。

3.主主同步机制在主从同步的基础上继续完善,把从机当做主机,主机当做从机再按主从同步的方式配置一次就是主主同步。

二、实践1.安装环境(测试环境)主数据库(下文叫数据库A)Ip:192.168.105.54数据库:Mysql5.7 安装包mysql-installer-community-5.7.9.1.msi 系统:window server 2012 r2 standard主数据库(下文叫数据库B)Ip:192.168.105.244数据库:Mysql5.7 安装包mysql-installer-community-5.7.9.1.msi 系统:window server 2012 r2 standard2.mysql安装配置AB主机下载mysql并安装配置,参考地址如下:/article/a17d528535dd808098c8f286.h tml注意:安装完成之后修改安装文件下的my-default.ini文件为my.ini(此文件为mysql的配置文件)。

mysql环境配置计算机右键点击‘属性’,系统界面选择‘高级系统设置’,系统属性界面选择‘环境变量配置’,系统属性界面下的系统变量,点击新建按钮a.新建系统变量名称:MYSQL_HOME,值:C:\Program Files\MySQL\MySQL Server 5.7;b.系统变量选择path环境变量,编辑path在其后添加%MYSQL_HOME%\bin;c. 测试mysql1)启动命令行模式,方式一:键盘win+r,输入cmd;方式二:开始按钮查找cmd,点击命令提示符;2)启动mysql服务,方式一:命令行输入net start mysql;方式二:windows server下启动任务管理器,点击服务栏,找到mysql 服务手动开启。

Win7下计算机右键选择‘管理’,点击服务和应用程序,点击服务,找到mysql服务手动开启。

3)命令行,输入命令mysql –uroot –p;提示输入密码,进入mysql,输入quit;退出mysql。

4)关闭mysql服务,方式一:命令行输入net stop mysql;方式二:windows server下启动任务管理器,点击服务栏,找到mysql 服务手动关闭。

Win7下计算机右键选择‘管理’,点击服务和应用程序,点击服务,找到mysql服务手动关闭。

3.AB主机配置Mysql Server启动Binary Logging在A的my.ini文件(C:\Program Files\MySQL\MySQL Server 5.7,默认情况一般在C:\ProgramData\MySql\MySql Server 5.6\my.ini)中添加如下配置信息[mysqld]log-bin="C:\ProgramData\MySQL\MySQLServer5.7_01\log-bin\log-bin.log"server-id=1B的my.ini文件中添加如下配置信息[mysqld]log-bin="C:\ProgramData\MySQL\MySQLServer5.7_01\log-bin\log-bin.log"server-id=24.AB重启mysqlAB为Replication创建用户User,并赋予权限进入mysql,输入命令grant replication slave on *.* to repl@192.168.105.244 identified by 'repl' ;repl分别为用户名和密码,根据自己需要修改。

@后为另外一台主机的ip地址。

5. 查看两台Mysql Server当前bin log的位置(因为我们只需要同步两个server从当前状态之后的操作)5.1分别在两台机器上执行如下命令:FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS;A会得到如下结果B得到的结果:图中File表示当前的binary log文件名,Position是表示Binary log文件的当前位置,呆会replication应该是从这个位置开始。

6.释放lock在两台机器上执行如下命令:Unlock Tables.让两台MySql可以正常进行数据库操作。

7. 设置Slave Replication7.1 启动A的slave replication。

7.1.1 执行命令stop slave7.1.2 执行如下命令Change master to master_host='192.168.105.244',master_user='repl',master_por t=3306,master_password='repl',master_log_file='log-bin.0000 08',master_log_pos=450;7.1.3执行start slave7.1.4查看slave的状态,执行Show Slave Status\G;A显示如下:Slave_io_running和slave_sql_running显示yes,表示正确。

7.2 启动B上的slave replication7.2.1执行 stop slave7.2.2执行如下命令change master to master_host='192.168.105.54',master_user='repl',master_port =3306,master_password='repl',master_log_file='log-bin.00000 6',master_log_pos=451;7.2.3执行start slave7.2.4查看slave的状态,执行Show Slave Status\G;B显示如下:Slave_io_running和slave_sql_running显示yes,表示正确。

8. 测试replication效果8.1在A上执行mysql> create database repltest;mysql> use repltest;mysql> create table person(id int,name varchar(255)); mysql> insert into person values(1,’jensen’);8.2在B上执行:mysql> use repltest;mysql> select * from person; 验证在A上插入的记录已经同步现B上8.3在B上插入一条记录ins ert into person values(2,’jack’);8.4 A上显示select * from person;9. 自增冲突解决方式对于自增ID列,两台Server同步时会因为值一样而造成冲突。

相关主题