压力测试服务器恢复,[译文]Pstress:数据库并发和崩溃恢复测试工具

Pstress:数据库并发和崩溃恢复测试工具数据库是复杂软件,可以处理并发负载,同时保证数据的一致性和可用性。有很多场景只有在并发场景下才能测试出。

Pstress是一个基于概率的开源数据库测试工具,设计用于测试并发和测试数据库在出现问题时是否可以恢复。它根据用户提供的选项生成随机事务。使用正确的选项,用户可以测试功能、回归和崩溃恢复。它可以在集群或者单实例上创建并发负载。

这个工具仍在测试阶段,但是它在Percona的测试过程中已经变得非常重要。Pstress已经广泛用于Percona QA团队每一个测试阶段。它发现了Oracle官方社区版、Percona版MySQL、PXC和Percona Xtrabackup中的一些严重bug。Pstress是在Percona Pquery框架上开发的,Percona Pquery框架是一个测试工具,它从文件中随机选择SQL语句,在目标环境中多线程并发执行。有关Pquery的更多信息可以在本文的最后一节找到。

最初,该工具被命名为Pquery 3.0,但由于其功能和目的与Pquery不同,我们将其重命名为Pstress,以更准确地表达它的用途。

Pstress的核心功能根据用户提供的选项生成不同的负载。例如,该工具可以在单线程下测试只在一个表中插入语句,或者可以在多线程中生成涉及JSON、GIS、分区表、外键、虚拟列等的大事务。

杀死或者关闭正在运行的服务器或节点,然后使其恢复并检查。

如果发现了任何问题,它会创建一个包含所有相关信息的bug目录。

它从bug目录中提取重要信息,并尝试与现有的bug进行比较。

提供了一种简单的机制来复现问题。

它可以用于测试任何支持SQL接口的数据库。目前,它被开发用于测试MySQL,并计划扩展该工具用于测试PostgreSQL。

它是如何工作的Pstress需要执行多步。在第一步中,它根据用户提供的选项创建运行测试所需的元数据。以下是命令行中执行的示例。./pstress-ms--tables20--columns10--encryption=keyring--indexes20--no-blob--no-virtual–seed2020上述命令基于seed 2020创建了有10个列和20个索引的20张表,包含一些其他随机属性,如压缩、加密、表空间。如果seed是一个其他值,表结构会不同。“--no-blob --no-virtual”意味着不会创建包含blob和虚拟列的字段,“--encryption=keyring”意味着它使用基于keyring的加密。

它根据每个选项概率生成随机的SQL。每个选项有命令行选项或者默认概率。目前,大约有100个选项可以生成随机SQL。一旦我们有了对JSON、GIS、分区表的支持,就会有更多的选项。--add-index10--drop-index10--rename-table0--insert800--update500上面的命令在每个会话中添加10个索引,删除10个索引,800次插入、500次更新、其他SQL按默认值比例执行SQL。这用于测试添加、删除索引时能否并发进行DML操作的场景。

经过一段时间后,它停止该步骤,保存数据目录并通过更改一些服务器参数重启服务,然后继续压力测试。

在进行测试的过程中,该工具不断检查服务的心跳、错误日志和其他校验和,以识别bug,如果Pstress发现错误,它将创建一个错误目录。它保存跟踪堆栈、错误日志和其他相关信息,以便您分析和复现问题。

最后,它用已知问题和未知问题标记每个bug目录,并创建一个供用户分析的报告。

为什么我们有多个步骤Pstress可以用于崩溃恢复测试,因为我们在压力测试的同时多次杀死服务或者节点,并让其恢复。

多个步骤可以作为服务的快照,如果发现任何问题,Pstress可以从最后一个已知的正常状态运行来复现问题。

Pstress的不同用例可用于回归、功能测试或者崩溃性恢复测试工具。

回归测试每种类型的SQL语句都有一些默认的概率值,可以在事务中更改这个值。因此,当我们将所有这些SQL组合在一起时,我们得到了一个相当不错的负载,它涵盖了并发模式下数据库的不同功能。该工具成功发现了一些只有在并发条件下才会发生的问题。

该方案有一个配置文件,其中包含测试JSON、GIS、分区等特性的不同概率组合。根据seed值,Pstress会选择这些组合来捕捉回归bug。

功能测试Pstress可用于对数据库特定功能进行压力测试。用户必须选择相关SQL,并将它们的概率设置调高。

下面是一个用于测试MySQL8.0版本“即时加列”特性的负载简单示例。--add-column20--drop-column--only-cl-ddl--only-cl-ddl

选项设置代表“只进行DDL”。

这个工具可以在多个会话中并发执行DML时,同时添加列和删除列。另外,如果在一个会话中成功添加了一个列,那么另外一个会话将开始用该列生成DML。

崩溃恢复测试在每一步结束时,Pstress会在数据库有负载时杀掉进程,并让其恢复。它还会在重启服务之前更改一些服务器参数,并在继续之前进行全面检查。如果Pstress识别出一个问题,它会将数据目录的所有内容和其他相关信息保存在bug的目录中。

Pstress模块Pstress由一个驱动脚本和workload程序组成。

驱动脚本驱动脚本是用BASH写的一个shell脚本。下面是驱动脚本的主要功能。1.启动/关闭数据库服务的节点。

2.加载负载。

3.通过检查服务的心跳,服务生成的错误日志等来检查服务的状态。

4.如果Pstress发现一个问题,它会保存数据目录和相关信息到bug目录。

5.它从bug目录中获取跟踪堆栈和其他信息,并尝试标记为已知或未知问题。

6.监控负载,并在负载hang住时停止压力测试。

7.在测试结束时,生成详细的测试报告:包括发生的错误数量、发现的已知问题以及成功事务的百分比。

Workloadworkload

是一个执行事务的多线程程序。每个线程都有自己的循环来随机执行一些事务。这个事务可以是针对一个表的DML/DDL,也可以设置一些全局参数。

下面是 workload

的工作流程1.根据用户提供的选项,为表创建元数据

2.启动多线程开始测试

3.第一步,先创建默认表并向表中加载初始化数据

4.随机选择一些表,并对这些表执行事务。

5.在DDL之后更新自身元数据,以便其他线程可以使用表的新的表结构。

6.在运行结束时,将元数据保存到JSON文件中,以供下一步使用。

7.如果在任何线程中发现错误,则整个步骤被标记为失败。

事务类型Pstress支持各种各样的SQL语句和事务,这些语句和事务是根据seed值随机生成的。1. INSERT/REPLACE

语句包含int、varchar、blob、GIS数据、JSON、分区和外键。

2. SELECT

语句可以有部分列、所有列,where语句,类似,like,between等运算符。

3. UPDATE/DELETE

语句可以有部分列、所有列,where语句,类似,like,between等运算符。

4. OPTIMIZE,ANALYZE,TRUNCATE

或者其他表级别操作。

5.添加或者删除列,添加或者删除索引,重命名列,重命名索引,添加JSON或者GIS索引。

6.多表关联

7.执行特定语法的SQL语句。用户提供一个语法文件,Pstress将随机匹配一些元数据并将它们作为事务执行。

8.在运行时添加/删除/创建 redo/undo

目标是支持MySQL和PostgreSQL的大多数事务和语句。

设计思路驱动脚本编写语言为BASH,workload编写语言为C++。Workload有节点、表、列和索引对象。数据库以集群模式运行实例化节点。

表可以有临时表和分区表等。

列支持GIS、JSON、虚拟列、blob、varchar、int等。

索引包括虚拟列索引、JSON索引、GIS索引。

表可以有外键的关联关系。

还有表空间对象、undo对象、redo对象。数据结构用于保存全局参数,workload用mutexes和锁来支持在多个线程中修改元数据。

在每步结束时,对象都会写入JSON文件,在重新启动后从该文件重新构建。

成功案例不想翻了...自己看原文吧...

与现有工具对比MySQL社区中现有比较常见的工具是RQG(Random Query Generator)、SysBench和Pquery。

RQG有语法文件的概念。它通过执行语句文件对数据库加压。因此,您必须写大量的语法文件来构造良好的负载,这通常不是一个简单的事情。

另外,在引入新的数据库功能时,现有语法文件也无济于事,因为它们不考虑新功能,必须进行修改。在本质上,您必须在每次引入一个新的数据库功能时编辑所有的语法文件,以获得一个良好的测试用例。这并不容易,而且可能会很麻烦。

SysBench与其说是一个测试工具,不如说是一个基准测试工具。需要花费大量工作来构建组合样例,生成负责,用于测试数据库并发和测试数据库特定功能。

Pstress有一些很酷的功能,比如崩溃恢复、bug标记和报告生成。这些功能是测试数据库并发及其副作用的重点之一,这使它成为实现此目的的更好工具。

Pquery与PstressPstress是在Pquery测试工具的基础上开发的。Pquery从文件中随机执行SQL。Pstress根据用户提供的参数生成SQL。

使用Pstress,每当发生DDL时,表的元数据都会被刷新,这使得执行SQL成功的概率大大提高。例如,如果在一个会话中添加了一个新列,那么其他会话将开始使用该列生成SQL。

Pquery从文件中随机选取SQL并在实例中执行这些SQL。一些事务SQL语句必须按照指定顺序执行才可以成功,如果顺序不对,将会失败。例如,在一个表在表创建之前试图执行插入语句。

Pquery本身并没有生成足够的负载来对数据库代码中的各个模块造成压力,从而无法找到压力引起的功能缺陷。Pstress专注于并发,可以发现和识别由压力引起的bug。

Pstress的限制不能用Pstress检查数据库的正确性。Pstress不会检查一个成功的查询是否返回了正确的数据。但是,有一些检查,比如确保在外键中没有违反父子关系,或者分区表没有来自其他分区的数据。这些检查非常有限。由于Pstress的并发性,所有没有检查它是否返回正确查询结果的机制,因为我们在检查时,其他线程可能会已经更新。

解决此问题的一种可能方法是使用多主集群来检查数据的正确性,但这可能不是真正的验证,因为额外的主实例是另一个数据库实例。我们计划尝试这个方法,看看结果如何,因为我们已经支持例如PXC这样的集群。

Pstress主要依靠数据库断言、错误日志中的信息、校验和、其他一些东西来发现数据库中的问题。这意味着如果bug在数据库中悄然出现,工具将无法找到并识别他们。虽然该工具善于发现bug,但至关重要的是数据库代码必须包含正确的日志记录和断言。

有时由于必须在高并发下bug才会触发,所以很难复现所发现的bug。多步骤的理念很有帮助,因为我们可以保存数据库快照,并在很短的时间内重现问题。然而,这并不是总可以保证的。如果用户对问题的来源有一些提示,他们可以在数据库的这一部分进行压力测试,并增加复现问题的可能性。

开发阶段中的功能JSON、GIS、分区和外键在开发阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值