日期:2013-07-04  浏览次数:20407 次

6 MySQL 同步

同步功用在MySQL 3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去。本章描述了MySQL的各种复制特性。引见了同步的概念,如何设置同步服务器,以及可用服务器的参照。还提供了一系列的常见问题及其答案,疑问解答。

"14.6 Replication Statements"中引见了同步相关的SQL语句语法。

我们建议经常访问"http://www.mysql.com"经常阅读本章的最新内容。同步功用不断在改进,我们经常把这部分的手册更新到当前的最新内容。

6.1 同步引见

MySQL 3.23.15及更高的版本支持单向同步。一个服务器作为master(主服务器),一个或者多个服务器作为slave(从服务器)。master服务器把更新的内容写到二进制日志(binary log或binlog)中,并且维护了一个索引文件来记录日志循环的情况。这些日志中的更新部分会被发送到slave服务器。一个slave连接到master之后,它通知master最后一次成功增量更新的日志位置。slave会找出所有从那个时辰开始的更新操作,然后阻塞并等待master发送新的更新操作。

如果想要做一个同步服务器链的话,slave同时也可以作为master。

留意,启用同步后,所有要同步的更新操作都必须在master上执行。否则,必须留意不要形成用户在master上的更新和在slave上的更新惹起冲突。

单向同步的好处是稳健,高速,系统易管理:

有了master/slave机制后,就更稳健了。当master上发生问题时,可以把slave作为备用切换过去。

可以在slave和master之间分担一些查询,这就能加速呼应时间。SELECT 查询就可以在slave上执行以减少master的负载。更新数据的语句则要放在mater上执行以保持master和slave的同步。当非更新操作占多数时,负载均衡就很无效了,不过这只是普通情况而言。

另一个好处是可以在slave上备份数据,无需干扰master。备份数据时master照样继续运作。概况请看"5.7.1 Database Backups"。

6.2 同步机制实现概述

MySQL同步机制基于master把所有对数据库的更新、删除 等)都记录在二进制日志里。因此,想要启用同步机制,在master就必须启用二进制日志。概况请看"5.9.4 The Binary Log"。

每个slave接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。

应该非常重要地认识到,二进制日志只是从启用二进制日志开始的时辰才记录更新操作的。所有的slave必须在启用二进制日志时把master上曾经存在的数据拷贝过来。如果运转同步时slave上的数据和master上启用二进制日志时的数据不分歧的话,那么slave同步就会失败。

把master上的数据拷贝过来的方法之一实在slave上执行 LOAD DATA FROM MASTER 语句。不过要留意,LOAD DATA FROM MASTER 是从MySQL 4.0.0之后才开始可以用的,而且只支持master上的 MyISAM 类型表。同样地,这个操作需求一个全局的读锁,这样的话传送日志到slave的时候在master上就不会有更新操作了。当实现了自在锁表热备份时(在MySQL 5.0中),全局读锁就没必要了。

由于有这些限制,因此我们建议只在master上相关数据比较小的时候才执行 LOAD DATA FROM MASTER 语句,或者在master上允许一个长时间的读锁。由于每个系统之间 LOAD DATA FROM MASTER 的速度各不一样,一个比较好的衡量规则是每秒能拷贝1MB数据。这只是的粗略的估量,不过master和slave都是奔腾700MHz的机器且用100MBit/s网络连接时就能达到这个速度了。

slave上曾经完整拷贝master数据后,就可以连接到master上然后等待处理更新了。如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由 --master-connect-retry 选项来控制,它的默认值是60秒。

每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。

6.3 同步实现细节

MySQL同步功用由3个线程(master上1个,slave上2个)来实现。执行 START SLAVE 语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志中的语句。master创建一个线程来把日志的内容发送到slave上。这个线程在master上执行 SHOW PROCESSLIST 语句后的结果中的 Binlog Dump 线程便是。slave上的I/O线程读取master的 Binlog Dump 线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。

如上所述,每个mster/slave上都有3个线程。每个master上有多个线程,它为每个slave连接都创建一个线程,每个slave只要I/O和SQL线程。

在MySQL 4.0.2以前,同步只需2个线程(master和slave各一个)。slave上的I/O和SQL线程合并成一个了,它不使用中继日志。

slave上