MariaDB 随机查询生成器的补丁

我的测试同事以及其他在 MySQL 版本上运行 RQG 测试的人可能会对 MariaDB 测试中使用的一些新增功能感兴趣。虽然它们都不是重大突破,但也许能让某些人的工作更轻松一些。

RQG 介绍

对于那些从未听说过 RQG 但仍好奇这篇博文内容的人,这里有一个快速介绍。

RQG 是 Random Query Generator(随机查询生成器)的缩写,也称为randgen— 一款开源产品,基于 GPL v2 许可发布。引用其在 Launchpad 上的主页:“一个伪随机数据和查询生成器,可用于测试任何 Perl DBI、JDBC 或 ODBC 兼容的 SQL 服务器,特别是 MySQL,但也包括 JavaDB 和 PostgreSQL”。

该框架由我的前同事 Philip Stoev 创建,他不仅开发了一个出色的工具,还成功地使其成为 MySQL 测试流程中非常重要的一部分。我认为现在所有基于 MySQL 的产品都在某种程度上使用了它;对于那些没有使用的,我强烈推荐尝试一下。

除了数据和查询生成之外,该框架还具有不同类型的“可插拔”模块,这些模块在测试执行期间或之后执行各种检查。本文主要介绍如何向现有集合中添加更多此类模块。当您在下面看到“validator”或“reporter”时,表示相应的模块类型。

RQG 文档可在 GitHub 上找到。

关于这些 MariaDB 新增功能

所有列出的新增功能都已推送到 Launchpad 上的 randgen 主分支,同时还有一些更侧重于 MariaDB 特性的内容,对大众来说可能没那么有趣。然而,等到您阅读本文时,这些版本可能已经有些过时了。由于 randgen 分支现在是自我管理的,我觉得它很容易陷入“人多手杂”的困境,所以我选择了最保守的方式来合并到主分支。每当修改影响到 MariaDB 特定组件之外的任何内容时,我都会向 randgen 邮件列表发送一封包含描述的电子邮件,如果至少有一个反对的声音,该更改就不会被合并。缺点是这使得合并过程有些麻烦,所以不会经常发生。此外,被拒绝的更改永远不会进入主分支。

最新版本以及所有新增和被拒绝的补丁都可以在我们的工作分支中找到。

Galera 模式

RQG 在 Galera 集群上运行测试非常有用,但这样做很麻烦:启动所有节点,为每个节点运行一个 RQG 实例,检查结果,最后别忘了关闭节点……可能我们大多数做过这件事的人都已经编写了一些脚本来处理部分流程,但总感觉不太对,所以我最终决定将其“原生化”。现在,Galera 集群可以由 RQG 本身启动,并且其拓扑结构可以通过命令行选项配置。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#galera-mode

这只是第一个版本,后续可能会进行修复和改进。

CheckFieldValue 校验器

如果您只需要一个简单的、不需要单独实现校验器的一次性检查,可以尝试这个。

在查询中添加特定格式的注释会触发校验。校验定义在注释本身中:它说明了结果集中的哪一行哪个字段应该被检查,并提供了条件(目前是简单的数值比较:'=‘, ‘<‘, ‘>‘, ‘<=‘, ‘>=‘)。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#checkfieldvalue-validator

这里有一个实际使用示例:MDEV-4578。用户报告在I_S.processlist.time字段中出现零星的奇怪值。当然,您可以为其编写一个校验器,我最初也这样做了,但我很快意识到这很不方便,因为我想不断修改检查查询。因此,我改为将SELECTI_S添加到语法中,条件是 time 字段必须小于某个非常大的值。

可能的校验集合将根据需要进行扩展。

SlaveCrashRecovery 报告器

该报告器用于测试主从复制的崩溃安全性。它会定期使从库崩溃,然后重启它,并确保它能够正常启动。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#slavecrashrecovery-reporter

我正在使用它及其姐妹报告器 MariadbGtidCrashSafety reporter 来测试 MariaDB 对 GTID 的实现。

BinlogConsistency 报告器

该报告器检查二进制日志的内容是否正确反映了测试流程结束时的数据。主测试流程完成后,该报告器会创建服务器的数据转储,关闭服务器,启动一个使用相同选项但在干净数据目录上的新服务器,将第一个服务器的二进制日志重放到新服务器中,创建新服务器的数据转储,并将其与之前的转储进行比较。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#binlogconsistency-reporter

我使用它来测试 MariaDB 10.0 中的 binlog 更改(例如参见 MDEV-181, MDEV-232

CrashRecovery 报告器

这是旧版 Recovery 报告器的新实现,更适用于当前服务器版本。它没有为重启的服务器使用硬编码的选项集,而是使用与初始服务器相同的配置。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#crashrecovery-reporter

VIEW 算法比较

RQG 允许配置测试期间使用的视图类型,但您只能在正在比较的服务器上创建相同类型的视图。在测试 MariaDB 10.0 中实现的MERGE视图扩展时,我发现这是一个不足(参见 MDEV-3862):我需要将一个服务器上的MERGE视图与另一个服务器上的TEMPTABLE视图进行比较。所以,--views1--views2选项现在已被添加。这可能不是最优雅的解决方案,但它与 RQG 中其他类似的选项一致,并且能够解决问题。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#comparison-of-view-algorithms

多个重定义语法

我发现我的重定义语法集合开始不合理地增长,因为我一次只能提供一个,而且经常需要组合多个,所以我不得不为每种组合创建一个新语法。
所以,现在您可以添加任意多个--redefine=选项,所有语法都将应用于主语法之上。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#multiple-redefining-grammars

新语法关键字 _basetable 和 _view

RQG 关键字 _table 表示测试数据集中的任何表或视图。通常这已经足够好了,但有时会极大地增加错误语句的数量,例如出现“not a base table”错误。现在,可以根据目标在语法中区分表和视图_table仍可用于表和视图,而_basetable只会选择表,而 _view 只会选择视图。

参见 https://kb.askmonty.org/en/rqg-extensions-for-mariadb-features/#new-grammar-keywords-_basetable-and-_view

反馈

如果您对这些更改有反馈,可以在 MariaDB 特性的 RQG 扩展处留言。