首页 > 数据库 >MariaDB 和 GreatSQL 性能差异背后的真相

MariaDB 和 GreatSQL 性能差异背后的真相

时间:2024-10-23 10:44:48浏览次数:1  
标签:binlog log 真相 GreatSQL innodb MariaDB redo

MariaDB 和 GreatSQL 性能差异背后的真相

前言

最近项目上遇到了两次 MariaDB 和 GreatSQL 的对比,GreatSQL受到客户质疑,最后经过排查抓到性能差异背后的真相。基于此做个分享。

版本

MariaDB版本:10.3.39 该版本为麒麟V10 yum安装

GreatSQL版本:GreatSQL-8-0-32-25

问题一:MariaDB和GreatSQL使用sysbench压测性能相差100倍

某天某客户反馈他们的sysbench压测结果,MariaDB 和 GreatSQL 压测性能相差100倍。

信息收集

架构:均为单机

版本如上文版本所示

配置文件:MariaDB yum安装后/etc/my.cnf 未曾更改

GreatSQL配置文件为GreatSQL用户手册中的配置文件链接如下:

https://GreatSQL.cn/docs/8.0.32-25/3-quick-start/3-4-quick-start-with-cnf.html

两者在同一台机器上轮流运行(即开启MariaDB时关闭GreatSQL,开启GreatSQL时关闭MariaDB)

ps:没收集硬件信息是因为都是运行在麒麟V10上,相同规格硬件运行,这部分已经排除影响。

思考

遇到这么夸张的性能差距,第一反应是innodb_buffer_pool,binlog开关,sync_binlog 和 innodb_flush_log_at_trx_commit这几个和性能关系较大的参数

复现测试

MariaDB 10.3.39 安装

$ yum -y install MariaDB
$ yum -y install MariaDB.server
 #启动MariaDB
$ systemctl start MariaDB
 #查看MariaDB的状态
$ systemctl status MariaDB

查看相关参数

# 登录,初始化首次登录MariaDB的密码为空
$ mysql -uroot -p -S /var/lib/mysql/mysql.sock

#查看binlog
MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.003 sec)

# 查看sync_binlog 
MariaDB [(none)]> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.002 sec)

# 查看innodb_flush_log_at_trx_commit
MariaDB [(none)]> show variables like '%trx_commit%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.001 sec)

查到这里其实问题已经明朗。GreatSQL用户手册中配置为binlog开启,sync_binlog 和 innodb_flush_log_at_trx_commit均设置为1。

GreatSQL 安装

参考用户手册进行安装

https://GreatSQL.cn/docs/8.0.32-25/3-quick-start/3-2-quick-start-with-tarball.html

sysbench测试相关说明

针对这个情况使用sysbench在相同情况下做了对比测试:

innodb_buffer_pool大小设置一致,测试组分别为:

MariaDB 和 GreatSQL 均关闭binlog,sync_binlog 设置为0;

MariaDB 和 GreatSQL 均开启binlog,sync_binlog 设置为1。

MariaDB开启binlog,并设置sync_binlog=1(反向操作注释掉相应内容即可)

配置文件加入

[mysqld]
log_bin=on
binlog_format=ROW
sync_binlog=1 
GreatSQL关闭binlog,并设置为sync_binlog=0

在配置文件中加入,并注释掉相关binlog参数

[mysqld]
skip-log-bin
sync_binlog=0

测试结果

由于文章篇幅原因这里附上测试结果,sysbench安装测试请参考:

https://greatsql.cn/docs/8.0.32-26/10-optimze/3-1-benchmark-sysbench.html

10张表每张表1千万数据,8线程,测试结果均取第四次的结果。测试命令样例:

$ sysbench  ./oltp_read_only.lua --mysql-db=database --mysql-host=ip --mysql-port=port --mysql-user=root --mysql-password=password --tables=10 --table_size=1000000 --report-interval=2 --threads=8 --db-driver=mysql --skip-trx=off --db-ps-mode=disable --create-secondary=off --time=60 --simple-ranges=0 --sum-ranges=0 --order-ranges=0 --distinct-ranges=0 --mysql-ignore-errors=9001,9002,9000,1062 run

MariaDB和GreatSQL均关闭binlog,sync_binlog 设置为0

file

file

MariaDB和GreatSQL均开启binlog,sync_binlog 设置为1

file

file

ps:在MariaDB和GreatSQL均开启binlog,sync_binlog 设置为1的测试场景下,只读还存在少量的性能差异。因为测试机器为虚拟机性能有限,磁盘I/O等并不稳定,无法排除硬件的影响,有兴趣的朋友可以自行测试得到更为精确的性能报告

问题一小结

实际生产环境出于对数据安全的考虑,建议开启binlog,sync_binlog设置为1。

开启binlog和sync_binlog=1的情况下,MariaDB和GreatSQL大多数场景下性能相当,只有在只读场景下MariaDB 略优于GreatSQL

关闭binlog和sync_binlog=0的情况下,在update_index和delete场景下GreatSQL略优于MariaDB,而只读场景下MariaDB略优于GreatSQL,其余场景下二者性能相当

问题二:GreatSQL插入大事务hang住,MariaDB不会

某天某客户反馈GreatSQL插入大事务会hang住,而MariaDB不会。在论坛帖子求助也无果

原贴链接https://GreatSQL.cn/forum.php?mod=viewthread&tid=827&extra=&highlight=MariaDB&page=2

信息收集:

可看原贴

show processlsit显示

update的线程State整齐卡在waiting for handler commit

hang住的时候,错误日志打印Warning信息:

[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.

问题定位及分析:

1.其配置文件中

"innodb_io_capacity"设置为200过小,可以调整为2000或根据物理I/O适当调整。写负载越高的系统建议设置更高值,但不建议使用高于20000的值。

"innodb_redo_log_capacity"设置为100M过小,可调整到1G~8G之间,在写负载高场景中,可以调整的更大。

2.GreatSQL中的宽表插入大量二进制数据(疑似图片或文件附件二进制内容),易造成更多的page页分裂,造成redo膨胀,redo的写入加剧,消耗更多innodb的I/O,redo的总容量过小,InnoDB在受到重做日志容量压力的情况下被迫把脏页刷新到磁盘,同样需要更多innodb的I/O,innodb的I/O瓶颈导致正常提交的事务hang住。

参数详解:

innodb_io_capacity:

控制innodb可用的总I/O容量

The innodb_io_capacity variable defines the overall I/O capacity available to InnoDB. It should be set to approximately the number of I/O operations that the system can perform per second (IOPS). When innodb_io_capacity is set, InnoDB estimates the I/O bandwidth available for background tasks based on the set value.

You can set innodb_io_capacity to a value of 100 or greater. The default value is 200.

译文

innodb_io_cacapacity变量定义了innodb可用的总I/O容量。它应该设置为大约系统每秒可以执行的I/O操作数(IOPS)。当设置innodb_io_capacity时,innodb会根据设置值估计后台任务可用的I/O带宽。

您可以将innodb_io_capacity设置为100或更大的值。默认值为200。

innodb_redo_log_capacity:

redo日志文件的总容量。

The Innodb_redo_log_capacity_resized server status variable indicates the total redo log capacity for all redo log files.

If innodb_redo_log_capacity is not defined, and if innodb_log_file_size and/or innodb_log_files_in_group is defined, then the InnoDB redo log capacity is calculated as (innodb_log_files_in_group * innodb_log_file_size). This calculation does not modify the unused innodb_redo_log_capacity setting's value.

译文

Innodb_redo_log_capacity_resized服务器状态变量表示所有重做日志文件的总重做日志容量。

如果未定义innodb_redo_log_capacity,并且定义了innodb_log_file_size和/或innodb_log.files_in_group,则innodb重做日志容量计算为(innodb_log-files_in_group*innodb_log_file_size)。此计算不会修改未使用的innodb_redo_log_capacity设置的值。

验证

客户把对应的参数调大,hang住的情况消失,业务能正常使用,达到预期。

问题二小结

该次问题貌似是简单的参数调整,其实其中关联到了以下内容,有兴趣的可以去了解

1.开发规范,是否允许往库宽表插入大量二进制数据,查询怎么办?

2.了解redo是什么,innodb master线程有什么作用(脏页回收线程也合并到master中了)

3.innodb的IO由哪些参数控制,调整为多大是合理值?

4.redo的容量规格由哪些参数控制,调整为多大是合理值?

全文总结

无论是问题一中的100倍性能背后还是插入hang住,其实背后都是对产品的不了解,MariaDB 10.3.39其实对应的是5.7的产品,而且其本身的默认参数调整有作弊嫌疑,默认关闭binlog ,sync_binlog设置为0,checkpoint阈值降低,提高checkpoint的频率等设置,面向测试环境数据是很好看的,但是增加了生产环境的风险和硬件成本。

应知其然,知其不然。

诸君共勉


Enjoy GreatSQL

标签:binlog,log,真相,GreatSQL,innodb,MariaDB,redo
From: https://www.cnblogs.com/greatsql/p/18495882

相关文章

  • MariaDB 矢量版-专为人工智能设计
       作为一名在关系型数据库系统领域拥有二十多年经验的解决方案架构师,我最近开始探索MariaDB的新矢量版,看看它能否解决我们面临的一些人工智能数据挑战。快速浏览一下似乎很有说服力,尤其是它如何将人工智能的魔力直接带入常规数据库设置中。不过,想通过一个简单的用例对它进......
  • GreatSQL 在 SQL 中使用 HINT 语法修改会话变量的实践
    全文目录:开篇语......
  • ChatGPT的超人类能力:看穿人心,OpenAI报告揭露真相!
    我们都知道,OpenAI最近越来越喜欢发博客了。这不,今天他们又更新了一篇,标题是「评估ChatGPT中的公平性」,但实际内容却谈的是用户的身份会影响ChatGPT给出的响应。也就是说,OpenAI家的AI也会对人类产生刻板印象!当然,OpenAI也指出,这种刻板印象(包括对性别或种族的刻板......
  • 某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅
    某市驾驶培训监管服务平台GreatSQL数据库适配之旅一、项目背景某市驾培系统主要为社会公众提供驾培单位查询和学车报名,为相关合作单位提供某市驾培监管、某市驾培考核等功能。业务信息教练车培训过程视频信息、包括培训机构基本信息、教练员基本信息和学员个人等信息,其服务范......
  • 误删GreatSQL数据?别慌,Binlog来帮忙
    误删GreatSQL数据?别慌,Binlog来帮忙数据丢失是每一个数据库管理员和开发者都不愿面对的噩梦。然而,意外总是难免,当不小心删除了重要的数据,如何才能迅速而有效地进行恢复呢?在数据库中有二进制日志(Binlog),它不仅记录了所有更改数据的事件,还可以帮助将数据库恢复到任何一个特定的时......
  • 独家揭秘,股民必看!历史性一刻:A股开盘涨停后回落,揭秘真相
    在一个阳光明媚的早晨,小张坐在电脑前,眼睛紧盯着屏幕。他是一名资深的股市投资者,今天,他要见证一个历史性的时刻。港股在国庆假期期间连续大涨,这让小张感到既兴奋又紧张,他知道,A股市场即将迎来一场风暴。小张像往常一样打开交易软件,却发现上证指数以涨停价开盘,涨幅达到了惊人的1......
  • 通过MySQL Workbench 将 SQL Server 迁移到GreatSQL
    通过MySQLWorkbench将SQLServer迁移到GreatSQL一、概述MySQLWorkbench提供了可以将MicrosoftSQLServer的表结构和数据迁移到GreatSQL的功能,此次将通过MySQLWorkbench将SQLServer的数据迁移到GreatSQL。本文章只是简单演示一下单张表的迁移,如果在项目中使用请根据......
  • Ubuntu 安装Mariadb并设置navicate远程连接
    一.安装和修改数据表先安装mariadb 这里安装mariadb-server-10.6相当于mysql5.6sudoaptupdatesudoaptinstallmariadb-server-10.6相当于mysql5.6安装完毕进入设置密码sudomysql_secure_installation1.进入mariadbmysql-uroot-p2.修改表MariaDB[mysql]>......
  • 数字人直播屡次违规真相曝光!有哪些技术可以有效解决?
    随着数字人直播的应用频率不断升高,其所蕴含着的市场需求和收益潜力日渐显现,让其用户规模得以持续扩大的同时,也让不少创业者都有了找数字人源码厂商搭建数字人直播系统的计划。在此背景下,与数字人直播违规吗相关的各类话题和答案的真实性也开始受到越来越多的关注。毕竟,无论是......
  • SSM后端框架搭建(有图有真相)
    搭建环境修改pom.xml配置文件引入依赖<!--mysql--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.32</version></dependency><!--德鲁伊--......