| 您的当前位置:首页 --> MYSQL教程 --> mysql(master/slave)主从复制原理及配置图文详解 |
| MYSQL教程 mysql(master/slave)主从复制原理及配置图文详解 |
| 浏览次数:929 关键词 ( ) |
| 查看使用该CPU的产品 查看CPU天梯 | |||
| CPU型号:mysql(master/slave)主从复制原理及配置图文详解 | |||
| 主频:Ghz | |||
| 睿频:Ghz | |||
| 核心数:个 | |||
| 不支持超核心 | |||
| 制作工艺: | |||
| 插槽类型: | |||
| 功耗:0W | |||
| L3缓存:0MB | |||
| 支持最大内存: 0GB | |||
| CPU详细参数 | |||
|
1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。 请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。 1.1 mysql支持的复制类型: (1):基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。 1.2 . 复制解决的问题 MySQL复制技术有以下一些特点: 1.3 复制如何工作 整体上来说,复制有3个步骤: (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); 下图描述了复制的过程: 该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。 2 .复制配置 有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。 要点: 2.1、创建复制帐号 1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中 命令如下: 建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。 (如果因为mysql版本新旧密码算法不同,可以设置:set password for 'backup'@'10.100.0.200'=old_password('1234')) 2.2、拷贝数据 (假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的master和slave有相同的数据) 关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同! 2.3、配置master 接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值: server-id=1 server-id:为主服务器A的ID值 重启master,运行SHOW MASTER STATUS,输出如下:
2.4、配置slaveSlave的配置与master类似,你同样需要重启slave的MySQL。如下: 2.5、启动slave接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下: mysql> CHANGE MASTER TO MASTER_HOST='server1', -> MASTER_USER='repl', -> MASTER_PASSWORD='p4ssword', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=0; MASTER_LOG_POS的值为0,因为它是日志的开始位置。 你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确: mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Master_Host: server1 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 4 Relay_Log_File: mysql-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: No Slave_SQL_Running: No ...omitted... Seconds_Behind_Master: NULL
Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No 表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。 为了开始复制,你可以运行: mysql> START SLAVE; 运行SHOW SLAVE STATUS查看输出结果: mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: server1 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 164 Relay_Log_File: mysql-relay-bin.000001 Relay_Log_Pos: 164 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ...omitted... Seconds_Behind_Master: 0
在这里主要是看: slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。 你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接: 在master上输入show processlist\G;
行2为处理slave的I/O线程的连接。 在slave服务器上运行该语句:
行1为I/O线程状态,行2为SQL线程状态。 2.5、添加新slave服务器 假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。 3、深入了解复制已经讨论了关于复制的一些基本东西,下面深入讨论一下复制。 3.1、基于语句的复制(Statement-Based Replication) MySQL 5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见。master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样。 3.2、基于记录的复制(Row-Based Replication) MySQL增加基于记录的复制,在二进制日志中记录下实际数据的改变,这与其它一些DBMS的实现方式类似。这种方式有优点,也有缺点。优点就是可以对任何语句都能正确工作,一些语句的效率更高。主要的缺点就是二进制日志可能会很大,而且不直观,所以,你不能使用mysqlbinlog来查看二进制日志。 3.3、复制相关的文件除了二进制日志和中继日志文件外,还有其它一些与复制相关的文件。如下: (1)mysql-bin.index服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index结尾的文件。它用于跟踪磁盘上存在哪些二进制日志文件。MySQL用它来定位二进制日志文件。它的内容如下(我的机器上): (2)mysql-relay-bin.index该文件的功能与mysql-bin.index类似,但是它是针对中继日志,而不是二进制日志。内容如下: (3)master.info保存master的相关信息。不要删除它,否则,slave重启后不能连接master。内容如下(我的机器上): I/O线程更新master.info文件,内容如下(我的机器上):
(4)relay-log.info 包含slave中当前二进制日志和中继日志的信息。 3.4、发送复制事件到其它slave当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。如下:
3.5、复制过滤(Replication Filters)复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件。如下:
4、复制的常用拓扑结构复制的体系结构有以下一些基本原则: MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。 4.1、单一master和多slave由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。如下:
4.2、主动模式的Master-Master(Master-Master in Active-Active Mode)Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。如图: 主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句: 4.3、主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。如图: 4.4、带从服务器的Master-Master结构(Master-Master with Slaves)这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。 |
| 下一个产品 SQL计算timestamp的差值的方法 上一个产品 MySQL安装配置方法教程 |