我正在开展一个项目,例如动态创建数据库配置,获取 mysql 实例的读取副本数组并保持与每个副本的一个开放连接并保留它们在该服务中的静态信息,因此当客户端尝试连接读取副本时,它应该返回不太忙的副本。
我的问题是它的公式应该是什么?
到目前为止我只有 2 个变量,对这些变量的任何改进都值得欢迎。
- 远程服务器是否处于活动状态
- 它有多少个活动连接(带有 Threads_connected)
- 复制是否健康
答案1
我设计了在类似情况下引导查询量的系统。包含以下几点可能会很有趣:
- 候选人的实际流量的平均响应时间(不仅仅是监控查询)
- 过去一段时间内的查询次数(60 秒等)
- 过去某个时间段的内存/CPU/磁盘利用率
我之前已经为每个资源赋予了权重,然后基本上将它们加起来。因此,从单个服务器中,您可能会得到:
memory 50(%)
cpu 40(%)
disk 4000 (iops, if you know the limit here making it a % is good)
ms 300 (msecs average response time)
该服务器的权重为 4390(此处权重越高,情况越糟)。您可以在此处看到,如果 CPU 不是那么重要,您可以在计算中更改其“权重”,以便更准确地决定在您的环境中使用哪个客户端。
如何收集这些信息会影响收集频率和可靠性(也许自从您列出最少使用的服务器以来,某个节点已经死亡)。一种方法是在每个候选服务器上运行报告守护程序,并在收到客户端请求时查询它,可能是通过多播。报告守护程序可以非常频繁地收集统计数据,以使决策信息尽可能准确。
目前还不清楚您生成的配置有多短暂,这是进行分发时的一个重要考虑因素。您的客户端是否会长时间连接?您是否可能需要断开连接并重新分发客户端,因为服务器超载了?也许您已经考虑过了。
根据您的瞬时程度以及您对查询的了解程度,您还可以向决策指标添加更多数据:
- 候选人当前正在服务的预期客户权重(如果您也为客户提供权重)
- 内存中已有的数据集(如果您的数据大小超出了服务器的内存容量,并且您拥有多台服务器,您可以通过将特定数据集的查询平衡到已经在内存中的服务器来提高 RAM 利用率)
- 服务器的正常运行时间(在需要频繁做出决策的基于重量的场景中,完全卸载的新盒子通常会被压垮)
希望这能有所帮助!这是一个有趣的问题。
答案2
您可以使用简单的脚本或使用 Nagios 插件来完成此操作。
检查mysql的健康,类似这样:
定义命令{ 命令名称 check_mysql_health 命令行 $USER1$/check_mysql_health -t 20 --主机名 $HOSTADDRESS$ --端口 $ARG1$ --用户名 $ARG2$ --密码 $ARG3$ --模式 $ARG4$ --警告 $ARG5$ --关键 $ARG6$ } 定义服务{ 使用通用服务 主机名 mysql_slave service_description MySQL_threads-已连接 check_command check_mysql_health!3306!用户!密码!线程连接!30!40 }
-
3.
定义服务{ 使用关键服务 主机名 mysql_slave service_description MySQL_slave-io-运行 check_command check_mysql_health!3307!用户!密码!slave-io-running contact_groups 管理员短信 } 定义服务{ 使用关键服务 主机名 mysql_slave service_description MySQL_slave-sql-运行 check_command check_mysql_health!3307!用户!密码!slave-sql-running contact_groups 管理员短信 }