使用HAproxy拆分mysql集群的读/写

使用HAproxy拆分mysql集群的读/写,mysql,ubuntu,reverse-proxy,haproxy,portforwarding,Mysql,Ubuntu,Reverse Proxy,Haproxy,Portforwarding,我在Ubuntu16.04上有一个mysql集群,我想用haproxy拆分读/写 所有连接将通过端口80完成。 如果有人用X.X.X.X/write连接到服务器,我希望他被重定向到一个特定的服务器。 到目前为止,这是我的配置,它适用于默认的除/write之外的任何东西,但是当尝试连接/write时,我会得到未知的MySql服务器主机。 我的配置如下: global log 127.0.0.1 local0 notice maxconn 2000 user haproxy group haprox

我在Ubuntu16.04上有一个mysql集群,我想用haproxy拆分读/写

所有连接将通过端口80完成。 如果有人用X.X.X.X/write连接到服务器,我希望他被重定向到一个特定的服务器。 到目前为止,这是我的配置,它适用于默认的除/write之外的任何东西,但是当尝试连接/write时,我会得到未知的MySql服务器主机。 我的配置如下:

global
log 127.0.0.1 local0 notice
maxconn 2000
user haproxy
group haproxy

defaults
mode tcp
log global
retries 2
timeout connect 3000
timeout server 5000
timeout client 5000

backend read
balance roundrobin
server mysql1 192.168.0.4:3306
server mysql2 192.168.0.5:3306
server mysql3 192.168.0.6:3306

backend write
server mysql1 192.168.0.4:3306

frontend local
bind *:80
acl write url_beg /write
use_backend write if write
default_backend read

谢谢你的帮助

MySQL连接中没有URL,因此URL不可能匹配任何内容。连接到MySQL服务器或代理仅通过IP地址或主机名完成,而不是主机名和路径,因为没有路径。检测客户端使用的主机名是不可能的,因为在建立连接时不会传递该主机名

要实现您想要的功能,您需要两个不同的主机名,指向HAProxy服务器上的两个不同IP地址,并且这两个IP中的每一个都在其各自的前端with bind语句中

frontend read
  mode tcp
  bind 203.0.113.1:3306
  default_backend read

frontend write
  mode tcp
  bind 203.0.113.2:3306
  default_backend write

明白了。如果没有第二个ip地址,就没有办法做到这一点吗?在这种情况下,您必须绑定到不同的端口,因为只有一个ip,没有其他方法来区分目标。