0
点赞
收藏
分享

微信扫一扫

MySQL复制-要求及配置

本文问题


  1. 简要描述一下复制是如何实现的?
  2. 复制需要在主库和从库上进行哪些配置?
  3. 复制使用了哪些线程?这些线程的作用是什么?如何查看这些线程?
  4. 如何配置延迟复制?

复制过程


  1. 主库在二进制日志中记录数据库中的所有更改。
  2. 连接到主库的每个从库都请求复制主库的二进制日志,将其写入到自身的中继日志中,并根据从库上的过滤规则执行二进制日志中的事件。
  3. 从库会存储并维护复制相关的信息

复制要求和简单配置过程


  • 主库必须启用二进制日志

[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​


问题答案


  1. 简要描述一下复制是如何实现的?
    主库把事务记录到日志中,从库获取日志并进行应用
  2. 复制需要在主库和从库上进行哪些配置?
    主库必须启用​​log_bin​​,主库和从库的​​server_id​​必须不同。
    如果要使用GTID自动定位,主库还需要设置​​gtid_mode=on,enforce_gtid_consistency=on​​,当数据库版本为5.6时,从库必须设置​​log_bin​​及​​log_slave_updates​
  3. 复制使用了哪些线程?这些线程的作用是什么?如何查看这些线程?
    主库​​binlog dump​​线程:发送二进制日志
    从库​​IO​​线程:获取主库发送的日志并记录到中继日志中
    从库​​SQL​​线程:应用中继日志中的事务
  4. 如何配置延迟复制?
    ​CHANGE MASTER TO MASTER_DELAY=N​


举报

相关推荐

0 条评论