我有三个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查询的响应时间,以及如何做到这一点?
答案 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是一种具有良好可靠性和安全性的既定产品......只是它的目的和功能不同。