postgresql连接haproxy时send-binary是必须的吗?

问题描述 投票:0回答:1

我尝试通过haproxy连接postgresql。 然而,postgresql只有“启动数据包长度无效”的错误。 应该通过使用 tcp-check send-binary 而不是 tcp-check send 计算数据包来设置 haproxy->postgresql 吗?

haproxy.cfg

#add
global
    log 127.0.0.1 local0
    maxconn 1000
    user root
    group root
    daemon
    stats socket /var/run/haproxy.sock mode 660 level admin
    stats timeout 2m

defaults
    log global
    mode tcp
    balance roundrobin
    retries 3
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen pgReadWrite
    mode tcp
    bind *:5430
    balance roundrobin

    option tcp-check
    tcp-check connect
    tcp-check send info\ replication\r\n
    tcp-check expect string role:master
    #tcp-check send "select 1";

    # server list to check
    server db0 192.168.10.190:5432 check port 5432

但是结果

[2024-01-10 10:47:05.183 KST][192.168.10.150(59524)][[unknown]][[unknown]][[unknown]][2521][00000]LOG:  connection received: host=192.168.10.150 port=59524
[2024-01-10 10:47:05.183 KST][192.168.10.150(59524)][[unknown]][[unknown]][[unknown]][2521][08P01]LOG:  invalid length of startup packet
[2024-01-10 10:47:07.185 KST][192.168.10.150(59530)][[unknown]][[unknown]][[unknown]][2522][00000]LOG:  connection received: host=192.168.10.150 port=59530
[2024-01-10 10:47:07.185 KST][192.168.10.150(59530)][[unknown]][[unknown]][[unknown]][2522][08P01]LOG:  invalid length of startup packet
[2024-01-10 10:47:09.190 KST][192.168.10.150(59546)][[unknown]][[unknown]][[unknown]][2523][00000]LOG:  connection received: host=192.168.10.150 port=59546
[2024-01-10 10:47:09.190 KST][192.168.10.150(59546)][[unknown]][[unknown]][[unknown]][2523][08P01]LOG:  invalid length of startup packet
[2024-01-10 10:47:11.192 KST][192.168.10.150(34472)][[unknown]][[unknown]][[unknown]][2524][00000]LOG:  connection received: host=192.168.10.150 port=34472
[2024-01-10 10:47:11.192 KST][192.168.10.150(34472)][[unknown]][[unknown]][[unknown]][2524][08P01]LOG:  invalid length of startup packet
[2024-01-10 10:47:13.195 KST][192.168.10.150(34488)][[unknown]][[unknown]][[unknown]][2525][00000]LOG:  connection received: host=192.168.10.150 port=34488
[2024-01-10 10:47:13.195 KST][192.168.10.150(34488)][[unknown]][[unknown]][[unknown]][2525][08P01]LOG:  invalid length of startup packet
[2024-01-10 10:47:15.200 KST][192.168.10.150(34504)][[unknown]][[unknown]][[unknown]][2527][00000]LOG:  connection received: host=192.168.10.150 port=34504
[2024-01-10 10:47:15.200 KST][192.168.10.150(34504)][[unknown]][[unknown]][[unknown]][2527][08P01]LOG:  invalid length of startup packet
postgresql haproxy
1个回答
0
投票

不,这行不通。像以前一样。

tcp-check 有什么作用?它通过 TCP 发送给定的字节并期望一些响应。但是 postgres 的网络通信是如何工作的呢? Postgres 使用自定义协议进行通信。来自文档

消息的第一个字节标识消息类型,接下来的四个字节指定消息其余部分的长度

您可以通读整个文档,了解如何创建发送给 postgres 的消息。所以 postgres 期望网络上有一个复杂的字节序列,而不仅仅是微不足道的

select 1
。实际的查询将嵌入到消息中的某个位置,但消息本身的意义远不止于此。

然后你必须看看消息流。因为它并不像“发送编码的

select 1
并验证响应”那么简单。您从启动消息开始通信,然后进行身份验证等。所有这些对于您手动实现来说已经很困难了。您必须这样做,因为 haproxy 在此功能中仅接受原始 tcp 消息。如果您在此基础上添加加密(无论如何这应该是强制性的),那么由于其动态特性,这将变得不可能。除非 haproxy 支持使用此功能进行解密,但我不确定。尽管如此,无论有没有加密,它都已经太难了。

当您使用 postgres 客户端时,它会为您完成所有这些工作。它是由真正从事 postgres 工作的人维护的,他们知道自己在做什么。所以我的建议是:不要使用这个功能(反正它几乎没有用),如果你想进行检查,那么创建一个 cron 作业(或等效的),它将通过一些 postgres 客户端调用数据库。

© www.soinside.com 2019 - 2024. All rights reserved.