MySQL主从架构的复制模式
2017-11-08
复制工作方式
MySQL支持两种复制方式:基于行的复制和基于语句的复制。这两种方式的工作步骤:
1.在主库上把数据更改记录到二进制日志(Binary Log)中。
2.从库将主库上的日志复制到自己的中继日志(Relay Log)中。
3.从库读取中继日志中的事件,将其重放到从库数据之上。
第一步,在主库上记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
第二步,从库将主库的二进制日志复制到其本地的中继日志中。首先,从库会启动一个工作线程,成为I/O线程,I/O线程跟主库建立一个普通的客户端连接。
然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件。
它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号通知其有新的事件产生时才会被唤醒,从库I/O线程会将接收到的事件记录到中继日志中。
从库的SQL线程执行最后一步,该线程从中继日志中读取事件并在从库执行,从而实现从库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中。
配置复制
1.创建复制账号
MySQL会赋予特殊权限给复制进程。在从库运行I/O线程会建立一个到主库的TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限。从库I/O线程以该用户名连接到主库并读取其二进制日志。
通过如下语句创建用户账号:
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.*
->TO repl@'192.168.0.%' IDENTIFIED BY'123456',;
在主库和从库都创建该账号。我们把这个账号限制在本地网络,因为这是一个特权账号。
2.配置主库和从库
下一步需要在主库上开启一些设置,假设主库是服务器server1,需要打开二进制日志并指定一个独一无二的服务器ID(server ID),在主库的 my.cnf文件中增加或修改如下内容:
必须明确的指定一个唯一的服务器ID,默认服务器ID通常为1,使用默认值可能会导致和其他服务器ID冲突,因此这里我们选择10来作为服务器ID。
如果之前没有在MySQL的配置文件中指定logbin选项,就需要重新启动MySQL.为了确认二进制日志文件是否已经在主库上创建,使用SHOW MASTER STATUS命令,检查输入是否与如下的一致,如图1所示。
从库上也需要在my.cnf中增加类似的配置,并且同样需要重启服务器。
图1 使用SHOW MASTER STATUS命令
图2 SHOW SLAVE STATUS命令
3.启动复制
下一步是告诉从库如何连接到主库并重放其二进制日志。这一步不要通过修改my.cnf来配置,而是使用CHANGE MASTER TO语句,该语句完全替代了my.cnf中相应的设置,并且允许以后指向别的主库时无需重启从库。下面是开始复制的基本命令:
MASTER_LOG_POS参数设置为0,因为要从日志的开头读起。运行下面的命令开始复制:
执行该命令没有显示错误,我们可用SHOW SLAVE STATUS命令来检查复制是否正确执行,如图2所示。
在这里主要是看:
Slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在主库上进行修改,你可以在从库上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
现在MySQL的主从架构的复制模式已经配置成功了,数据库的承载能力得到进一步提升。