架构师进阶之七Mysql数据库原理题
Redo Undo
Mysql 非常重要的三个日志文件。我们一一分析讲解。
Redo log:顾名思义,防止操作丢失,记录数据的变动。为了保证数据持久化到磁盘。redo log记录的是新变更的操作语句。
数据修改写入data buffer之前,先持久化redo log到磁盘。
Undo log: 顾名思义,撤销操作变更。回滚数据,为了保持数据的事务性。 undo log记录的是变更之前的sql语句,比如插入一条新的语句,那么undo log 记录的就是delete 这条语句。
举个例子:
例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为<T1, X, 5>
,Redo日志为<T1, X, 15>
。
|
UNDO | REDO |
Record of | How to undo a change | How to reproduce a change |
Used for | Rollback, Read-Consistency | Rolling forward DB Changes |
Stored in | Undo segments | Redo log files |
Protect Against | Inconsistent reads in multiuser systems | Data loss |
关于Undo log存储的补充解释:
An undo segment is just a segment, like a table or an index or a hash cluster or a materialized view is a segment
Undo log是InnoDB MVCC事务特性的重要组成部分。当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中,但从5.6开始,也可以使用独立的Undo 表空间。
Binlog
什么是binlog?记录数据库增删改的二进制文件,不包括查询。用于数据恢复。
三种复制方式
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED
binlog同步延迟问题
1. 网络问题
2 机器性能 iostat查询io运行情况
3. 大事务
show processlist命令查询数据库线程运行情况
以及使用mysqlbinlog查看binlog中的SQL就能快速进行确认
4. 锁
利用show processlist命令以及查看锁命令进行排除。
Table_locks_immediate 指的是能够立即获得表级锁的次数
Table_locks_waited 指的是不能立即获取表级锁而需要等待的次数,如果数量大,说明锁等待多,有锁争用情况
information_shcema下的三张表(通过这三张表可以更新监控当前事物并且分析存在的锁问题)
—— innodb_trx ( 打印innodb内核中的当前活跃(ACTIVE)事务)
—— innodb_locks ( 打印当前状态产生的innodb锁 仅在有锁等待时打印)
—— innodb_lock_waits (打印当前状态产生的innodb锁等待 仅在有锁等待时打印)
5. 多线程
多线程问题可能是DBA们遇到最多的问题,之前在5.1和5.5版本,mysql的单线程复制瓶颈就广受诟病。从5.6开始mysql正式支持多线程复制。很容易想到,如果是单线程同步的话,单个线程存在写入瓶颈,导致主从延迟。那就先调整为多线程试试效果。
可以通过show processlist查看是否有多个同步线程,也可以查看参数的方式查看是否使用多线程(show variables like '%slave_parallel%')
变量slave-parallel-type可以有两个值:DATABASE 默认值,基于库的并行复制方式;LOGICAL_CLOCK:基于组提交的并行复制方式
组提交的作用:
-
在没有开启binlog时
Redo log的刷盘操作将会是最终影响MySQL TPS的瓶颈所在。为了缓解这一问题,MySQL使用了组提交,将多个刷盘操作合并成一个,如果说10个事务依次排队刷盘的时间成本是10,那么将这10个事务一次性一起刷盘的时间成本则近似于1。
- 当开启binlog时
为了保证Redo log和binlog的数据一致性,MySQL使用了二阶段提交,由binlog作为事务的协调者。而 引入二阶段提交 使得binlog又成为了性能瓶颈,先前的Redo log 组提交 也成了摆设。为了再次缓解这一问题,MySQL增加了binlog的组提交,目的同样是将binlog的多个刷盘操作合并成一个,结合Redo log本身已经实现的 组提交,分为三个阶段(Flush 阶段、Sync 阶段、Commit 阶段)完成binlog 组提交,最大化每次刷盘的收益,弱化磁盘瓶颈,提高性能。
主从复制和集群
Mysql 主从复制
mysql主从复制实现就是主从分离,master负责写,slave是只读模式。主从之间通过binlog异步同步数据。但是数据同步时间不确定。
标准异步复制
半同步复制
和全同步区别是:master只有当其中一个slave回复确认后才会继续发送bin log。半同步考虑数据一致性,但是对性能有影响
图片摘自:https://blog.csdn.net/fd2025/article/details/80091343
https://www.percona.com/blog/2017/02/07/overview-of-different-mysql-replication-solutions/
https://www.jianshu.com/p/ed19bb0e748a
Mysql cluster
MySQL Cluster is a shared nothing, distributed, partitioning system that uses synchronous replication in order to maintain high availability and performance
特点:不共享,分布式,同步复制。