磁盘阵列 mysql_MYSQL实战优化——RAID存储架构、案例分享

本文介绍了RAID存储架构的基础知识,强调其在数据库性能提升中的作用,特别是通过RAID卡的缓存机制提升写入性能。同时,文章探讨了RAID卡锂电池的充放电过程及其对数据库性能的影响。此外,还分享了一个关于数据库无法连接的故障案例,深入分析了"Too many connections"错误的原因,并提供了相应的解决方案。
摘要由CSDN通过智能技术生成

RAID存储架构初步介绍

MySQL运行过程中,它需要使用CPU、内存、磁盘和网卡这些硬件,但是不能直接使用,都是通过调用操作系统提供的接口,依托于操作系统来使用和运行的,然后linux操作系统负责操作底层的硬件。所以之前我们简单介绍了linux操作系统层面的存储系统的原理,接着我们来聊聊存储硬件。

一般来说,很多数据库部署在机器上的时候,存储都是搭建的RAID存储架构。简单来说,RAID就是一个磁盘冗余阵列,什么意思呢?

假设我们的服务器里的磁盘就一块,那万一一块磁盘的容量不够怎么办?此时是不是就可以再搞几块磁盘出来放在服务器里,现在多了几块磁盘,机器里有很多块磁盘不好管理了,怎么在多块磁盘上存放数据呢?所以就是针对这个问题,引入RAID这个技术,大致理解为用来管理机器里的多块磁盘的一种磁盘阵列技术。有了它以后,你再往磁盘里读写数据的时候,它会告诉你应该在哪块磁盘上读写数据。

除此之外,RAID技术很重要的一个作用,就是还可以实现数据冗余机制。假设你现在写入了一批数据在RAID中的一块磁盘上,然后这块磁盘现在坏了,无法读取了,那数据岂不是就丢失了?所以有的RAID磁盘冗余阵列技术里,可以把你写入的同样一份数据,在两块磁盘上都写入,这样可以让两块磁盘上的数据一样,作为冗余备份。当一块磁盘坏掉的时候,可以从另外一块磁盘读取冗余数据出来。所以RAID技术实际上就是管理多块磁盘的一种磁盘阵列技术,他有软件层面的东西,也有硬件层面的东西,比如有RAID卡这种硬件设备。

服务器使用多块磁盘组成RAID阵列的时候,一般会有一个RAID卡,这个RAID卡是带有一个缓存的,这个缓存不是直接用我们的服务器的主内存的那种模式,它是一种跟内存类似的SDRAM,当然,可以大致认为它也是基于内存来存储的吧。

然后我们可以把RAID的缓存模式设置为write back,这样的话,所有写入到磁盘阵列的数据先会缓存在RAID卡的缓存里,后续慢慢再写入到磁盘阵列里去,这种写缓冲机制,可以大幅度提升我们的数据库磁盘写的性能,我们看下图:

0025bd56fdd5

raid1.jpg

现在有一个问题,假设突然断电了,或者服务器故障关闭了,那么是不是这个RAID卡的缓存里的数据会突然丢失?那MySQL写入磁盘的数据不就没有了吗?

RAID存储架构的电池充放电原理

上面我们提出了一个问题,它的解决方案是什么呢?那就是RAID卡一般都配置有自己独立的锂电池或者是电容,如果服务器突然断电了,无法接通电源了,RAID卡自己是基于锂电池来供电运行的,然后它会赶紧把缓存里的数据写入到阵列中的磁盘上去。

但是锂电池是存在性能衰减问题的,所以一般来说锂电池都是要配置定时充放电的。这可以延长锂电池的寿命和校准电池容量。确保服务器断电之后,保证有足够的电量,把缓存里的数据一次性写回磁盘上去。

所以在锂电池充放电的过程中,RAID的缓存级别会从write back变长write through,我们通过RAID写数据的时候,IO就直接写磁盘了,如果写内存的话,性能也就是0.1ms这个级别,但是直接写磁盘,性能可能会退化10倍左右。所以一旦遇到RAID锂电池自动充放电,往往会导致数据库服务器的RAID存储定期的出现性能抖动

案例分享

1、数据库无法连接故障定位,Too many connections

我们来看一个大家会经常遇到的一个数据库故障,就是数据库无法连接的问题。大家会看到异常信息往往是“ERROR 1040(HY000): Too many connections”,这个问题就是说数据库连接池里有太多的连接了,不能再建立新的连接了。

我们之前讲过数据库的整体架构原理,数据库自己有一个连接池,每个系统部署在一台机器上的时候,那台机器上部署 的系统实例/服务实例自己也有一个连接池,你的系统每个连接Socket都会对应着数据库连接池里的一个连接Socket,这就是TCP网络连接,如下图所示:

0025bd56fdd5

sql4.jpg

所以当数据库告诉你Too many connections的时候,就是说它的连接池已经满了,你的业务系统不能跟它建立更多连接了。我们看一个案例,java系统部署在2台机器上,java系统设置的连接池的最大大小是200,两台服务器最多建立400个连接。这个时候MySQL报异常说Too many connections,说明目前MySQL无法建立400个网络连接。于是检查了一下MySQL的配置文件my.cnf,里面有一个关键的参数是max_connections,就是MySQL能建立的最大连接数,设置的是800 。那为什么建立400个连接都不行呢?这个时候我们可以用命令行或者一些管理工具登录到MySQL去,执行下面的命令看一下:

show variables like 'max_connections'

此时可以看到,当前MySQL仅仅只是建立了214个连接而已,我们设置的max_connections参数根本没起作用,这是为什么呢?简单来说,就是因为底层的linux操作系统把进程可以打开的文件句柄数限制为了1024了,导致MySQL最大连接数是214 。那怎么解决这个问题?我们执行下面这个命令就可以了:

ulimit -HSn 65535

然后可以用如下命令检查最大文件句柄数是否被修改了:

cat /etc/security/limits.conf

cat /etc/rc.local

如果都修改好之后,可以重启服务器,然后重启MySQL,这样的话,linux的最大文件句柄就会生效,MySQL的最大连接数也会生效。

这个linux的ulimit命令是干什么用的呢?linux默认会限制每个进程对机器资源的使用,包括可以打开的文件句柄的限制,可以打开的子进程数的限制,网络缓存的限制,最大可以锁定的内存大小。因为linux操作系统设计的初衷,就是要尽量避免某个进程一下子耗尽机器上的所有资源,所以它默认都是会做限制的。

math?formula=%5Ccolor%7Bgreen%7D%7B%E6%9C%AC%E6%96%87%E7%BB%93%E6%9D%9F%7D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值