(目录)
本文问题
- 简要描述一下主从同步是如何实现的?
- 主从同步需要在主库和从库上进行哪些配置?
- 主从同步使用了哪些线程?这些线程的作用是什么?如何查看这些线程?
- 如何配置延迟同步?
同步过程
- 主库在二进制日志中记录数据库中的所有更改。
- 连接到主库的每个从库都请求同步主库的二进制日志,将其写入到自身的中继日志中,并根据从库上的过滤规则执行二进制日志中的事件。
- 从库会存储并维护同步相关的信息
主从同步要求和简单配置过程
- 主库必须启用二进制日志
[mysqld]
log_bin=mysql-bin
- 主库和从库必须具有不同的ID标识
server_id
[mysqld]
server-id=1
- 从库上要有一个能够连接到主库的账号,该账号需要具有
REPLICATION SLAVE
权限
# 由于同步使用的账号会存储在从库的文件/表中 建议为同步单独创建一个账号
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
- 从库需要使用
CHANGE MASTER TO
语句设置相关主库的信息
mysql> CHANGE MASTER TO
> MASTER_HOST = host,
> MASTER_PORT = port,
> MASTER_USER = user,
> MASTER_PASSWORD = password,;
- 从库需要设置主库的二进制日志文件和位置或者使用
GTID
进行自动定位
# 使用二进制日志文件和位点进行同步
mysql> CHANGE MASTER TO
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
# 使用GTID自动定位
mysql> CHANGE MASTER TO
-> MASTER_AUTO_POSITION = 1;
主从同步的启停和控制
可以独立控制IO THREAD
和SQL THREAD
的启停
启动同步
START SLAVE
START SLAVE IO_THREAD
START SLAVE SQL_THREAD
停止同步
STOP SLAVE
STOP SLAVE IO_THREAD
STOP SLAVE SQL_THREAD
跳过事务
STOP SLAVE
SET GLOBAL SLAVE_SQL_SKIP_COUNTER=1
START SLAVE
同步线程
主从同步功能是通过三个线程实现的,对于每套主从,都有一个线程在主库上,两个线程在从库上。
主库
- Binlog dump thread
在从库连接后,主库创建一个线程来发送二进制日志中的内容。
这个线程可以在
SHOW PROCESSLIST
中查看到,Command
是Binlog Dump
从库
从库使用两个线程,将对主库数据的读取和更新拆分为两个独立的任务。
- Slave I/O thread
在从库上执行
START SLAVE
时,从库会创建一个I/O线程来连接主库并请求主库发送二进制日志中的记录 从库的I/O线程读取主库Binlog Dump
线程发送的记录并且将他们同步到本地的中继日志文件中。 这个线程可以在SHOW SLAVE STATUS
中查看,Slave_IO_running
- Slave SQL thread
从库创建一个SQL线程来读取I/O线程写入的中继日志并执行其中包含的事件
这个线程可以在
SHOW SLAVE STATUS
中查看,Slave_SQL_running
延迟同步
MySQL支持延迟同步,可以强制要求从库落后于主库多久后再执行事务。配置方式:
CHANGE MASTER TO MASTER_DELAY=N
N
为延迟的秒数
查看延迟相关信息
SHOW SLAVE STATUS
SQL_Delay
一个非负整数,表示从库必须落后于主库的秒数SQL_Remaining_Delay
当等待延迟时,显示剩余等待延迟的秒数,其他时间,值为NULL
Slave_SQL_Running_State
IO线程状态,当等待延迟时,状态为Slave_SQL_Running_State is Waiting until MASTER_DELAY seconds after master executed event
问题答案
- 简要描述一下主从同步是如何实现的? 主库把事务记录到日志中,从库获取日志并进行应用
- 主从同步需要在主库和从库上进行哪些配置?
主库必须启用
log_bin
,主库和从库的server_id
必须不同。 如果要使用GTID自动定位,主库还需要设置gtid_mode=on,enforce_gtid_consistency=on
,当数据库版本为5.6时,从库必须设置log_bin
及log_slave_updates
- 主从同步使用了哪些线程?这些线程的作用是什么?如何查看这些线程?
主库
binlog dump
线程:发送二进制日志 从库IO
线程:获取主库发送的日志并记录到中继日志中 从库SQL
线程:应用中继日志中的事务 - 如何配置延迟同步?
CHANGE MASTER TO MASTER_DELAY=N