全球层面

全球层面

在计划将我的应用程序 (Java+Tomcat+MySql) 移植到云托管时,我发现需要考虑的一个重要因素是传输到/从数据库的数据量,因为它受到云提供商的限制。我还没有找到一种方便的方法来根据使用情况统计数据(例如查询数量和平均行大小)估计这个量,也没有找到如何测量当前利用率。

MySql 中是否有任何内置的统计数据可供我使用,或者最好从网络角度监控它,监控往返于 MySql 使用的端口的数据。

提前致谢

答案1

如果您想直接测量应用程序中进出 MySQL 的网络流量,可以监视两个状态变量:

全球层面

您可以使用此查询获取所有会话(过去和现在)的数据

SELECT * FROM information_schema.global_status
WHERE variable_name IN ('Bytes_received','Bytes_sent');

这将为您提供 mysql 实例生命周期内每个实例的数量。

会话级别

你可以使用以下命令获取每个会话的这些信息

SELECT * FROM information_schema.session_status
WHERE variable_name IN ('Bytes_received','Bytes_sent');

这将为您提供 DB 会话生命周期内每个的数量。

您可以使用 GUI 绘制随时间变化的图表。既然您提到了 Java 和 Tomcat,您可能希望创建自己的演示文稿。您必须保留以前的值,获取当前值,减去它们,然后根据需要绘制或显示平均值。

试一试 !!!

警告

我很久以前在 DBA StackExchange 中讨论过这个问题(MySQL:“bytes_sent”和“bytes_received”是否包含 mysqldump 数据?) 任何具有线程的东西都将计入这两个变量,包括 MySQL 复制之类的内部机制(通过 IO 线程和 SQL 线程)。

鉴于此,请确保您没有不必要的数据库连接执行读取,并且不要在 mysqldump 或重新加载 mysqldump 期间监视 MySQL。即使是监视软件(例如 Nagios、Zabbix、MONYog、EM7 等)Bytes_received每次运行时都会产生流量SHOW GLOBAL VARIABLES;

建议

由于连接到 mysqld 的所有内容都会影响全局Bytes_receivedBytes_sent状态值,因此你可能希望你的应用程序在运行之前收集会话级别Bytes_receivedBytes_sentmysqli_close()。然后,您可以生成这些数字的报告。然后,您可以从全局计数中减去这些总数,以查看请求了多少内部数据。

答案2

最简单的方法是启动MySQL 工作台。虽然可能需要花费一些精力才能正确设置服务器管理功能,但它提供了网络利用率图表,是管理 MySQL 实例的全面优秀工具。基于 Web 的 MySQL 管理解决方案是phpMyAdmin,它还提供 MySQL 统计信息。但是,请注意,phpMyAdmin 过去曾出现过几个重大安全漏洞(例如,允许完全接管系统),因此我强烈建议您改用 MySQL Workbench。(顺便说一句:如果您真的想要或需要使用 phpMyAdmin,请确保在 phpMyAdmin 前面有一个身份验证方案,这样恶意者才能看到您的 phpMyAdmin 登录信息,他们必须通过您的第一个登录层。例如,我的服务器需要通过 HTTPS 进行基本身份验证,并根据 PAM 检查提供的用户名和密码,然后才允许访问 phpMyAdmin 登录页面。)

如果你也对收集大量漂亮图表的常规统计数据感兴趣,穆宁是一个很好的解决方案,它还包括一组 MySQL 监控插件,但必须先对它们进行配置,并且需要安装一些 Perl 依赖项才能使 MySQL 监控插件正常工作(Cache::Cache并且DBD::MySQL,根据插件脚本中留下的注释)。

最后,请记住,只有当您的应用程序和数据库位于不同的服务器上时,MySQL 流量计费才是问题;本地主机流量不计量(或因此不计费)。

相关内容