Mysql学习(一)架构原理

这里写目录标题

  • 前言
    • Mysql的介绍
  • MySQL架构原理
    • MySQL体系架构
      • 网络连接层
      • 服务层(MySQL Server)
      • 存储引擎层
      • 系统文件层
  • MySQL日志系统原理
    • Undo Log
    • Redo Log
    • Binlog
    • Redo Log和Binlog区别

前言

Mysql的介绍

  1. MySQL 是最流行的关系型数据库软件之一,由于其体积小、速度快、开源免费、简单易用、维护成本低等,在集群架构中易于扩展、高可用,因此深受开发者和企业的欢迎。
  2. MySQL应用架构演变的过程
    • 架构V1.0 - 单机单库
      • 一个简单的小型网站或者应用背后的架构可以非常简单, 数据存储只需要一个MySQL Instance就能满足数据读取和写入需求(这里忽略掉了数据备份的实例),处于这个的阶段系统,一般会把所有的信息存到一个MySQL Instance里面。
        Mysql学习(一)架构原理_第1张图片
      • 缺点:
        • 数据量太大,超出一台服务器承受的数量
        • 读写操作量太大,超出一台服务器承受的操作量
        • 一台服务器挂了,应用也会挂掉(可用性差)
    • 架构V2.0 - 主从架构
      • 主从架构主要解决单机库架构下的高可用和读扩展问题,通过给Instance挂载从库解决读取的压力,主库宕机也可以通过主从切换保障高可用。在MySQL的场景下就是通过主从结构(双主结构也属于特殊的主从),主库抗写压力,通过从库来分担读压力,对于写少读多的应用,主从架构完全能够胜任。
        Mysql学习(一)架构原理_第2张图片
      • 缺点:
        • 数据量太大,超出一台服务器承受
        • 写操作太大,超出一台主服务器承受
    • 架构V3.0 - 分库分表
      • 对于单机库和主从遇到写入瓶颈和存储瓶颈时,可以通过水平拆分来解决,水平拆分和垂直拆分有较大区别,垂直拆分拆完的结果,每一个实例都是拥有全部数据的,而水平拆分之后,任何实例都只有全量的1/n的数据。
        Mysql学习(一)架构原理_第3张图片
      • 问题:
        • 数据之间的通信路由如何完成
        • 如何保持数据的一致性
    • 架构V4.0 - 云数据库
      • 云数据库(云计算)现在是各大IT公司内部作为节约成本的一个突破口,对于数据存储的MySQL来说,如何让其成为一个saas(Software as a Service)是关键点。MySQL作为一个saas服务,服务提供商负责解决可配置性,可扩展性,多用户存储结构设计等这些疑难问题。

MySQL架构原理

MySQL体系架构

Mysql学习(一)架构原理_第4张图片

  • MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。

网络连接层

  • 客户端连接器(Client Connectors):提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术,通过各自的API接口与Mysql创建连接。

服务层(MySQL Server)

  • 服务层是MySQL Server的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。
    • 连接池(Connection Pool):负责存储和管理客户端与数据库的连接,一个线程负责管理一个连接。

    • 系统管理和控制工具(Management Services & Utilities):例如备份恢复、安全管理、集群管理等

    • SQL接口(SQL Interface):用于接受客户端发送的各种SQL命令,并且返回用户需要查询的结果。比如DML、DDL、存储过程、视图、触发器等。

    • 解析器(Parser):负责将请求的SQL解析生成一个"解析树"。然后根据一些MySQL规则进一步检查解析树是否合法。

    • 查询优化器(Optimizer):当“解析树”通过解析器语法检查后,将交由优化器将其转化成执行计划,然后与存储引擎交互。

      • 例如:
        Mysql学习(一)架构原理_第5张图片
    • 缓存(Cache&Buffer): 缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,权限缓存,引擎缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

存储引擎层

存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异 。现在有很多种存储引擎,各有各的特点,最常见的是MyISAM和InnoDB。

系统文件层

  • 该层负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid 文件,socket 文件等。

  • 日志文件

    • 错误日志(Error log):默认开启,show variables like '%log_error%'
    • 通用查询日志(General query log):记录一般查询语句,show variables like '%general%';
    • 二进制日志(binary log)
      • 记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行时长;但是它不记录select、show等不修改数据库的SQL。主要用于数据库恢复和主从复制。
        Mysql学习(一)架构原理_第6张图片
    • 慢查询日志(Slow query log):记录所有执行时间超时的查询SQL,默认是10秒。
      在这里插入图片描述
  • 配置文件:用于存放MySQL所有的配置信息文件,比如my.cnf、my.ini等。

  • 数据文件

    • db.opt 文件:记录这个库的默认使用的字符集和校验规则。
    • frm 文件:存储与表相关的元数据(meta)信息,包括表结构的定义信息等,每一张表都会有一个frm 文件。
    • MYD 文件:MyISAM 存储引擎专用,存放 MyISAM 表的数据(data),每一张表都会有一个.MYD 文件。
    • MYI 文件:MyISAM 存储引擎专用,存放 MyISAM 表的索引相关信息,每一张 MyISAM 表对应一个 .MYI 文件。
    • ibd文件和 IBDATA 文件:存放 InnoDB 的数据文件(包括索引)。InnoDB 存储引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用 .ibd 文件来存放数据,且每一张InnoDB 表对应一个 .ibd 文件。共享表空间使用 .ibdata 文件,所有表共同使用一个(或多个,自行配置).ibdata 文件。
    • ibdata1 文件:系统表空间数据文件,存储表元数据、Undo日志等
    • ib_logfile0、ib_logfile1 文件:Redo log 日志文件。
  • pid 文件

    • pid 文件是 mysqld 应用程序在 Unix/Linux 环境下的一个进程文件,和许多其他 Unix/Linux 服务端程序一样,它存放着自己的进程 id。
  • socket 文件

    • socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端连接可以不通过TCP/IP 网络而直接使用 Unix Socket 来连接 MySQL。

MySQL日志系统原理

Undo Log

  1. 介绍:数据库事务开始之前,会将要修改的记录存放到 Undo 日志里,当事务回滚时或者数据库崩溃时,可以利用 Undo 日志,撤销未提交事务对数据库产生的影响。
    • Undo Log产生和销毁:Undo Log在事务开始前产生;事务在提交时,并不会立刻删除undolog,innodb会将该事务对应的undo log放入到删除列表中,后面会通过后台线程purge thread进行回收处理。Undo Log属于逻辑日志,记录一个变化过程。例如执行一个delete,undolog会记录一个insert;执行一个update,undolog会记录一个相反的update。
    • Undo Log存储:undo log采用段的方式管理和记录。在innodb数据文件中包含一种rollbacksegment回滚段,内部包含1024个undo log segment。可以通过下面一组参数来控制Undo log存储。show variables like '%innodb_undo%';
  2. 作用:
    • 实现事务的原子性:
      • Undo Log 是为了实现事务的原子性而出现的产物。事务处理过程中,如果出现了错误或者用户执行了 ROLLBACK 语句,MySQL 可以利用 Undo Log 中的备份将数据恢复到事务开始之前的状态。
    • 实现多版本并发控制(MVCC):
      • Undo Log 在 MySQL InnoDB 存储引擎中用来实现多版本并发控制。事务未提交之前,Undo Log保存了未提交之前的版本数据,Undo Log 中的数据可作为数据旧版本快照供其他并发事务进行快照读。
  3. 过程
    • 事务A手动开启事务,执行更新操作,首先会把更新命中的数据备份到 Undo Buffer 中。
    • 事务B手动开启事务,执行查询操作,会读取 Undo 日志数据返回,进行快照读
      Mysql学习(一)架构原理_第7张图片

Redo Log

  1. 介绍:指事务中修改的任何数据,将最新的数据备份存储的位置(Redo Log),被称为重做日志,Redo Log 是属于InnoDB引擎所特有的日志。

    • Redo Log 的生成和释放:随着事务操作的执行,就会生成Redo Log,在事务提交时会将产生Redo Log写入Log Buffer,并不是随着事务的提交就立刻写入磁盘文件。等事务操作的脏页写入到磁盘之后,Redo Log 的使命也就完成了,Redo Log占用的空间就可以重用(被覆盖写入)。
  2. 工作原理:Redo Log 是为了实现事务的持久性而出现的产物。防止在发生故障的时间点,尚有脏页未写入表的 IBD 文件中,在重启 MySQL 服务的时候,根据 Redo Log 进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。
    Mysql学习(一)架构原理_第8张图片

  3. Redo Log写入机制:Redo Log 文件内容是以顺序循环的方式写入文件,写满时则回溯到第一个文件,进行覆盖写。

  4. Redo Log相关配置参数:每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组至少有2个重做日志文件,默认为ib_logfile0和ib_logfile1。

    • 可以通过 show variables like '%innodb_log%';控制Redo Log存储:
      Mysql学习(一)架构原理_第9张图片

    • Redo Buffer 持久化到 Redo Log 的策略,可通过Innodb_flush_log_at_trx_commit 设置:

      • 0:每秒提交 Redo buffer ->OS cache -> flush cache to disk,可能丢失一秒内的事务数据。由后台Master线程每隔 1秒执行一次操作。
      • 1(默认值):每次事务提交执行 Redo Buffer -> OS cache -> flush cache to disk,最安全,性能最差的方式。
      • 2:每次事务提交执行 Redo Buffer -> OS cache,然后由后台Master线程再每隔1秒执行OScache -> flush cache to disk 的操作。
        Mysql学习(一)架构原理_第10张图片

Binlog

  1. MySQL Server也有自己的日志,即 Binarylog(二进制日志),简称Binlog。
  2. Binlog是记录所有数据库表结构变更以及表数据修改的二进制日志,不会记录SELECT和SHOW这类操作。Binlog日志是以事件形式记录,还包含语句所执行的消耗时间。开启Binlog日志有以下两个最重要的使用场景。
    • 主从复制:在主库中开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。
    • 数据恢复:通过mysqlbinlog工具来恢复数据。
  3. Binlog文件名默认为“主机名_binlog-序列号”格式。文件记录模式有STATEMENT、ROW和MIXED三种,具体含义如下:
    • ROW(row-based replication, RBR):日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
      • 优点:能清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。
      • 缺点:批量操作,会产生大量的日志,尤其是alter table会让日志暴涨。
    • STATMENT(statement-based replication, SBR):每一条被修改数据的SQL都会记录到master的Binlog中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。简称SQL语句复制。
      • 优点:日志量小,减少磁盘IO,提升存储和恢复速度
      • 缺点:在某些情况下会导致主从数据不一致,比如last_insert_id()、now()等函数。
    • MIXED(mixed-based replication, MBR):以上两种模式的混合使用,一般会使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择写入模式。
  4. Binlog文件结构:MySQL的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Logevent。不同的修改操作对应的不同的log event。比较常用的log event有:Query event、Row event、Xid event等。binlog文件的内容就是各种Log event的集合。
    • Binlog文件中Log event结构:
      Mysql学习(一)架构原理_第11张图片
  5. Binlog写入机制
    • 根据记录模式和操作触发event事件生成log event(事件触发执行机制)
    • 将事务执行过程中产生log event写入缓冲区,每个事务线程都有一个缓冲区,Log Event保存在一个binlog_cache_mngr数据结构中,在该结构中有两个缓冲区,一个是stmt_cache,用于存放不支持事务的信息;另一个是trx_cache,用于存放支持事务的信息。
    • 事务在提交阶段会将产生的log event写入到外部binlog文件中。不同事务以串行方式将log event写入binlog文件中,所以一个事务包含的log event信息在binlog文件中是连续的,中间不会插入其他事务的log event。
  6. Binlog文件操作
  • Binlog状态查看
show variables like 'log_bin';
  • 开启Binlog功能
set global log_bin=mysqllogbin;
  • 需要修改my.cnf或my.ini配置文件,在[mysqld]下面增加log_bin=mysql_bin_log,重启MySQL服务。
#log-bin=ON
#log-bin-basename=mysqlbinlog
binlog-format=ROW
log-bin=mysqlbinlog
  • 使用show binlog events命令
show binary logs; //等价于show master logs;
show master status;
show binlog events;
show binlog events in 'mysqlbinlog.000001';
  • 使用mysqlbinlog 命令
mysqlbinlog "文件名"
mysqlbinlog "文件名" > "test.sql"
  • 使用 binlog 恢复数据
    • mysqldump:定期全部备份数据库数据。mysqlbinlog可以做增量备份和恢复操作。
//按指定时间恢复
mysqlbinlog --start-datetime="2020-04-25 18:00:00" --stopdatetime="
2020-04-26 00:00:00" mysqlbinlog.000002 | mysql -uroot -p1234
//按事件位置号恢复
mysqlbinlog --start-position=154 --stop-position=957 mysqlbinlog.000002
| mysql -uroot -p1234
  • 删除Binlog文件
    • 可以通过设置expire_logs_days参数来启动自动清理功能。默认值为0表示没启用。设置为1表示超出1天binlog文件会自动删除掉。
purge binary logs to 'mysqlbinlog.000001'; //删除指定文件
purge binary logs before '2020-04-28 00:00:00'; //删除指定时间之前的文件
reset master; //清除所有文件

Redo Log和Binlog区别

  • Redo Log是属于InnoDB引擎功能,Binlog是属于MySQL Server自带功能,并且是以二进制文件记录。
  • Redo Log属于物理日志,记录该数据页更新状态内容,Binlog是逻辑日志,记录更新过程。
  • Redo Log日志是循环写,日志空间大小是固定,Binlog是追加写入,写完一个写下一个,不会覆盖使用。
  • Redo Log作为服务器异常宕机后事务数据自动恢复使用,Binlog可以作为主从复制和数据恢复使用。Binlog没有自动crash-safe能力。

你可能感兴趣的:(Mysql,数据库,mysql)