【问题标题】:Client-side (Python) load-balancing a MySQL server客户端(Python)负载平衡 MySQL 服务器
【发布时间】:2018-05-05 07:58:20
【问题描述】:

我有一个有趣的问题想找到解决方案。

我有一个在 Ubuntu (16.04) 上运行的 MySQL 服务器。我还有许多服务器,它们将 CPU 温度、网络流量数据和 CPU 负载等系统信息存储在 MySQL 服务器上的数据库中。为此,我在每台服务器上运行了几个 Python 程序,它们收集数据并将其推送到数据库。
在这些服务器上,我还有一些脚本会定期查询数据库以获取历史数据,然后将这些数据绘制成图形并显示在网页上。

我现在设置的方式导致所有服务器倾向于同时查询数据库。这会导致 MySQL 服务器上的高负载,随后很长一段时间几乎没有负载。

有哪些选项(最好是客户端 Python)可以帮助我更均匀地分散 SQL 服务器上的负载?

【问题讨论】:

  • 你能简单地给这些服务器计时吗……?也许添加一个随机延迟?见Stampeding/Thundering Herd问题。
  • 是的,完全相同的代码在所有客户端上运行。因此,可以在默认周期时间中添加一个随机时间。但是,我仍然无法控制客户之间的任何同时查询。
  • 嗯,是的,如果你想以分散的方式协调同时进行的活动,除了随机延迟之外别无他法。查询不能做同样的事情?
  • @deceze "查询不能做同样的事情吗?"我不知道。
  • 那么,在所有客户端的开头添加一个sleep(randint(60, 360))...?

标签: python mysql python-3.x debian-based


【解决方案1】:

这通常被称为踩踏雷击群问题。突然之间,大量的客户想要一些东西,然后活动又白费了。有不同的应对方法。如果您在客户端和服务器之间有一些中介,例如负载均衡器,您可以使用它来分散负载,甚至可以根据需要使用它来启动新的服务器实例。

在直接客户端-MySQL 连接的情况下,这通常不是一个选项。也许您可以切换到只读复制从站,这样可以更轻松地吸收影响(即水平扩展)。或者你得到一个更大的服务器,它具有更好的峰值负载性能。当然,如果 99% 的时间都没有任何负载,那么这些解决方案就不是很划算。

廉价的解决方案是避免所有客户端同时冲向服务器。或者单独偏移每个客户端(例如,为0 * * * *5 * * * *10 * * * * 等安排他们的 cron 作业),或者每次只是随机延迟每个客户端(Python 中的sleep(randint(0, 360)),bash 中的sleep $((RANDOM % 360)) && ... )。

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2021-07-26
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多