ITPub博客

首页 > 数据库 > 数据库开发技术 > 一文看懂MySQL开源审计的性能差异 | 附Python作图

一文看懂MySQL开源审计的性能差异 | 附Python作图

原创 数据库开发技术 作者:小安 时间:2021-10-26 21:06:50 0 删除 编辑


上文,笔者使用一个简单的测试案例验证审计插件的功能:一文搞懂MySQL开源审计功能

那么,这些审计插件的性能方面又怎么样呢?
(人一思考,上帝就发笑!)


一. 为什么要做性能测试?

1. 从测试的角度看,软件支持的特性和功能并不是唯一的问题,而性能测试的目标不仅仅是发现错误,还有消除性能的瓶颈。

2. 从个人学习的角度看,笔者想通过性能测试更全面地了解一个关键参数的调整、一款软件的选择是否真的能够提升性能。只有测试时考虑全面,上生产时才能更有信心,而不是道听途说,人云亦云。自己动手实践,对知识的理解更加深刻。

二. 等保测评的要求

1) 开启审计,审计事件类型全面。

2) 不影响数据库性能。

3) 审计日志至少保存6个月以上。


三. 环境配置和测试指标
  1. 硬件配置

  2. DB参数配置

  3. 测试要求

  4. 测试指标

  5. 其他

1. 硬件配置
由于测试的硬件环境比较低配,故增加了阿里云RDS的硬件配置作为参考。

阿里云RDS 部分售卖配置参考。


2. 参数配置

阿里云RDS有几个参数模板,RDS 数据库将使用高可用_高性能模板。

  • innodb_flush_log_at_trx_commit 等于1,表示每次事务的 redo log 都直接持久化到磁盘,保证 MySQL 异常重启之后数据不丢失;
  • innodb_flush_log_at_trx_commit 等于2,则表示事务在提交时需要将Redo日志写到OS的缓存区中,但并不需要保证将日志真正刷到磁盘。这种情况下,即使数据库挂了,而操作系统没挂,事务的持久性还是可以保证的。
  • sync_binlog 等于1,表示每次事务的 binlog 都持久化到磁盘,这样可以保证 MySQL 异常重启之后 binlog 不丢失。
  • sync_binlog 等于N,每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令将binlog_cache中的数据强制写入磁盘。

由于测试环境的硬件配置比较糟心,所以在参数配置上尽可能往高性能方向靠拢。测试环境不配置主从复制。

3. 测试要求
测试需求 :200并发线程,10张200W的表,总共压测300s。
笔者觉得200的并发量不够过瘾,后续会针对各类云数据库进行高并发测试,看看哪家强。

sysbench一般用于基准测试,但合理使用工具,将插件作为变量,通过压测,也是可以了解哪款产品的功能和性能最佳。
根据测试要求,编写sysbench压测脚本。
sysbench 三板斧
准备数据
sysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200  --time=300 --report-interval=5 prepare

开始压测
sysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200  --time=300 --report-interval=5  \
run >> sysbench_`date +%Y%m%d_%H%M%S`.log

还原环境
sysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200  --time=300 --report-interval=5 cleanup


4. 测试指标

本次测试将以"A"作为基线,各个检测项如无特殊说明将使用平均值记录。这种方法不是很专业,但对于小型测试应该没什么问题。


4.1 Cpu使用率
结合 sar、vmstat、top 观察,测试数据以sar为准,取平均值。

4.2 QPS
每秒查询率,取平均值。

4.3 TPS
每秒处理事务数,取平均值。

4.4 审计文件大小
每次测试前清空审计文件,压测完毕后,观察每次压测生成的审计文件大小。

4.5 性能差异
公式 :(((B~E)-A)/A)*100%
举例:C 的平均QPS为20000,A的平均QPS为23000。
根据公式计算 :
((20000-23000)/23000)*100%=13%
说明使用 C 后,性能下降13%

5. 其他
1. 以上Cpu使用率、QPS、TPS每项指标各60组数据。
2. 测试环境是虚拟机,PC应退出一切与测试无关的程序。比如,浏览器。
3. 测试过程中,如果出现CPU使用率波动,通过"show engine innodb status\G"查看锁信息,确保测试数据尽可能不受锁的影响。

性能测试的演示顺序

1. MySQL-Null

2. init-connect + binlog

3. general.log

4. McAfee 插件

5. MariaDB 插件

6. 阿里云 RDS-Null

7. 作图 : Python + Highcharts


Part 01

MySQL-Null


第一次压测,数据还没热身,QPS上不来。所以,以第二次压测的数据为准。

1.1 QPS对比

1.2 QPS_TPS_CPU使用率

测试环境在没审计的情况,QPS在2w3左右,TPS在1150左右,Cpu使用率在75%左右,这其实也是测试环境的性能瓶颈。

如果再增加并发量,就真的吃不消了。


Part 02

init-connect + binlog


这项测试的意义不大,因为有多少个线程,就有多少行数据写入审计表,而审计日志是来源于binlog。具体配置参考:一文搞懂MySQL开源审计功能

Part 03

general.log


3.1 MySQL开启general.log
root@localhost:mysql.sock [(none)]>set global general_log_file = '/mysql/log/3308/general/general_3308.log';
root@localhost:mysql.sock [(none)]>set global general_log=ON;
root@localhost:mysql.sock [(none)]>show variables like 'general%';
+------------------+------------------------------------------+
| Variable_name    | Value                                    |
+------------------+------------------------------------------+
| general_log      | ON                                       |
| general_log_file | /mysql/log/3308/general/general_3308.log |
+------------------+------------------------------------------+

3.2 general日志

日志信息如图,可读性还是挺不错的,关联 init-connect 审计表 的conn_id字段可以获取会话的登陆信息。但还不如直接使用init-connect的方式。


3.3 QPS_TPS_CPU使用率

开启general.log 后,不仅Cpu使用率下降了,而且支持的事务量也下降了。根据TPS计算,DB性能下降了30%左右,这样谁还敢开启general.log用于审计。


此外,在数据库没有审计的情况下,有些等保测评机构要求开启general.log,这看似为了安全,实际上是一种"饮鸩止渴"的做法。


Part 04

McAfee 插件


使用McAfee总共测了6次,因为前4次CPU使用率在后期均有大幅度下降,通过show engine innodb status\G发现有锁;还有PC的浏览器没关,占用了一些C资源。清理无关要紧的程序后,重测2次的CPU都比较稳定,数据相对可靠。

4.1 TPS对比
TPS由原来的1150左右下降至980左右。

4.2 QPS_TPS_CPU使用率

QPS、TPS、CPU使用率均有一定的下降幅度,但是在可接受的范围内。


Part 05

MariaDB 插件


5.1 TPS对比
TPS由原来的1150左右下降至1080左右,跟MySQL无审计的情况下相差不大。

5.2 QPS_TPS_CPU使用率

QPS、TPS、CPU使用率只有小幅度下降。结合比较全面的审计功能,不得不说MariaDB审计插件真是一款良心插件呀


Part 06

阿里云RDS-Null


6.1 性能指标

由于无法登陆RDS的操作系统,只能通过性能趋势观察CPU使用率,从图中可以看出,RDS压测期间Cpu使用率基本上在50%内,所以用Python作图时,Cpu使用率的数据统一定为50%


6.2 QPS_TPS_CPU使用率

在不使用开源插件的情况下,阿里云RDS的QPS和TPS是测试环境的3倍。


有几点需要注意的是:
1. 阿里云RDS的内存配置比测试环境多了40G,毕竟规格就在那里,爱买不买。
2. 云数据库自身有很多监控进程,这些也会占用一点资源。
3. 阿里云RDS的buffer pool、general.log等参数无法通过自建账号进行修改,本来想通过开启general.log观察性能差异,有点遗憾,无法完成该项测试。不过,从这点说明了云数据库的性能之所以高,其实在使用规范和标准化上采取了严格的措施。
[文档不具备执行力,写进代码里才具备执行力]

Part 07

作图 : Python + Highcharts


本文作图是通过Python调用Highcharts进行作图。

7.1 Highcharts介绍

Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单地在在 Web 网站或是 Web 应用程序添加有交互性的图表。

Highcharts支持直线图、曲线图、区域图、柱状图、饼状图等多达 20 种图表,其中很多图表可以集成在同一个图形中形成混合图。


链接

https://www.highcharts.com.cn/demo/highcharts/

7.2 数据动态图Demo展示

个人比较喜欢漂亮的图表,所以,特意研究了下Highcharts如何使用。




7.3 如何将Python结合Highcharts进行制图呢?
1. 结合Highcharts官网样例的JS代码,将JS代码复制到Python中修改,联网即可调用。
2. Highcharts制作的图主要用于web界面,如果下载Highcharts的图片,跟其他的包作图没太大区别。
3. series存放数据,数据使用数组类型。options主要是绘制图形的框架,比如,xy轴,标题,起点数值等等。

总结

接下来,我们一起来看看以上审计方式的测试结果(以"A"为基线),性能差异计算以TPS为准,计算公式参考[4.5 性能差异]。

开启general.log的方式应该是审计里性能最差的一种方式了。
我们看到有些插件的Cpu使用率比较高,但同时也需要观察QPS和TPS是否与基线"A"接近,还有产生的审计日志大小,结合这几种情况,笔者更加偏向于MariaDB的审计插件。

1. 对于社区版MySQL的 审计而言,如果没有旁路软件,那么就使用MariaDB的审计插件(上线后,需要对以上检测项观察一段时间)。但这种方式仅仅只是用于审计,相对于产品服务来说,缺少分析功能。

2. 旁路方式,以阿里云RDS为例,数据库审计服务通过旁路监听模式,支持完全独立于数据库的部署。在不影响数据库日常运行效能的前提下,实现灵活的审计与监控。举例:

    1) 具备风险状况、运行状况、性能状况、语句分布的实时监控能力。

    2) 分析、追查数据库安全事件等等。

3. 如需要本文作图的源码[Python+Highcharts],请在公众号回复:作图


以上内容仅代表个人观点,测试难免会有考虑不周,如有侵权或者不妥之处,请联系,谢谢!

下次有机会分享业界内各云数据库的性能差异,虽然需要精力和花钱,但是我们的征途是数据库的星辰大海,所以,前进吧!!!


参考资料
一航软件测评中心 | 为什么要做软件性能测试?
阿里云帮助中心 | 什么是数据库审计
书籍 | MySQL是怎样运行的
其他 | 见本文链接 



 · Python系列 | 推荐 ·



如何使用Python对MySQL的误操作快速恢复数据?
Python入门必备第4课:字符串、序列
Python入门必备第3课:列表元组,看这一篇够了
Python入门必备第2课:分支与循环,助你无限可能
Python入门必备第1课:基础知识,3分钟搞懂



 · 自动化运维系列 | 推荐 ·


自动化运维实战五  | 【演示】3分钟一键部署Mysql数据库
自动化运维实战四  | 【实现】Mysql一键部署的前后端交互
自动化运维实战三  | 【规划】Mysql一键部署的数据模型
自动化运维实战二  | 【构思】Mysql一键部署的界面
自动化运维实战一  | 【模板】 套用精美模板演示登陆界面


喜欢就点个  在看  呀!

原文作者:Python自动化运维;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-10-07

  • 博文量
    47
  • 访问量
    17924