在负载均衡器上记录查询响应时间

时间:2016-05-28 03:36:16

标签: mysql load-balancing haproxy

我有三个MySQL数据库服务器设置了主 - 主循环复制。复制工作正常,所以这很好。 我正在使用https://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html#Secondary+NameNode和rsyslog, 这是我的haproxy.cfg:

# provides UDP syslog reception
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

我已从/etc/rsyslog.conf取消注释以下行:

if ($programname == 'haproxy') then -/var/log/haproxy.log

,这在/etc/rsyslog.d/haproxy.conf中:

May 27 18:44:38 localhost haproxy[26517]: Proxy mysql-cluster started.
May 27 18:44:38 localhost haproxy[26517]: Proxy mysql-cluster started.
May 27 18:45:02 localhost haproxy[26535]: Proxy mysql-cluster started.

日志正在以某种方式运作:

mysql -h 127.0.0.1 -u haproxy_root -p$MYSQL_PASSWORD -e "show tables in mydatabase"

但它没有显示任何MySQL请求的条目,例如我在HAproxy VM上运行此命令时:

{{1}}

我的HAproxy版本是1.5 我想知道我是否可以在HAproxy中记录MySQL查询的响应时间,以及如何做到这一点?

1 个答案:

答案 0 :(得分:1)

log 127.0.0.1 local0 notice

删除单词notice并重新启动HAProxy。使用notice减少了代理生成的日志记录量。

但是,此更改不会导致日志记录连接,当连接断开连接时,这些连接将与其计时器一起记录。

HAProxy无法记录查询响应时间,因为带有mode tcp的HAProxy不能正常运行,因为它可以被正确描述为“MySQL代理”。 HAProxy是一个tcp连接代理。它的工作是识别用于每个传入连接的服务器(不是每个查询),建立连接,并保持打开以便客户端和服务器交换数据。 HAProxy不会试图“理解”正在交换的数据,因此它不知道正在交换的数据的任何含义。

与HTTP连接不同,MySQL连接是有状态的。创建临时表,启动事务,设置用户定义的变量(例如SET @foo = 'bar';)以及许多其他操作会使当前的MySQL连接处于某种特定的“状态”,使其无法与任何其他当前的MySQL连接互换因此,HAProxy几乎没有理由了解更高层,并且有充分理由不这样做,例如能够使用splice(2)系统调用来高效地代理TCP有效负载。 。只有当有效载荷在本地“无趣”时才能使用。

相比之下,MariaDB Maxscale是MySQL的有效负载感知第7层代理。它可以执行许多有趣的操作,例如透明读/写拆分以及将每个连接上执行的所有查询记录到文件中。

(很难从网站上看出它可以免费下载,但它是。我不隶属于MariaDB。)

这并不是说Maxscale比“HAProxy更好”,HAProxy是一种具有良好可靠性和安全性的既定产品......只是它的目的和功能不同。