我会告诉您开发应用程序时使用数据库监视工具的真实故事。我将向您展示我如何在应用程序中检测和解决问题的示例。
关于应用程序和过程
我正在使用MongoDB作为数据库开发PHP应用程序。该应用程序是轻巧的,大多数负载都属于数据库。我已经在应用程序级别实施了功能以调整查询数量,因为该应用程序可以将数据库迅速加载到100%。
为了开发,我在AWS中使用了几个小型开发实例,将Percona服务器用于MongoDB,并使用三个节点作为数据库,并已安装PMM来监视数据库。
结果,我的开发过程包括以下步骤:
- 我开发了一个新功能,并在开发服务器上运行了它进行测试。
- 我检查了PHP一侧的分析,并且没有内存泄漏,我对速度感到满意。
- 我检查数据库监视以确保一切正常。
- 我调试功能,设置函数中查询的数量和类型,以平衡查询数和数据库上的负载(如有必要)。
我如何在应用中添加新功能
所以我启动了该应用程序,并准备好运行新功能。该功能是从开源来源获取信息,对其进行处理并将其保存到数据库中。该功能的第二部分遍历了所有保存的文档,并进行了一些其他处理。
此时,该应用程序已经具有许多功能,使主节点的CPU加载了25-40%,并且一切都稳定运行。我决定拥有性能储备,就像我计划添加新功能一样。
我检查了几个仪表板,没有异常或更改。 PMM有许多仪表板和图表,我只会显示一些,只有一些。
我用新功能保存了更改,并将其推向开发服务器以使其正常工作。然后我检查了该功能是否没有错误启动,结果在数据库中可见。我使用mongoDB指南针检查数据库条目的结果。
某些事情的发展与计划的不同。
我等了几分钟,重新检查了仪表板。乍一看,主屏幕很好。但是,我对处理速度感到震惊。操作数量大多保持不变。
我向下滚动了仪表板上的各种图表,看到了一个异常。
延迟增加,该应用程序将实例加载到100%CPU。
我在应用程序侧进行了测试,并在那里检查了探险仪。该应用程序工作不佳,查询很慢。
找到问题的原因
我知道原因是新功能,并立即回滚了最后的更改。
我对问题可能在哪里,进行了一些更改并重新开始。
我做了几次,但是结果是相同的(CPU以100%加载)。
我选择了一个带负载的周期,并使用了监视中内置的查询分析功能。
查询分析显示了按负载或执行速度排序的查询列表。页面集合的一些查询给了90%的负载,查询时间超过3分钟。
在查询分析中,您可以找到缓慢的查询,查看其详细信息,然后在应用程序中调试。
解决问题
我进行了一些更改,以解决问题。
第一个问题是索引。我使用命令在应用程序中创建索引。
$app['db']->CollectionName->createIndex(['index_key' => 1]);
由于该应用程序使用许多不同的集合和查询,并在各个字段上以及有或没有排序的情况下使用了很多索引。
在这种情况下,我制作了一个错字,并且索引未正确创建。
正确创建索引后,我需要快速运行来调试查询数量以将CPU加载调整为约50%。
您可以在调试和解决问题后看到最终图表。
关于监视工具
我使用了免费的开源数据库监视Percona Monitoring and Management (PMM)。这是基于Grafana的专业工具。
在每个数据库实例上在本地或服务器PMM服务器和PMM客户端安装就足够了。 Documentation
也需要60-360分钟才能适应它,因为它具有许多功能和仪表板。
结论
不要忘记添加索引并确保它们工作。
我是一个简单的开发人员,可以犯错并进行不同的实验。安装监视是一个实验之一,以前我只是专注于PHP脚本的速度。我不时地查看了AWS控制面板中的监视仪表板,但仅提供有关实例本身的信息,而无需详细研究。
如果您使用MySQL,PostgreSQL或MongoDB,请尝试安装PMM并查看数据库的工作原理。用于开发目的的PMM安装有限的资源,并且很简单。它使我受益,因为我在生产之前发现并解决了问题。
一个小的澄清,故事是我的开发实践真实的,但是对于文章,我拍摄了最终调试的图表,以便图表显示正确的顺序,并适合可用于说明和演示的图像。实际上,我去喝咖啡几次,想了很长时间,监视图中所反映的:)