1、介绍
两台或以上的数据库实例、通过binlog实现、数据异步同步的关系
2、主从复制前提
1. 两台以上的MySQL实例 (同版本、同平台)、具备不同的server_id、server_uuid2. 主库: 开启binlog、创建复制用户3. 备份主库数据、恢复到从库4. 告知从库复制的起点: change master to user, password, ip, port, filename, GTID 或 pos;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、备份主库数据、恢复到从库
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. 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线程再请求
