面试题答案
一键面试MariaDB复制架构下slave的IO线程与master建立连接及获取二进制日志事件过程
- 前期准备
- 在master端,需要开启二进制日志功能。在
my.cnf
配置文件中设置:
[mysqld] log - bin = /var/log/mysql/mysql - bin.log server - id = 1
log - bin
指定二进制日志文件的路径和前缀。server - id
是每个MySQL/MariaDB实例的唯一标识,在复制环境中master和slave的server - id
不能相同。重启MariaDB服务使配置生效。- 在slave端,同样需要设置唯一的
server - id
,例如:
重启MariaDB服务。[mysqld] server - id = 2
- 在master端,需要开启二进制日志功能。在
- 配置slave连接master
- 在slave上执行以下命令配置连接信息:
CHANGE MASTER TO MASTER_HOST ='master_host_ip', MASTER_USER ='replication_user', MASTER_PASSWORD ='replication_password', MASTER_LOG_FILE ='master_binlog_file_name', MASTER_LOG_POS = master_binlog_position;
MASTER_HOST
是master的IP地址。MASTER_USER
和MASTER_PASSWORD
是在master上创建的用于复制的用户及其密码。创建用户的命令在master上执行:
CREATE USER'replication_user'@'%' IDENTIFIED BY'replication_password'; GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%'; FLUSH PRIVILEGES;
MASTER_LOG_FILE
和MASTER_LOG_POS
可以通过在master上执行SHOW MASTER STATUS
命令获取。
- 启动slave的IO线程
- 在slave上执行
START SLAVE;
命令启动复制,此时slave的IO线程开始工作。 - 连接建立过程:
- slave的IO线程根据配置的
MASTER_HOST
、MASTER_USER
和MASTER_PASSWORD
尝试与master建立TCP连接。 - 连接成功后,IO线程向master发送请求,请求获取从指定的
MASTER_LOG_FILE
和MASTER_LOG_POS
位置开始的二进制日志事件。 - master验证slave的连接请求,确认
replication_user
的权限等信息。如果验证通过,master开始向slave发送二进制日志事件。
- slave的IO线程根据配置的
- 关键参数:
MASTER_HEARTBEAT_PERIOD
:可选参数,用于设置master发送心跳包的时间间隔(以秒为单位),默认值为0,表示不使用心跳机制。当设置为非零值时,master会按照指定的时间间隔向slave发送心跳包,以保持连接活跃并检测连接状态。例如:
CHANGE MASTER TO MASTER_HEARTBEAT_PERIOD = 10;
MASTER_CONNECT_RETRY
:表示slave在连接master失败后,重新尝试连接的时间间隔(以秒为单位)。默认值是60秒。如果连接失败,IO线程会按照这个时间间隔不断尝试连接master。
- 在slave上执行
- 持续获取二进制日志事件
- slave的IO线程持续从master获取二进制日志事件,并将其写入到本地的中继日志(relay log)中。
- 当网络等原因导致连接中断时,IO线程会根据
MASTER_CONNECT_RETRY
设置的时间间隔尝试重新连接master,并从上次中断的位置继续获取二进制日志事件。
通过以上步骤和配置,slave的IO线程能够与master建立连接并持续获取二进制日志事件,实现数据的复制。