1、介绍

两台或以上的数据库实例、通过binlog实现、数据异步同步的关系

2、主从复制前提

  1. 1. 两台以上的MySQL实例 (同版本、同平台)、具备不同的server_idserver_uuid
  2. 2. 主库: 开启binlog、创建复制用户
  3. 3. 备份主库数据、恢复到从库
  4. 4. 告知从库复制的起点: change master to user, password, ip, port, filename, GTID pos;
  5. 5. 开启同步: 启动线程 start slave;

3、主从复制搭建

3.1、准备 MySQL多实例

说明: 2台以上的 MySQL实例 (同平台、同版本、不同server_id、server_uuid)

检查主从的server_id、server_uuid, 不能相同
mysql  -e  "select @@server_id";
mysql  -e  "select @@server_uuid";

3.2、主库开启 binlog、创建主从复制用户

#开启binlog
server_id=3316
log_bin=/data/3316/logs/mysql-bin

#创建复制用户
8.0 版本以前创建复制用户方法
create user 'backup'@'127.0.0.1' identified by '123';
grant replication slave on *.* to 'backup'@'127.0.0.1';

#8.0 版本需要修改密码插件sha2修改未native
方式一: 创建用户时指定密码插件
create user 'slave'@'127.0.0.1' identified with mysql_native_password  by '123';
grant replication slave on *.* to 'slave'@'127.0.0.1';

方式二: 设置默认密码插件为native
default_authentication_plugin=mysql_native_password

3.3、备份主库数据、恢复到从库

mysqldump、xtrabackup

3.4、告知从库复制的起点:

change master to user, password, ip, port, filename, GTID 或 pos;

#查看帮助
mysql> help change master to

#change  master  to
CHANGE MASTER TO
  MASTER_HOST='master2.example.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master2-bin.001',
  MASTER_LOG_POS=4,
  MASTER_CONNECT_RETRY=10;

#主从复制, 主库不需要锁表 (从库会从那个pos号开始回放), 但是change master to, 需要与从库的实际数据一致

3.5、启动线程

start slave;

3.6、查看主从复制状态

#从库执行
show slave status\G

4、主从复制原理

4.1、涉及到的线程

show processlist;

主库涉及到的线程

Binlog Dump Thread: 二进制日志同步线程

从库涉及到的线程

IO 线程、SQL线程

4.2、涉及到的日志

主库涉及到的日志

BinLog: 二进制日志

从库涉及到的日志

RelayLog: 中继日志
默认位置: datadir/hostname-relay-bin.00000x
作用: 存储获取到的BinLog

4.3、涉及到的文件

主库: master.info: 主库信息文件

默认位置: datadir/master.info
作用: 记录主库ip、port、user、password、binlog 位置点等信息

8.0 区别
mysql 8.0 开始, 用表的方式存储, 没有 master.info 和 relay-log.info 文件

从库: 中继日志应用信息

默认位置: datadir/relay-log.info
作用: 记录SQL线程回放到的位置点信息

4.4、主从复制原理

https://www.jianshu.com/p/6ed2cc292077
主从复制 - 图1

主从复制原理描述

1. change master to 时, ip pot user password binlog position 号写入到 master.info进行记录
2. start slave 时, 从库会启动 IO线程 和 SQL线程
3. IO线程: 读取master.info信息, 获取主库信息连接主库
4. 主库会生成一个准备 binlog DUMP线程, 来响应从库
5. IO线程根据 master.info记录的 binlog文件名和 position号, 请求主库 DUMP线程最新日志
6. DUMP线程检查主库的 binlog日志, 如果有新的, TCP/IP (传送)给从库的IO线程
7. IO线程将收到的日志存储到了 TCP/IP缓存, 立即返回ACK给主库, 主库工作完成
8. IO线程将缓存中的数据, 存储到 relay-log日志文件, 更新 master.info文件 binlog文件名和 postion, IO线程工作完成
9. SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
10. SQL线程回放完成之后, 会更新 relay-log.info文件
11. relay-log 会有自动清理的功能

细节:
1. 主库一旦有新的日志生成, 会发送 "信号" 给binlog dump, IO线程再请求