基于请求中域名的haproxy服务负载平衡mysql连接

atmip9wb  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(336)

我有一个服务发现体系结构,其中我有一个haproxy,用于基于主机名的mysql连接的tcp路由。我在这里读到的https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/.
它告诉我们,确实可以通过sni实现基于tcp请求中接收的主机名来路由tcp连接。
现在我已经按照上面的配置设置了haproxy,但是我无法确定在springboot应用程序的mysql配置中需要做什么更改。另外,如何通过mysql客户端测试haproxy的工作情况?

0ejtzxu1

0ejtzxu11#

通过sni实现,确实可以基于tcp请求中接收的主机名来路由tcp连接。
是的,这是正确的,但前提是以下所有条件都成立:
协议是一个客户先说话的协议
tls由客户在初始连接时立即协商,并且
sni由客户机在tls握手中呈现。
但是对于mysql客户机/服务器协议,这些都不是真的。
在mysql客户机/服务器协议中,服务器首先进行会话¹, 识别自身及其功能(包括是否支持tls),然后客户端用自己的功能列表(包括是否希望协商tls)进行响应,最后tls协商开始,sni没有权限,因为客户端和服务器已经连接。
热释光;dr:mysql客户机/服务器协议不能基于主机名通过任何类型的代理进行路由。协议的设计使得这不可能,因为主机名无法传输。
基于名称的路由的唯一选择是haproxy具有多个ip地址,并且具有一个单独的ip地址 frontend 或者 listen 节绑定到每个地址,并且每个主机名都指向其中一个地址。
¹服务器先会话是指连接的哪一方在建立连接后发送第一个有效负载。当然,客户机开始建立连接的过程,但是一旦通道打开,在mysql协议中,任何方向的第一个有效负载都来自服务器。其他协议,比如smtp,也做同样的事情——smtp服务器用类似于 220 mail.example.com ESMTP service ready . 这不同于http这样的协议,在http中,客户端首先进行会话。建立连接后,服务器不发送任何内容,等待客户端发送类似的内容 GET / HTTP/1.1\r\nHost: example.com\r\n\r\n . 在https中,当建立连接时,服务器不发送任何内容,客户端启动tls握手。

相关问题