是时候该对你的数据库做一次全面体检啦!

chip_201612261359307

 

  • 无效索引:如果一个索引始终无法被查询使用,它的存在只能增加数据库的维护开销,开发者应该及时删除这些索引。通过MySQL 5.7 sys库schema_unused_indexes视图,可以查看当前实例哪些索引从没有被使用。

 

容量规划

数据库的运行依赖计算、存储、网络等多种资源,通过对各种资源的使用情况分析,对资源进行合理的规划配置,是数据库稳定运行的必要条件。

  • CPU: 通常使用CPU利用率衡量CPU的繁忙程度,通过top命令,开发者可以查看CPU利用率实时变化。CPU 利用率持续超过80%,预示计算资源已经接近饱和,如果开发者已经做过SQL优化,则需要使用更高配置的CPU。通过查看7天内CPU利用率超过80%的时间占整体时间的百分比,以及单次持续时间超过一定阈值,则可视为CPU扩容的触发条件。
  • IO:大部分数据库应用都是的IO Bound类型,IO 处理能力直接决定了数据库的性能。IO 利用率统计了一秒内IO请求队列非空的时间比例,IO利用率越高就表示硬盘越繁忙。但是IO 利用率100%并不表示系统已经无法处理更多的IO请求。IOPS和每秒IO字节数可以从存储设备的层次更准确的描述IO负载。每一个存储设备都有IOPS和每秒IO字节数的上限,任意一个达到上限,就会成为IO处理能力的瓶颈,在传统机械硬盘中,随机IO主要受到IOPS的限制,顺序IO主要受带宽限制。除此之外,我们还可以从应用的角度,使用一次IO请求的响应时间来描述IO负载,一次IO请求的响应时间包括其在队列中的等待时间和实际IO处理时间之和。通过iostats开发者可以很方便的收集这些数据。如果这些指标在一段时间内持续接近设定上限,则可以认为IO 过载,通过扩大内存,让更多的读写请求命中缓存可以缓解硬盘IO。另外,使用更高配置的存储设备,例如固态硬盘,也可以大幅提高系统的IO处理能力。
  • 存储空间:存储空间不足会导致严重的系统故障,数据库可能会宕机,更为严重的是数据库进程存活,但是无法响应服务,从而造成基于进程的宕机监控失效。根据7天内数据库中存储数据的变化,我们可以按照一定的拟合算法,估算出未来3天内数据的增长情况,来判断实例是否存在存储空间不足的风险。
  • 内存:使用InnoDB存储引擎的MySQL数据库在实例启动时,就会预分配一块固定大小的内存空间,所有读写请求都会在该空间中完成,如果内存中缓存了用户读写的数据,则直接读取内存,如果内存中没有用户读写的数据,则需要将数据先从硬盘中load进内存中,由于内存的读写速度远远快于硬盘,这就使得读写请求是否命中内存决定了读写请求的处理速度。内存空间越大,缓存数据越多,命中的几率也就越大。所以我们可以使用缓存命中率来衡量内存空间大小是否满足应用的需求。在MySQL中,show engine innodb status 命令的Buffer pool hit rate可以度量近一段时间范围内Buffer pool的命中情况。

image

  • 网络:网络带宽在数据库返回记录较多的情况下,也可能会成为系统的瓶颈。一般我们使用每秒网络流入和流出字节数来衡量网络流量是否达到带宽限制。在云环境下,每台虚拟机或者容器都是有一定的网络带宽配额,私有网络的配额相对比较大,公网配额与用户付费相关;使用iftop 可以查看当前系统的网络流量;

 

服务安全

  • 弱密码:MySQL的登陆认证使用的是IP和账户密码的方式,很多开发者为了方便记忆,习惯将数据库密码设置为弱密码,这实际是非常危险的。数据库中的数据很多涉及敏感业务,弱密码非常容易被破解,对数据库中的数据是一个严重安全隐患。MySQL系统库mysql库下的user表的password字段保存了所有用户的密码,MySQL使用的是两次sha-1的不可逆加密算法,所以我们无法通过password字段获取用户的密码内容,但是我们可以通过将常见弱密码制成彩虹表,模拟MySQL的加密算法,匹配password字段,即可发现数据库中的弱密码账号。
  • 网络安全