当前位置:首页 > 文章列表 > 数据库 > MySQL > Mysql专栏 - Linux底层交互和Raid存储架构

Mysql专栏 - Linux底层交互和Raid存储架构

来源:SegmentFault 2023-01-10 08:13:50 0浏览 收藏

你在学习数据库相关的知识吗?本文《Mysql专栏 - Linux底层交互和Raid存储架构》,主要介绍的内容就涉及到MySQL,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

Mysql专栏 - Linux底层交互和Raid存储架构

概述

  • 介绍mysql的随机读写和顺序读写,那一部分是随机读写,那一部分是顺序读写
  • linux的系统分层逻辑结构,以及和mysql系统的交互步骤。
  • Raid的存储结构简单了解,以及他对于mysql服务的影响。
  • 补充关于too many connections问题的产生原因和解决办法。

mysql的随机读写和顺序读写

​ mysql在执行增删改查的时候,会从表空间的磁盘文件里面读取数据页,首先我们需要明白一点,虽然在表空间的磁盘文件的数据页上进行磁盘的时是随机读写,但是包括Redo logbin log 等这些日志文件其实在磁盘上是顺序读写的。

磁盘的随机读

​ 随机读取一个数据页到缓存就是磁盘的随机读操作,因为数据页的位置并不是固定的可能在磁盘的任意一位置,所以整个读写性能十分差的,根据之前的介绍,当数据页读取之后放到buffer pool里面。

​ 为了IO的性能,这里需要了解两个重要的性能指标:IOPS响应延迟。IOPS 指的是存储系统每秒可以执行多少次磁盘读写操作,底层磁盘支持每秒执行1000个随机读写和200个差距是很大的。响应延迟说的则是一次IO请求之后多少时间进行响应,也是十分大的影响的,一秒200个读写是10MS完成和一次200读写却在1S完成响应差距也是非常大的。

redo日志是顺序写

​ 虽然对于磁盘是随机读写到缓冲池,但是在缓存页更新了之后,这个数据是需要按照顺序写到redo log日志的,顺序写意味着读取的时候也可以顺序读。(关于redo log的细节将会在后续的文章介绍)磁盘顺序写的性能其实是很重要的,某种程度上来高速的顺序磁盘访问差不多可以赶上内存的读写性能,尤其是在数据库里用了os cache机制的情况下,也就是说就是redo log顺序写入磁盘之前,先是进入os cache,就是操作系统管理的内存缓存里。

关于os cache可以翻一翻之前的文章,他还有一个作用是如果innodb引擎中设置:innodb_flush_log_at_trx_commit 为 2,会在写入redo日志的时候把数据显写到os cache当中,并且在1S之后(可能)再把数据刷新回redo log的磁盘文件,但是这样在mysql宕机的时候会出现数据丢失的隐患....

另外这里在学习的时候查找了一下关于os cache以及application cache的速度消耗对比,在答案中讨论了缓存的有效性判定条件,以及什么时候才需要使用cache。感兴趣可以查看一下具体的文章内容:

https://stackoverflow.com/que...

​ 最后我们根据上面的文字总结下面的图:

根据上面的说明,我们大致可以总结出下面两点:

  • 写redo log的速度越快说明查询的sql性能就越高。
  • 磁盘每秒可以写入越多的数据,也说明越高的性能。

Linux系统分层

​ 下面我们进入正题,简单来说Linux的存储系统分为VFS层、文件系统层、Page Cache缓存层、通用Block层、IO调度层、Block设备驱 动层、Block设备层,如下图:

mysql和linux交互步骤:

​ 下面是mysql和llinux交互的大致流程:

  1. VFS层:当mysql发起一次数据页的随机读写,一次redo log顺序读写的时候,实际上会把io请求交给linux的vfs层面。
  2. 文件系统:vfs会把io请求需按照对应的文件管理系统进行操作和读写。比如ext1、ext2、ext3
  3. Page cache:文件系统会在page cache基于内存的缓存找所需的数据,基于内存缓存来执行读写,如果还没有此时会交给block层
  4. Block层:在一层把你对文件的io请求转换为block io
  5. io调度层:默认用的是CFS 公平调度算法,io调度完成之后,会决定那个io请求先执行那个后执行。

CFS调度器:采用完全公平调度算法,引入虚拟运行时间概念;

Deadline调度器:使用红黑树,把进程按照绝对截止期限进行排序,选择最小进程进行调度运行

实际情况下执行多个数据库请求的时候多个sql同时在io,所以建议生产环境把io调度算法换成 deadline调度,核心思想就是任何一个io不能随心所欲一直等待,在指定范围内他必须执行。

  1. Block设备驱动层:此时可以执行io的请求的就会交给block设备驱动层,最后把驱动交给设备层
  2. Block设备层:硬件设备完成了IO读写操作之后要不然是写要不然是读,最后就把响应经过上面的层级反向依次返回。

​ 最终 MySQL可以得到本次IO读写操作的结果,最终的结构图如下所示:

linux底层调度流程

ERROR 1040(HY000): Too many connections问题

​ 下面补充一个比较常见的linux相关问题。

​ 在专栏的第一篇介绍中我们知道数据库是存在连接池的概念,但是连接池的容量总归是有限的,出现这个报错说明连接池已经满了。

​ 默认情况下每一台机器默认的连接池大小是200,每台java系统最多建立200个连接,如果是2台机器,最多400个连接。

​ 关于这个设置的关键的参数是max_connections:比如最大连接数目是800.

实际上,在运行过程中通常会发现:

show variables like 'max_connections'
在线上的设置只有214,这是什么情况?为什么mysql会自动重置呢?其实是因为linux打开句柄的数量是1024导致只能连接214个

如何解决上面的问题

​ 在linux当中:执行命令

Ulimit -HSn 65535
可以修改句柄的配置,为了验证是否成功,可以通过下面的命令查看句柄的配置:

Cat /ect/security/limits.conf

Cat /etc/rc.load

​ 为了保险起见,也可以在

my.cnf
的内部确保了
mac_connections
参数配置。

为什么最大连接数是214呢?

​ linux默认会限制你每个进程对机器资源的使用的,包括可以打开的文件句柄的限制,可以打开的子进程数的限制,网络缓存的限制,最大可以锁定的内存大小。

​ 为了让mysql发挥最大的功效,句柄的设置值通常都是65535

 所以我们平时可以用`ulimit`命令来设置每个进程被限制使用的资源量,用ulimit -a就可以看到进程被限制使用的各种资 源的量比如 core file size 代表的进程崩溃时候的转储文件的大小限制,max locked memory就是最大锁定内存大小,open files就是最大可以打开的文件句柄数量,max user processes就是最多可以拥有的子进程数量。

​ 设置之后,我们要确保变更落地到/etc/security/limits.conf文件里,永久性的设置进程的资源限制所以执行

ulimit -HSn 65535
命令后,要用如下命令检查一下是否落地到配置文件里去了。

cat /etc/security/limits.conf
以及
cat /etc/rc.local

Raid存储架构的初步了解

​ 了解完系统分层下面我们来聊聊Raid的存储架构。

进程操作系统和服务器的关系

​ mysql说白了也是一门编程语言,所以也是依赖操作系统执行的,他需要使用cpu内存和硬盘这些硬件进行存储。

磁盘冗余阵列简单理解:

​ 磁盘冗余阵列,最简单的理解就是说使用一块硬盘管理多块硬盘的技术,在存储的层面上使用多个磁盘进行管理。那么磁盘RAID的硬盘有什么用?

RAID硬盘介绍:

  1. 数据冗余机制 - 备份:当多块磁盘中有一块硬盘挂了的时候,RAID硬盘可以对于其中一块的硬盘数据冗余到其他的磁盘。
  2. 多磁盘管理技术:RAID 0 RAID 1 …....
  3. RAID 卡缓存:类似于服务器的主内存的模式,和内存类似的SDRAM,大致认为基于内存进行存储。

对于RAID硬盘,内部通常会有一块叫做SDRAM的空间,用于保存操作系统的内存缓存,但是这一块类似内存的东西一旦断电怎么办,这样数据如果没有刷新到硬盘不就丢失?所以RAID基于锂电池供电运行把缓存的数据写入到磁盘阵列的磁盘。

​ 然而锂电池也是要休息的,也存在性能衰退,所以需要在30 - 90天之内自动进行充放电一次,这样才可以延长锂电池的寿命和校准电池容量。

​ 由于充放电的问题,通常充电放电的时候需要把数据写入磁盘而不是写入到缓存中防治数据丢失,但是也是因为这个问题定期充电放电导致的会性能大幅度的波动,在实际的体验上是定期的数据库线上波动。

​ 至于如何解决上面的问题,我们放到下文介绍,我们先来补充一下raid的关系。

Raid 0 和 raid 1是什么关系?

​ 在raid硬盘当中,有一块硬盘出现问题,此时就会在1和0之间形成一个数据冗余,一块磁盘坏了另一块上面也会有数据在上面。raid磁盘意味着每两块磁盘形成一个互为镜像的架构,一共有三组,所以会形成3组镜像的数据冗余。

raid

raid锂电池的充放电问题处理办法:

  1. 锂电池换成电容,支持透明的冲带你放电,但是电容易老化,(不常用
  2. 手动充放电,在业务的低峰时期,关闭raid自动的充电放电,脚本触发(通常解决办法)
  3. 充电放电的时候不关闭write back,不降低缓存的级别为write through。(配合第二个策略使用)

总结

​ 本节内容也是偏向理论为主,简单介绍了mysql的磁盘随机写和磁盘顺序写,并且简单介绍了linux的系统分层的逻辑结构,最后我们了解了Raid的存储架构,以及RAID的锂电池的细节。

写在最后

​ 本篇内容同样比较基础,如果有意见或者建议欢迎指导。

历史文章:

第一篇:Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程 - 掘金 (juejin.cn)

第二篇:Mysql专栏 - 线上调优与压力测试 - 掘金 (juejin.cn)

上一篇:Mysql专栏 - 缓冲池补充、数据页、表空间简述

以上就是《Mysql专栏 - Linux底层交互和Raid存储架构》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
MySQL安装使用学习教程,学mysql数据库入门的不二之选MySQL安装使用学习教程,学mysql数据库入门的不二之选
上一篇
MySQL安装使用学习教程,学mysql数据库入门的不二之选
MySQL数据库基础(三)数据的导入导出及表记录管理
下一篇
MySQL数据库基础(三)数据的导入导出及表记录管理
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    1735次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    1671次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    1606次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    1808次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    1793次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码