一、为什么使用主从复制?
- 读写分离:写使用主库,读使用从库,减小主库压力
- 数据备份
一、主从复制的过程
主从复制默认是异步操作,有主库通知从库,如果采用从库轮询那么效率会很低,主库二进制日志有事件产生唤醒dump 线程就能马上通知从库,效率高的多。
- 主库提交事物时会写二进制日志,写完告诉存储引擎可以提交事物了。(涉及二段提交)
- 从库会启动一个IO线程连接主库,同时主库会启动一个dump线程来读取二进制日志中的事件,该线程不会轮询,当追上主库时会沉睡,当主库二进制日志有新事件产生时,会将其唤醒,从库IO线程会将接收到的事件写入中继日志
- SQL线程会读取中继日志的事件,并在从库执行,使得从库数据更新
二、异步复制,主库宕机后,数据可能丢失
- 半同步复制:提交事物时,不会马上响应客户端,必须确保有一个从库接收到了二进制日志并写入中继日志,返回ack后,才会响应客户端。需要注意的是:
- 从库不会阻塞主库事物提交,只是客户端通知延迟了。
- 从库不需要完成事物后在反馈.
- 备库如果一直没有回复已经收到事件,会超时并转化为异步复制模式
- 全同步复制:提交事物后,不会马上响应客户端,等待所有从库接收二进制日志并提交事物后,返回客户响应。可见十分损耗性能
三、主库写压力大,从库复制很可能出现延迟
写压力大,导致从库的SQL线程来不及消化那么多的写数据。
- 从库采用并行复制
- 加入缓存,减轻从库读的压力
- 主库分库,减轻单个库写入压力,对应的从库压力也减少
- 增强从库机器配置,SQL线程执行更快。
四、读写分离数据一致性问题
- 强一致性业务如缴费支付读写都采用主库
五、主从数据库状态查询命令
- 从库:show slave status \G;
- 主库:show master status \G;