在这篇文章中,我们将看看如何使用ProxySQL来帮助处理ping的数据库负载。
我以前在博客中写道我们定期的客户之一,Life360。他们最近的一个问题是PING命令以每秒30% -40%的总查询在数据库基础设施。这是一个非平凡的数量和很容易成千上万的ping每秒。这增加了大量的延迟真正的查询。
大量ping是由于使用PHP的PDO持久连接。持久性或池,有必要减少时间连接,断开和重新连接。
不幸的是,在PHP(和其他)实现,司机检查数据库是否还活着,萍在发送实际的命令。逻辑上来讲,你可以使用实际的命令PING,如果失败可能返回相同的错误会如果萍自己失败了。施瓦兹男爵有很多关于如何明智使用PING在司机吗。
除非修改PHP PDO,我们想出了另一个解决方案:ProxySQL。
测试ProxySQL之前,我们不知道有多少被转发到实际的主机(包括这些com_admin命令)。我们想测试快速PoC发现ProxySQL的实际行为是对这些命令。我们有两个假设我们想检查:
- ProxySQL前锋的一切包括com_commands
- ProxySQL响应com_commands本身
如果ProxySQL转发一切,我们建立了一个“诱饵”MySQL实例响应ping使用ProxySQL查询过滤。结果,我们发现ProxySQL迅速无声的回复ping,不前进到底层数据库服务器的后端。这是其他命令的情况,作为货运代理ProxySQL并非严格(但更多的反向代理)。
通过将ProxySQL应用服务器,Life360能够显著降低每秒。引入ProxySQL的另一个优点是,它是连接池和多路复用。
这是图com_ping当天部署:
总的来说,我们谈论的是每天数亿ping到0。
我们可以看到,香草安装ProxySQL也极大的降低了活动线程:
这种变化使得Life360推迟他们的一些扩展计划和提供其他的运营收益。
总之,您可以使用ProxySQL作为一个简单的(或高级)防火墙应用程序和数据库之间。它消耗很少的资源,但提供了一个巨大的性能提升。
虽然ProxySQL可以用作一个更先进的防火墙,这些特性超出了本文的范围。有非常具体的方式来配置它作为一种先进的防火墙。我们计划在这个博客更多。








我能想到,PHP将发行COM_CHANGE_USER一旦再利用从池中连接(我不知道聪明的实现实际上是,例如,它只存储文件描述符散列的服务器或整个组合服务器+用户+ db),但COM_PING是相当愚蠢的,常常令情况更加糟糕的是,大多数PHP框架实际上并不处理数据库错误很好…
运行一个本地SQL代理通常意义只是为了改进的连接池。
很好的分享,“诱饵”MySQL实例是什么意思?
据我理解他们建立另一个MySQL实例和配置ProxySQL ping转发给该实例。他们发现ProxySQL本身能回答ping,当部署在本地保存一个往返。
理解,谢谢尼尔斯