mysql - Haproxy根据请求中的域名对Mysql连接进行负载均衡

标签 mysql service tcp dns haproxy

我有一个服务发现架构,其中有一个 haproxy,用于根据主机名对 MYSQL 连接进行 TCP 路由。 为此,我在 haproxy 中阅读了 https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/ .

它告诉我们确实可以通过 SNI 实现根据 TCP 请求中收到的主机名来路由 TCP 连接。

现在我已经按照上述配置设置了 Haproxy,但我无法弄清楚我需要在 springboot 应用程序中的 mysql 配置中进行哪些更改。 另外我如何测试这个haproxy是否通过mysql客户端工作?

最佳答案

it is indeed possible to route TCP connections based on host names received in TCP requests through SNI implementation.

是的,这是真的,但前提是以下所有条件也都成立:

  • 该协议(protocol)是客户端首先对话的协议(protocol),并且
  • 客户端在初始连接时立即协商 TLS,并且
  • SNI 由客户端在 TLS 握手中提供。

但是对于 MySQL 客户端/服务器协议(protocol),这些都不是真的。

在 MySQL 客户端/服务器协议(protocol)中,服务器首先进行对话,识别自身及其功能(包括是否支持 TLS),然后客户端用自己的功能列表进行响应,包括是否希望协商 TLS,最后TLS 协商开始,没有 SNI 的规定,因为客户端和服务器已经连接。

tl;dr:MySQL 客户端/服务器协议(protocol)无法基于主机名通过任何类型的代理进行路由。协议(protocol)的设计使这成为不可能,因为无法传达主机名。

基于名称的路由的唯一选项是 HAProxy 拥有多个 IP 地址,每个地址绑定(bind)一个单独的 frontendlisten 部分,以及主机名每个都指向这些地址之一。

<小时/>

¹服务器首先通话指的是连接建立后,连接的哪一端发送第一个有效负载。当然,客户端开始建立连接的过程,但是一旦 channel 打开,在 MySQL 协议(protocol)中,任一方向的第一个有效负载都来自服务器。其他协议(protocol)(例如 SMTP)执行相同的操作 - SMTP 服务器使用诸如 220 mail.example.com ESMTP 服务就绪 之类的内容启动对话。这与 HTTP 等协议(protocol)不同,在 HTTP 中,客户端首先进行对话。建立连接后,服务器不发送任何内容,等待客户端发送类似 GET/HTTP/1.1\r\nHost: example.com\r\n\r\n 的内容。在HTTPS中,当连接建立时,服务器不发送任何内容,客户端发起TLS握手。

关于mysql - Haproxy根据请求中的域名对Mysql连接进行负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50292923/

相关文章:

mysql - 如何使用Joomla中K2的导入工具导入CSV?

MySQL连接表的正确方法

service - 升级 SonarQube 问题

android - 从后台启动 Activity 并隐藏 MainActivity - 弹出窗口

c - 如何使用 write() 套接字编程发送部分 char 数组

networking - TCP 校验和中的错误率?

mysql - 如何在同一查询中获取同一表的计数和其他列?

mysql - 选择具有最低值的随机数据库记录

android - 从 Android 应用程序调用 Web 服务

c - TCP 服务器崩溃