架构师进阶之七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异步同步数据。但是数据同步时间不确定。

标准异步复制

MySQL Replication

半同步复制

和全同步区别是: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

特点:不共享,分布式,同步复制。

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/88342520