美文网首页
MYSQL实战优化——RAID存储架构、案例分享

MYSQL实战优化——RAID存储架构、案例分享

作者: 为爱放弃一切 | 来源:发表于2020-09-10 17:32 被阅读0次

    RAID存储架构初步介绍

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

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

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

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

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

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


    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网络连接,如下图所示:


    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操作系统设计的初衷,就是要尽量避免某个进程一下子耗尽机器上的所有资源,所以它默认都是会做限制的。

    \color{green}{本文结束}

    相关文章

      网友评论

          本文标题:MYSQL实战优化——RAID存储架构、案例分享

          本文链接:https://www.haomeiwen.com/subject/dfddektx.html