【问题标题】:Reverse proxy based on DNS for multiple mysql hosts多台mysql主机基于DNS的反向代理
【发布时间】:2017-11-26 14:58:00
【问题描述】:

我在私有网络中有一些 mysql 主机,并且想使用反向代理服务器(即 nginx)通过反向代理服务器将 mysql-client 连接到 mysql 主机。

一个更好地理解我的答案的例子:

假设我已经:

  • 一个ip为yyy.1的mysql服务器
  • 一个ip为yyy.2的mysql服务器

都在 ip XXX 的代理服务器的网络中,我将 DNS mysql-server1.com 和 mysql-server2.com 关联到 XXX。

当我使用 mysql 客户端通过调用 mysql-server1.com 连接到 XXX 时,我的目标是连接到 mysql 服务器 yyy.1在端口 3306 上,在端口 3306 上尝试 mysql-server2.com 时类似。

nginx 的问题是我无法通过服务器名称区分 TCP 请求,所以在 XXX 服务器中我应该为每个 mysql 服务器关联一个端口,但这意味着每次我都应该在 mysql 客户端设置中更改端口,我不想要这个!

有一些代理服务器可以做到这一点吗? 我可以使用 IP 表将请求 mysql-server1.com:3306 路由到 localhost:[some port],我可以在代理设置中使用 [some port]将请求转发到服务器 yyy.1

【问题讨论】:

    标签: mysql nginx tcp proxy routing


    【解决方案1】:

    这是不可能的。

    在 MySQL 客户端/服务器协议中,客户端永远不会识别它尝试连接的主机名。与其他一些协议不同,例如 HTTP(带有Host 标头),客户端用于从 DNS 解析 IP 地址的原始名称不会被保留。 TLS SNI 也不可用,因为 MySQL 连接上的 TLS 协商直到客户端读取服务器功能标志以发现服务器是否支持 TLS 时才开始,此时客户端要求将连接切换到 TLS ...... ,当然是在连接已经建立之后。

    在 MySQL Client/Server 协议中,服务器总是先对话。

    您唯一的选择是让代理机器侦听多个 IP 地址,并使用指向每个 IP 的 DNS 主机名,并使用客户端连接的地址来确定要使用的服务器。

    或者,每个代理实例监听一个单独的端口。

    协议设计防止基于名称的虚拟主机。

    【讨论】:

    • 非常感谢!我认为问题可能出在协议中,您的确认非常宝贵!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2018-04-05
    • 2016-09-23
    • 2015-03-12
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多