<深入浅出mysql>笔记---复制
一.什么是复制?
主库DDL,DML操作通过++BinLog++传给从库重做。
- DDL--数据定义语言,create,drop,alter
- DML--数据操作语言,insert,delete,update,select
- 重做:对数据变更日志重执行
二. 为什么要复制?
保持主从一致:
- 主库错误,切换从库
- 从库查询(实时要求低),读写分离;
- 从库备份
三.复制原理
步骤
- 主库数据更改事件记录到BinLog
2.从库发起IO线程连接主库 - 主库通过Binlog dump线程推送BinLog事件给从库RelayLog(中继日志)
- 从库SQL线程按RelayLog重做
三线程
从库
- IO线程--连接主库
- SQL线程--读取relaylog重做
主库
- Binlog dump线程--读取数据库事件发送给IO线程
四. 复制三种方式
statement语句级
row行级
语句或行混合
1.语句级复制(Statement-based replication)
每条修改数据的SQL均记录
2.行级复制
- 记录每行数据变化,除原始SQL外
- 日志量大
3.行或语句复制(mixed)
- 默认statement
- 有时切到Row(SQL含时间,用户相关的函数时)
五.复制四种日志
Binlog
Relaylog
master.info
Relay-log.info
1. Binlog(二进制日志)
- 内容
除select外的所有数据修改操作 - 三种格式
- statement
- row
- mixed
2. Relaylog
- 内容同Binlog
- 重做完自动删除Relaylog
3. master.info
- 记录从库复制主库Binlog进度
从库创建
4. relay-log.info
- 记录从库应用relaylog进度
从库创建
六.复制三种架构
一主多从
多级
双主
双主多级
1.一主多从复制
读写分离
- 读-->从库(实时性低)
- 写-->主库(实时性高)
- 存在IO负载和网络压力
2.多级复制
- binlog仅推送给master2
- 优点:解决了主库IO负载和网络压力
- 缺点:延时
- 解决办法:
Master2表引擎设为blackhole(写入表数据仅记录Binlog,不回写磁盘)
3.双主复制
- Master1/Master2互为主从
- 写访问M1,读访问M2
- 优点:避免搭建额外从库
- 场景:异地办公室
4.双主多级(级联)复制
七. 复制两种方式
异步复制
半同步复制
1. 异步复制
- 主库commit--写入binlog--返回client
- 主从延迟--不一致
2. 同步复制
主库commit--从库收到Binlog--写入relaylog--返回client
八. 主从复制延时解决方案
写入压力较大时
1. 提高从库硬件配置
2. 架构优化(推荐)
1) 分表复制
思想:
不同从库复制不同库/表 -- 热点分散
设置参数replicate-do-db/table
/replicate-ignore-db/table
实现
2)多线程复制(schema based)
思想:
每个schema(database)独立线程,从库并行更新