卢飞:浅析MySQL replication.pdf
文本预览下载声明
浅析 MySQL Replication
卢飞
复制的用途
? 读写分离
? 灾备/高可用
? 统计
? 备份
复制如何工作
主要步骤
? Master将改变记录到二进制日志Binary log中
? Slave 将主库上的日志复制到自己的Relay log中
? Slave上SQL线程回放中继日志的内容,将其Slave上的数据与
Master一致
Binary log 格式
? STATEMENT
--记录操作的SQL语句
? ROW
--记录操作的每一行数据的变化信息
? MIXED
--混合模式
-- STATEMENT--》ROW
STATEMENT
? 优点
? 减少了binlog 日志量,节约IO,提高性能
? 缺点
? 不是所有的DML语句都能被复制
? UUID() ,FOUND_ROWS(),USER()
ROW (推荐使用)
? 优点
? 任何情况都可以被复制,ROW模式是最安全可靠的
? 缺点
? 产生大量的日志,copy data 的DDL会让日志暴涨
MIXED
? 默认会先使用STATEMENT模式保存binlog,对于STATEMENT模式无
法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL
语句选择日志保存方式。
? Bug较多,不建议使用
Binlog Event
疑问
? 为什么MySQL 有二进制日志,InnoDB还有redo 日志?
? 事务是如何提交的?
? 事务提交先写二进制日志还是重做日志?
? 如何保证这两部分的日志做到一致性?
体系架构
事务是怎样提交的
1)SQL语句已经成功执行并生
成redo和undo的内存日志
2 )Binary log write()--》fsync()
3 )存储引擎内提交使undo和
redo永久写入磁盘
双1保证
控制MySQL 磁盘写入策略以及数据安全性的关键参数,MySQL为了保证主库
和从库的数据一致性,就必须保证Binlog和InnoDB redo 日志的一致性
? innodb_flush_log_at_trx_commit (redo)
--0 log buffer将每秒一次地写入log file中,并且flush操作同时进行
--1 每次事务提交时都会把log buffer的数据写入log file,并且flush到磁盘
--2 每次事务提交时MySQL都会把log buffer的数据写入log file ,不flush
? sync_binlog (binlog)
--0 刷新binlog_cache中的信息到磁盘 由os决定
--1 每次事务提交刷新binlog_cache中的信息到磁盘
sync_binlog
? prepare_commit_mutex
MySQL 5.6
Binary Log Group Commit
? Flush stage :Leader线程遍历
显示全部