MySQL系统架构

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 最近在准备给新人培训,对于DBA相关的新人,最推荐的莫过于学习官方文档,像Oracle的concept,MySQL的reference等,MySQL被Oracle收购以后,文档也越来越完整和形象,对于刚学习的新人,学习官方文档有助于跟为系统得学习。

最近在准备给新人培训,对于DBA相关的新人,最推荐的莫过于学习官方文档,像Oracle的concept,MySQL的reference等,MySQL被Oracle收购以后,文档也越来越完整和形象,对于刚学习的新人,学习官方文档有助于跟为系统得学习。

本篇主要讲MySQL8.0InnoDB的架构。

跟其他关系型数据库一样,MySQL的架构也分为In-Memory 和On-Disk两部分。
_
在内存结构中,主要由4大块组成。

Buffer Pool(以下简称bp)

bp在整个内存中占绝大多数,MySQL官方一般建议设置为服务器物理内存的80%。这边建议MySQL整体内存控制在80%左右,bp最好不要超过70%,不然容易OOM。
理解了bp的原理,对于数据库也有差不多理解了一半了。bp主要结构是个list,用的是LRU算法的变种(least recently used)。
主要用来缓存数据块(page,也叫页),mysql默认为16k,oracle为8k。如果内存达到了阈值,那么就会把最近最少使用到的page驱逐(evicted)出内存。然后把新页插入到中间位置,一般为整条list的热端5/8处。
查看下图可以看到,整个bp分为两个sublist,上端为热端,缓存热点数据(频繁被访问);另外一端为冷端,随时被驱逐出内存。
也正是因为磁盘访问数据不如内存,才有了bp的存在,大家也可以想象一下,如果磁盘数据比内存快,还有bp存在的价值吗?
所有用户访问的数据,都要先经过bp,但如果走全表扫描,按道理也有把数据缓存在bp中,那么势必会把大量数据驱逐出去,当然我们也可以通过调整参数来优化,这个我们在这篇知识普及文档中暂不提及。
可以通过设置 innodb_buffer_pool_size来调整bp的大小,可以在实例启动前在my.cnf中配置,也可以在实例运行中动态设置。
并且可以通过设置innodb_buffer_pool_instances的数量来调整bp池的数量,有利于减少LRU mutex的争议和扫描量,最近刚好有碰到这个bug:
https://bugs.mysql.com/bug.php?id=98869。如果是运行中动态设置bp,还可以通过监控 Innodb_buffer_pool_resize_status参数来查看resize的状态(也同样会写到error log中);如果是增大bp,则会增加chunks数量和page,覆盖hash table和list,并且指针指向内存中新的地址,增加新页到free list;如果是减少bp,则释放和重组bp,在chunks中移除page,覆盖hash table和list,并且指针指向内存中新的地址。
可以通过运行: SHOW ENGINE INNODB STATUS,在BUFFER POOL AND MEMORY部分看到bp相关统计数据。
_F1BBC2DF_5A3A_496C_83C9_6B559615802C__20200609221418
附:https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html

Change Buffer(以下简称cb)

cp是mysql内存结构中比较特殊的一个,它是用来缓存不在bp中的二级索引(secondary index,相对于cluster index来说)变化的page,是DML的结果,并定期合并、读到bp中。二级索引可以值是不唯一的,cp也是占用bp的内存,在shutdown 实例以后,会成为系统表空间的一部分。cp存在的意义是为了在执行DML的时候,异步二级索引的写入,到达尽可能的顺序写,提高IO效率,对I/O-bound型有一定优化作用。可以通过设置 innodb_change_buffering来控制什么类型的DML能够在cp中。通过innodb_change_buffer_max_size来设置在bp中占用的百分比。可以通过show engine innodb status中的INSERT BUFFER AND ADAPTIVE HASH INDEX 来监控cp相关数据统计。
_1C4A4CBC_9900_4C19_A778_AA2FDAEF5487__20200611204851

Adaptive Hash Index

mysql本身不支持哈希索引,但内部有使用到自适哈希索引,维护hash表。可以通过 innodb_adaptive_hash_index 来启用,也可以动态修改。
hash index通过B-TREE索引键前缀创建,基于需求和最经常访问的搜索pattern。mysql基于自己的算法来自行创建哈希索引,并且hash table是分区的,通过控制innodb_adaptive_hash_index_parts来设置分区数量,在特定情况下可以启动加速查询的效果,对like和%不友好。

Redo Log Buffer

redo log buffer也是基本所有关系型数据库都有的,redo log也叫 WAL,用来缓存数据变化,在脏数据flush到数据文件前,需要先写入到redo log buffer,再写入到redo log中,一个目的是用来保证数据一致性,保证数据库crash以后能够通过redo log进行恢复。第二个主要用来降低IO,如果每次数据库的DML都直接写入到数据文件中,则会大大影响性能。可以通过innodb_log_buffer_size来控制内存大小,默认为16M。定期有线程对齐进行flush,确保更新都刷入到redo log中,并且redo log的page size为512k,也就是一个扇区的大小,并且是顺序写,保证了性能和一致性,不至于需要double write.通过设置innodb_flush_log_at_trx_commit=1来获得ACID的保证,每次事务提交马上flush到redo log,如果对数据一致性不严格的,可以通过设置0来定期刷新,提高性能。定期刷新可以通过设置innodb_flush_log_at_timeout来控制,默认为1秒钟。

至此mysql内存相关的4个主要的组成部分已经讲完,另外还有很多小的内存区域,比如由来缓存数据字典等,以后碰到再讲,接着会介绍mysql on-disk部分的架构。
https://yq.aliyun.com/articles/764516?spm=a2c4e.11155435.0.0.71de331269m7Gf

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
8月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
986 3
Mysql高可用架构方案
|
7月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
403 1
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
9月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
11月前
|
SQL 存储 缓存
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
396 3
|
SQL 存储 缓存
【赵渝强老师】MySQL的体系架构
本文介绍了MySQL的体系架构,包括Server层的7个主要组件(Connectors、Connection Pool、Management Service & Utilities、SQL Interface、Parser、Optimizer、Query Caches & Buffers)及其作用,以及存储引擎层的支持情况,重点介绍了InnoDB存储引擎。文中还提供了相关图片和视频讲解。
448 2
【赵渝强老师】MySQL的体系架构
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。

推荐镜像

更多