面试题答案
一键面试1. 网络连接
- TCP连接建立:Slave的IO线程会主动与Master建立TCP连接。在MariaDB配置中,Master需要监听特定的IP和端口(通常为3306),Slave通过配置的Master主机地址、端口信息来发起连接请求。例如,在Slave的配置文件(如my.cnf)中通过
master_host
指定Master的IP地址,master_port
指定端口。
2. 协议交互
- 握手阶段:
- 连接建立后,Slave IO线程会发送握手包给Master,其中包含自身的一些信息,如客户端版本、能力标志等。Master收到握手包后,会验证并回复包含认证信息(如密码加密方式等)的握手响应包。
- Slave根据Master的响应,使用合适的加密方式对配置中的
master_password
进行加密,并再次发送给Master进行认证。
- 请求二进制日志事件阶段:
- 认证通过后,Slave IO线程发送
COM_BINLOG_DUMP
命令给Master,这个命令中携带了Slave已经同步到的Master二进制日志文件名(master_log_file
)和位置(master_log_pos
)。 - Master接收到该命令后,从指定的位置开始读取二进制日志事件,并将这些事件以Packet的形式发送给Slave。每个Packet包含一定量的二进制日志数据。
- Slave IO线程持续接收这些Packet,并将其写入到本地的中继日志(relay log)中。
- 认证通过后,Slave IO线程发送
3. 相关配置参数的影响
- Master配置参数:
log-bin
:开启二进制日志功能,只有开启此参数,Master才会记录二进制日志,Slave才能从中获取事件进行同步。例如:log-bin=/var/lib/mysql/mysql-bin.log
。server-id
:每个MySQL/MariaDB实例都需要有唯一的server-id
,Master通过它来标识自己。在主从复制环境中,不同节点的server-id
不能重复。例如:server-id=1
。
- Slave配置参数:
server-id
:同样,Slave也需要有唯一的server-id
,与Master及其他Slave区分开来。例如:server-id=2
。master_host
、master_user
、master_password
、master_port
:这些参数用于配置Slave连接Master的基本信息,如主机地址、用户名、密码和端口。relay_log
:指定中继日志的路径和文件名,Slave IO线程接收到的二进制日志事件会写入到此中继日志中。例如:relay_log=/var/lib/mysql/relay-log-bin
。read_only
:设置为1时,Slave节点将处于只读模式,防止从库上的意外写入操作影响复制。但拥有SUPER
权限的用户不受此限制。例如:read_only=1
。