《The Art of InnoDB》第一部分|第2章:基础原理-整体架构

第2章:整体架构

目录

第2章:整体架构

2.1 单机架构

2.1.1 Mysql架构分层

2.1.2 InnoDB架构分层

2.1.3 小结

2.2 集群架构

2.2.1 主从模式

2.2.2 Cluster模式

2.2.3 主从模式和Cluste的区别

2.2.4 小结

2.3 总结


2.1 单机架构

2.1.1 Mysql架构分层

下图描述了Mysql的架构层级

在MySQL的架构中,每个层级都有其特定的职责

SQL Interface:

  • 接收请求:接收来自客户端的SQL查询请求。
  • 验证权限:检查用户是否有权限执行请求的操作。
  • 解析查询:将客户端提交的SQL语句分解成可理解的元素。

Parser & Optimizer:

  • 解析SQL语句:将SQL语句分解成的元素组装成一棵抽象语法树(AST)。
  • 优化查询计划:分析AST并优化查询执行计划,选择最有效的方式来执行查询(例如,选择合适的索引)。这是查询优化器所做的事情,这一部分是所有数据库厂商最黑的黑科技所在。
  • 生成执行计划:将优化后的查询计划编译成可以被存储引擎执行的操作序列。

Pluggable Engines:

  • 数据存储与检索:存储引擎负责数据的存储、检索、更新和删除操作。
  • 事务处理:对于支持事务的存储引擎(如InnoDB),它们负责实现事务的ACID属性(原子性、一致性、隔离性和持久性)。
  • 锁定机制:管理数据并发访问的锁定机制,保证多用户环境下数据的一致性。
  • 表和索引的维护:维护表结构和索引,优化数据访问和查询性能。

具体到InnoDB存储引擎,它的职责更加具体化:

  • 行级锁定:提供行级锁定,减少并发访问时的锁争用。
  • MVCC支持:通过多版本并发控制(MVCC)支持更高的并发读写。
  • 外键约束:支持外键约束以维护数据的引用完整性。
  • 更改缓冲区:允许更改操作(如插入、删除、更新)在不直接更新主索引的情况下缓存,以实现更快的写操作。
  • 自动崩溃恢复:在系统崩溃后自动恢复数据一致性。
  • 缓冲池管理:维护一个内存中的缓冲池,用于缓存数据和索引页,加快读写速度。

这些层级一起构成了MySQL的架构,它们通过定义清晰的界限和职责,使得MySQL的功能强大而且灵活。在这个架构中,每个层级都是专注于其职责的专家,而存储引擎的可插拔性使得MySQL可以针对不同的工作负载和场景进行优化。


2.1.2 InnoDB架构分层

按照功能维度区分,InnoDB整体可以分为以下三个部分

缓存区:

缓存区主要是指InnoDB的缓冲池(Buffer Pool),以及与之相关的一些内存数据结构,其职责包括:

缓冲池管理

  • 存储数据页和索引页,减少对磁盘I/O的依赖,加快数据读取速度。
  • 管理脏页(已修改的数据页),定期将它们刷新回磁盘以保持数据的持久性。

更改缓冲(Change Buffer)

  • 缓存非唯一索引的DML操作,提高非主键索引的更新效率。

重做日志缓冲区(Redo Log Buffer)

  • 临时存储即将写入磁盘的重做日志记录,确保事务的原子性和持久性。

自适应哈希索引(Adaptive Hash Index)

  • 对热点数据创建哈希索引,提高频繁访问数据的查询效率。

UNDO日志缓存

  • 缓存记录了事务修改前数据的日志,用于支持数据的回滚操作和MVCC。

磁盘区:

磁盘区涉及到InnoDB的物理存储,其职责包括:

数据文件管理

  • 存储实际的表数据、索引和表空间等信息。

日志文件管理

  • 维护重做日志文件(Redo Log Files),用于事务的回放以实现故障恢复。

UNDO表空间

  • 存储UNDO日志的物理文件,用于存储事务进行中的旧行版本。

二进制日志(Binary Log)

  • 虽然是MySQL的一部分而非InnoDB专有,但它记录了所有对数据库所做的更改,用于复制和数据恢复。

调度线程:

调度线程指的是InnoDB中负责各种后台任务的线程,其职责包括:

主线程(Master Thread)

  • 负责协调各种后台活动,如异步I/O请求、脏页的刷新等。

I/O线程

  • 负责处理所有的输入输出请求,例如读写数据页到磁盘或从磁盘读入。

清理线程(Purge Thread)

  • 清除已完成事务留下的无用信息,如UNDO日志的清理。

页清洗线程(Page Cleaner Thread)

  • 负责刷新脏页,确保缓冲池中的数据及时同步到磁盘。

锁定监控线程

  • 监测死锁的发生并进行处理,以及对锁定情况进行监控。

这三个大部分相互协作,使InnoDB能够高效地处理大量数据,同时提供事务支持、故障恢复和数据一致性等特性。


2.1.3 小结

        InnoDB是MySQL数据库的核心存储引擎,其结构精心设计,将责任分配给了三个主要部分:缓存区、磁盘区和调度线程。缓存区主要由缓冲池构成,它缓存了数据和索引页,加速读取速度并有效管理脏页。更改缓冲优化了对非主键索引的修改,而重做日志缓冲区则确保事务的原子性和持久性。自适应哈希索引和UNDO日志缓存协助提高了查询效率和支持了MVCC。磁盘区涵盖了InnoDB的物理存储,管理着数据文件、日志文件和UNDO表空间,这些都是数据持久化和恢复的基础。调度线程包括了一系列后台线程,如主线程、I/O线程、清理线程,它们负责维护数据库的内部健康,如定期刷新脏页和清除无效数据,确保数据库性能的最优化。InnoDB通过这些部分的紧密协作,提供了高效的数据处理、并发控制和故障恢复,满足了高性能数据库系统的需求,使得MySQL能够胜任从小型应用到大型企业级应用的各种场景。


2.2 集群架构

        InnoDB 自身并不直接提供集群架构的功能,它是一个单节点的事务存储引擎。然而,当与 MySQL 配合时,可以使用额外的组件和服务来构建集群架构。以下是几种常见的 MySQL 集群架构方案,其中都能使用 InnoDB 作为存储引擎:

2.2.1 主从模式

在这种架构中,一个主节点(master)负责处理写操作,而一个或多个从节点(slave)负责读操作。从节点可以从主节点复制数据并提供读取服务,从而提高读取性能和系统的可用性。

  1. 主服务器 - 该服务器负责处理所有写操作(INSERT, UPDATE, DELETE)并生成二进制日志(binary log)。这个日志记录了对数据库的所有更改,这些更改需要被复制到从服务器。
  2. 从服务器 - 该服务器通过其I/O线程从主服务器获取二进制日志,并将其存储在自己的中继日志(relay log)中。然后从服务器的SQL线程会读取中继日志并应用这些更改,以确保从服务器的数据与主服务器保持一致。

简单示意图如下:

        这里的箭头表示数据流动的方向,从主服务器的二进制日志流向从服务器的中继日志。主从复制可以配置为同步或异步。在异步复制中,主服务器在写入二进制日志后不需要等待从服务器确认,它继续处理其他操作。而在半同步复制中,主服务器至少要等待一个从服务器接收并记录了数据更改后才会继续处理。

优点:

1. 读写分离:可以将读操作分散到从服务器上,减轻主服务器的压力。

2. 数据冗余:从服务器提供数据的备份,增加了系统的故障容忍性。

3. 可扩展性:通过添加更多的从服务器,可以提高查询的吞吐量。

4. 高可用性:在主服务器出现问题时,可以手动将从服务器提升为新的主服务器,保持服务的可用性。

5. 灵活性:从服务器可以配置为只读,也可以开启二进制日志以支持级联复制。

6. 数据迁移与备份:可以在从服务器上进行数据备份操作,避免影响主服务器的性能。

缺点:

1. 复制延迟:由于复制是异步的,从服务器上的数据可能会有延迟。

2. 复杂的故障恢复:当主服务器宕机时,需要手动进行故障恢复和角色切换。

3. 写入扩展性有限:所有写操作和事务性工作负载仍然需要在主服务器上进行,这限制了写入操作的扩展性。

4. 数据一致性:如果复制过程中遇到问题(比如网络问题或从服务器故障),可能会导致主从服务器之间的数据不一致。

5. 管理和维护:需要额外的努力来监控复制状态并管理不同服务器,特别是当复制架构变得复杂时。

6. 无自动故障转移:MySQL主从复制不提供自动的故障转移机制;需要额外的工具或手动操作来实现。


2.2.2 Cluster模式

        MySQL InnoDB Cluster 提供了高可用性的解决方案。它使用了 MySQL Group Replication 技术,这是一个基于 Paxos 算法变体的一致性协议实现。它提供了一组紧密集成的 MySQL 服务器实例,它们组成了一个组复制集群。一个 InnoDB Cluster 至少包含三个 MySQL Server 实例。各个节点之间互为主节点,可以自动处理故障转移和数据一致性。

在这个图中:

  • 每个 "MySQL Node" 节点都是 InnoDB Cluster 的一部分。通常,一个节点作为 "Primary"(主节点)充当读写节点,而其他节点作为 "Secondary"(从节点)通常只用于读取操作,以分担查询负载。
  • "Primary" 节点负责处理所有写操作,而 "Secondary" 节点则复制 "Primary" 节点上的数据更改,确保数据的一致性。
  • "MySQL Router" 是客户端和应用程序的接入点,它负责将客户端请求重定向到正确的服务器节点,并提供读写分离以及负载均衡功能。
  • 所有的节点之间都是通过组复制技术相互连接的,确保数据在节点之间同步。

优点:

1. 高可用性:InnoDB Cluster 提供了自动故障转移和恢复功能,可以在节点故障时自动重新路由流量到健康节点。

2. 数据一致性:通过基于Quorum的写集一致性保证,确保数据在集群的所有节点间保持一致。

3. 易于管理:MySQL Shell 提供了管理集群的工具和接口,使得集群的配置和管理变得简单。

4. 读写扩展性:支持读写分离,可以利用从节点来分散读取负载。

5. 多主模式:支持单主模式和多主模式,后者允许所有服务器节点都可读写。

6. 无需额外中间件:直接集成在 MySQL 中,不需要额外的代理或中间件进行读写分离。

缺点:

1. 性能开销:由于复制数据需要占用网络资源和处理时间,可能会对写入操作的性能造成一定影响。

2. 配置复杂性:尽管有工具简化管理,但与单节点MySQL相比,集群的配置和管理更为复杂。

3. 资源要求:对于小型应用来说,维护一个完整的集群可能是资源密集型的,特别是在需要确保节点足够多以便提供高可用性时。

4. 网络要求:高依赖网络质量,节点之间需要稳定且低延迟的网络连接,以维持群组复制的性能。

5. 学习曲线:对于新用户来说,理解和正确配置 InnoDB Cluster 可能需要时间。

6. 节点数量限制:出于性能考虑,建议的节点数量通常有上限。例如,一个推荐配置可能只包含3到5个节点。


2.2.3 主从模式和Cluste的区别

InnoDB 主从模式和 InnoDB Cluster 是两种不同的MySQL数据复制和高可用性解决方案。以下是它们之间的一些关键区别:

复制方法

  • 主从模式 使用传统的异步二进制日志复制技术。主服务器生成二进制日志(binlog),从服务器通过I/O线程读取这些日志,并通过SQL线程应用这些更改。这个过程可能导致主从之间的延迟,并且复制并不是自动同步的。
  • InnoDB Cluster 使用了 MySQL Group Replication 技术,它实现了更紧密的同步复制。在InnoDB Cluster中,数据几乎同时在所有节点上更新,确保了数据的一致性和高可用性。

高可用性和故障转移

  • 主从模式 通常需要手动或通过第三方工具进行故障转移。如果主服务器宕机,需要人为介入来提升一个从服务器为新的主服务器。
  • InnoDB Cluster 提供了自动的故障转移和恢复功能。如果主节点(或Primary节点)发生故障,集群会自动选举一个新的Primary节点,而不需要人工干预。

读写分离

  • 主从模式 通常需要额外的代理软件(如MySQL Router或ProxySQL)来实现读写分离。
  • InnoDB Cluster 可以直接与 MySQL Router 配合使用来实现智能的读写分离和负载均衡。

部署复杂性

  • 主从模式 相对简单,可以用于不同的环境和需求。它适用于从简单的备份复制到复杂的多源复制环境。
  • InnoDB Cluster 需要更复杂的设置和配置,通常是为了提供无缝的高可用性解决方案。

节点配置

  • 主从模式 中,只有一个主服务器负责写操作,其他从服务器负责读操作。主服务器是单点故障的风险点。
  • InnoDB Cluster 中,每个节点都可以配置为自动接管为主节点。这样即使一个节点失败,集群仍然可以继续提供服务。

一致性保证

  • 主从模式 可能会遇到复制延迟,这意味着在某些情况下,从服务器可能暂时落后于主服务器。
  • InnoDB Cluster 中的 Group Replication 保证了更强的数据一致性,因为它使用了 Paxos-like 协议来同步数据更改。

简而言之,InnoDB 主从模式适合于数据备份和读取扩展场景,而InnoDB Cluster为寻求自动化高可用性和数据一致性的复杂部署提供了更现代和健壮的解决方案。


2.2.4 小结

        InnoDB存储引擎自身不直接提供集群功能,但可以通过MySQL的额外组件和服务实现集群架构。在InnoDB的主从模式中,主节点负责写操作,而从节点处理读操作并从主节点同步数据。这种架构的优点在于可以通过从节点的读操作缓解主节点的压力,同时提供数据冗余和较高的读取扩展性。然而,主从模式存在复制延迟,复杂的故障恢复流程,以及写入扩展性有限的缺点。相比之下,MySQL InnoDB Cluster提供了更高的可用性和数据一致性,支持自动故障转移,且易于管理。它支持多主模式,无需额外中间件,但同时这种模式可能带来写入性能开销,配置和管理上的复杂性,较高的资源需求,对网络质量的依赖,以及新用户可能面临的学习曲线。此外,InnoDB Cluster建议的节点数量通常有上限,以确保集群的高性能运行。总的来说,选择合适的集群模式需要综合考虑应用场景、资源可用性和管理复杂度等因素。


2.3 总结

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807177.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器,其任务是区分目标和周围环境。为了应对自然图像变化,此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

Android 如何添加自定义字体

Android 如何添加自定义字体 比如我要添加 jetbrains 相关字体 在 res 文件夹中添加 font 文件夹。里面放入你的字体文件 .ttf .otf,字体文件名需要是小写,只能是字母和下划线。 在 xml 布局文件中直接通过 android:fontFamily"font/jetbrainsmo…

【JVM】StringTable 字符串常量池

参考:javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式(区别于new)给一个…

【回顾】蚂蚁链自研TEE技术全项通过国家金融科技认证中心认证

2022年3月,蚂蚁集团自研TEE技术(HyperEnclave)通过了北京国家金融科技认证中心认证,TEE功能(CA与TA交互、数据存储、加密解密算法等)、TEE安全(硬件安全、系统软件层安全等)47个项目…

day11-项目集成SpringSecurity-今日指数

项目集成SpringSecurity 学习目标 理解自定义认证和授权过滤器流程;理解项目集成SprignSecurity流程; 第一章 自定义认证授权过滤器 1、SpringSecurity内置认证流程 通过研究SpringSecurity内置基于form表单认证的UsernamePasswordAuthenticationFi…

消息中间件篇之RabbitMQ-高可用机制

一、怎么保证高可用性 在生产环境下,使用集群来保证高可用性,一般我们采用普通集群、镜像集群、仲裁队列。 二、普通集群 普通集群,或者叫标准集群(classic cluster),具备下列特征: 1. 会在集…

第2.5章 StarRocks表设计——行列混存表

注:本篇文章阐述的是StarRocks- 3.2.3版本的行列混存表 一、概述 1.1 背景 StarRocks 基于列存格式引擎构建,在高并发场景,用户希望从系统中获取整行数据。当表宽时,列存格式将放大随机IO和读写。自3.2.3开始,StarRo…

我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项

GKI是什么? Google为什么要推行GKI? GKI全称General Kernel Image。GKI在framework和kernel之间提供了标准接口,使得android OS能够轻松适配/维护/兼容不同的设备和linux kernel。 Google引入GKI的目的是将Framework和Kernel进一步的解耦。因…

前后端分离vue.js+nodejs学生考勤请假系统 _fbo36

此系统设计主要采用的是nodejs语言来进行开发,采用vue框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一定的安全性…

【大模型 数据增强】IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能

IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能 提出背景基于模式的指令生成解法效果 提出背景 论文:https://arxiv.org/pdf/2402.14710.pdf 代码:https://github.com/zjunlp/IEPile 假设我们有一个信息抽取任…

Sublime Text4配置C#运行环境

这里写自定义目录标题 前言部署.NET环境Sublime Text4配置C#编译环境1. 下载插件 运行测试 前言 今天把家里的9年前的远古神机搬了出来,重装了个win7的精简版,本打算装个VScode测试一下是否能写C#代码,结果是可以的,但&#xff0…

Mockito单元测试Mockito对Service层的测试案例

前言 以下是关于Mockito的API使用文档 官网:http://mockito.org/ 官网英文API文档:https://javadoc.io/static/org.mockito/mockito-core/5.10.0/help-doc.html#index 非官方中文API文档:https://gitee.com/wnboy/mockito-doc-zh#mockito-%E…

R3F(React Three Fiber)经验篇

之前一直在做ThreeJS方向,整理了两篇R3F(React Three Fiber)的文档,这是经验篇,如果您的业务场景需要使用R3F,可以参考一下这个文档。下面是目录,按照需求自取。 基础篇 ⬇️ R3F(…

SPI总线结构和原理

一、概述 SPI(Serial Peripheral Interface)是一种同步串行通信接口标准,被广泛应用于各种微控制器和外设之间的通信。SPI总线结构简单、易于扩展,并且支持多主设备同时操作。 二、信号线 SCK(Serial Clock&#xf…

SpringIOC之support模块StaticMessageSource

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

zemax冉斯登目镜

两个焦距相等的平凸透镜组成,两个凸面相对,两者间距等于焦距的2/3 球差、轴向色差、畸变都小于惠更斯目镜 但是垂轴色差较大 可以当作普通放大镜使用 这里没有可以控制两个平凸透镜焦距相等 入瞳直径4mm波长0.51、0.56、0.61半视场15焦距28.2mm 镜头…

Javase补充-Arrays类的常用方法汇总

文章目录 一 . 排序方法二 . 查找方法三 . 判断是否相等的方法四 . 拷贝方法五 . 填充方法 一 . 排序方法 我们第一个要介绍的就是sort方法 这个排序实现的底层逻辑应该是十分复杂的,以我们目前的水平体系应该无法理解,我们今天尝试用我们可以理解的一种排序算法,插入排序来模…

软考41-上午题-【数据库】-关系代数运算3-外连接

一、外连接 连接的拓展,处理由于连接运算而缺失的信息。 1-1、回顾自然连接 1-2、左外连接 示例: 左边的表,数值是全的 1-3、右外连接 示例: 右边的表,数值是全的 1-4、全外连接 示例: 自然连接左外连接…

Linux--shell编程中内部表和外部表之间的转换

内部表和外部表之间的转换 1、查询表的类型 desc formatted student; Table Type: MANAGED_TABLE 2、修改内部表student为外部表 alter table student set tblproperties(EXTERNALTRUE); 3、查询表的类型 desc formatted student; Table Type: EXT…

python:读 Freeplane.mm文件,使用 xml.etree 生成测试案例.csv文件

Freeplane 是一款基于 Java 开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 强大的节点功能,不仅仅节点的种类很多&#xff0…