中继日志需要与复制机制中的从服务器一起使用。复制从服务器负责接收来自主服务器的各种数据修改信息(即“事件”),并在接收到它们时将其写到中继日志。从服务器会将中继日志当作一个保存区,其中存储的事件会被保留到它们被从服务器执行为止。
在从服务器上,有两个线程分别负责处理事件的读取和执行。其中,I/O线程负责从主服务器读取事件,并把它们写到中继日志;SQL线程负责读取中继日志文件,执行其中包含的事件,并删除每个处理完毕的文件。这种功能上的不相干让这两个线程可以各自独立地运行。
中继日志与二进制日志有几个共同的特点。
- 服务器会按编号顺序创建中继日志文件。
- 有一个索引文件,其中列出的是当前存在的所有中继日志文件集。
- 中继日志文件的格式与二进制日志文件相同,因此可以使用工具程序mysqlbinlog来显示它们的内容。
启用中继日志的方法是指定–relay-log选项。如果在指定此选项时没有带上文件名,服务器会以 HOSTWAME-relay-bin 作为基本名,按编号顺序生成中继日志文件,如 HOSTWAME-relay-bin.000001、HOS7WAME-relay-bin.000002,依此类推。否则,服务器会使用你指定的名字作为顺序基本名(如果名字里包含扩展名,扩展名会被忽略掉)。此后,当你每次启动服务器、刷新日志,或者当前日志文件的大小已达到其最大值时,服务器便会按编号顺序生成下一个文件。这个大小由系统变量max_relay_log_size的值来确定。
如果启用了中继日志功能,那么服务器还会创建一个附带的中继日志索引文件,用来列出现有中继日志文件的名字。默认的索引文件名与中继日志文件的基本名一样,扩展名为.index。使用–relay-log-index选项,可以显式地指定一个名字。如果指定的名字里不包含扩展名,服务器会自动为其加上一个扩展名.index。例如,如果你指定的内容是–relay-log-index=relay-log,那么索引文件名就会变成relay-log.index。
中继日志是连接master和slave的信息———它是复制的核心。明白如何使用中继日志,以及如何通过中继日志来协调slave线程,这点很重要。因此,这里将深入研究中继日志的结构,以及slave线程是如何使用中继日志来处理复制的。I/O线程将来自master的事件存储到中继日志中。中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个事件。
下图给出了中继日志的示意图,其结构与master的binlog类似,不过多了一些文件。
除了二进制日志中的内容文件和索引文件以外,中继日志还维护两个文件来跟踪复制的进度,即中继日志信息文件和master日志信息文件。这两个文件的名字由my.cnf配置文件中的两个参数来控制∶
relay-log-info-file=filename
这个选项设置中继日志信息文件名。也可以作为只读服务器变量relay_log_info_file。如果没有提供完整的文件名,则该文件位于服务器的数据目录下。默认文件名为relay-log.info。
master-info-file=filename
这个参数设置 master 日志信息文件名。默认文件名为master∶info。为了便于叙述,下面的讨论中我们采用信息文件的默认文件名。master.info文件包含master的读位置,以及连接master和启动复制必需的所有信息。当slave的I/O线程启动时,如果有master.info文件,则线程从这个文件读取信息。示例8-1给出了master.info文件的简单示例。我们在每行前面加了行号,而且每行末都有斜体标注(文件本身没有这些注释)。如果服务器编译不支持SSL,则没有第9-15 行(含有所有SSL参数)。示例8-1给出了带有SSL编译的参数设置。SSL字段稍后进行介绍。
master.info文件的内容(MySQL5.6.12)
1 23 文件中的行数
2 master-bin.000001 当前正在读取的binlog文件(Master_Log_File)最后读取的 binlog位置(Read Master Log_Pos)
3 151
4 localhost master 连接的主机(Master Host)
5 root 复制用户(Master_User)
6 复制密码
7 13000 master所使用的端口号(Master Host)slave尝试重新连接的次数(Connect_Retry)
8 60 如果启用了SSL,值为1,否则为θ
9 0
10 SSL认证机构(CA)SSL CA路径
11 SSL证书
12 SSL密码
13 SSL密钥
14 SSL验证服务器证书
15 0
16 60.000 心跳
17 绑定地址
18 0 忽略服务器ID
19 Master UUID 8c6d027e-cf38-11e2-84c7-0021cc6850ca
20 10 重试次数SSL CRL
21 SSL CRL路径
22 自动位置
23 0
如果是老版本的服务器,格式可能略有不同。MySQL4.1之前的版本没有第一行。开发人员在4.1.1版本中添加了行号,这样可以为文件扩展新字段,并通过检查行号来检测支持哪些字段。5.1.16版本引入了第15行,即SSL Verify Server Certificate,这后面的行在5.6系列版本引入。relay-loginfo文件跟踪复制的进度,并由SQL线程负责更新。示例8-2给出了relay-log. info文件的一段样本,这些行对应下一个即将执行的事件的开始。
示例8-2∶ relay-log.info文件的内容
./slave-relay-bin.000003 中继日志文件(Relay_Log_File)
380 中继日志位置(Relay_Log_Pos)
master1-bin.000001 master 日志文件(Relay Master Log File)
234 master 日志位置(Exec_Master_Log_Pos)
如果某些文件不可用,在slave启动的时候,能够根据my.cnf文件中的信息及CHANGE MASTER TO命令的参数,重建这些文件。