能不能用一个 3306 端口暴露多个 MySQL 服务? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seagull7558
V2EX    Kubernetes

能不能用一个 3306 端口暴露多个 MySQL 服务?

  •  
  •   seagull7558 2023-01-26 22:20:03 +08:00 4375 次点击
    这是一个创建于 1042 天前的主题,其中的信息可已经有所发展或是发生改变。
    我尽量准确描述问题,下面展示下流程,从上往下看

    - 客户端 Navicat 连接 Mysql, 地址为:mysql.namespace-1.k8s.xxx(xxx 为公司拼音缩写):3306 或是 mysql.namespace-1.k8s.xxx(xxx 为公司拼音缩写):3306
    - 自建 DNS 解析域名 k8s.xxx 到 VIP
    - 某台 VIP 上接收到请求
    - traefik 或是 ingress-nginx 监听当前机器的 3306 端口
    - 动态根据域名完成转发,如果是 HTTP 解析域名 -> K8S 服务名.命名空间.svc.cluster.local

    问题就在于,第 5 步,没有什么东西支持从 tcp 请求里获取域名,也就没法完成代理到后端服务

    哪位大佬有类此场景的解决方案吗?

    主要是想按照阿里云的习惯来走~
    13 条回复    2023-01-27 12:38:04 +08:00
    buxudashi
        1
    buxudashi  
       2023-01-26 22:21:31 +08:00
    弄多个域名 就解决了。
    shinciao
        2
    shinciao  
       2023-01-26 22:57:21 +08:00
    不能。MySQL 建立连接的 TCP 请求里没有携带域名,你无法获取到不存在的东西。
    如果是 MySQL over TLS 的话理论上可以。因为 TLS 握手的第一个请求的 SNI 里会带上域名,但是应该没有直接可用的实现方案。而且需要抓包确认一下 Navicat 在连接 MySQL over TLS 时是否会携带 SNI 。
    seagull7558
        3
    seagull7558  
    OP
       2023-01-26 22:59:25 +08:00
    @lanternxx 嗯 nginx 和 traefik 都有在预读阶段通过 SNI 获取域名 但是不想加 TLS,目前看好像没有什么好方案
    huanw
        4
    huanw  
       2023-01-26 23:03:54 +08:00
    在你的 k8s 集群里跑一个自建的 ssh 服务,这个服务要支持 ssh remote forwarding ,然后在 navicate 连接时,使用这个 ssh 隧道就可以连接了
    cctv6
        5
    cctv6  
       2023-01-26 23:10:49 +08:00
    就你描述的方案应该是不可能实现的。假定你要用负载均衡代理 mysql ( traefik/ingress-nginx/或者其他的负载),它们代理 mysql 的流量肯定只能工作在传输层,mysql 并不是 HTTP 协议,这个时候负载均衡是没办法拿到域名的。

    如果要实现的话,大概要自己实现一个支持 mysql 协议的代理,然后解析 host 。可以参考一下 mycat 。
    ETiV
        6
    ETiV  
       2023-01-26 23:33:49 +08:00 via iPhone
    mysql 客户端连接都是在 4 层的

    但是你可以自己实现一个 7 层应用层的类似 nginx 的服务,逻辑实现如下:
    通过在用户名上做手脚(比如 root.prod 、root.dev ;你喜欢的话也可以用对端 IP 地址),通过某种 rewrite 规则把 .prod 、.dev 部分提取出来,再使用 root 用户名和密码去连接后端真实的 prod 、dev 的 3306 端口并创、保持连接并转发数据
    anubu
        7
    anubu  
       2023-01-26 23:45:32 +08:00 via Android
    之前简单研究过类似场景,四层的域名转发似乎都需要依赖 sni 。没记错的话,mysql 的 sni 并不容易(或者无法实现?记不清楚了),似乎是应用层协议握手逻辑和一般应用不一样。
    vibbow
        8
    vibbow  
       2023-01-27 00:07:14 +08:00
    可以实现的,并且比你想象的还简单,使用 navicat 自带的 HTTP tunnel 即可

    https://github.com/vibbow/navicat-mysql-tunnel

    对这个脚本稍微改一改,就可以实现不同的 HTTP_HOST 指向不同的后端了。
    tf2
        9
    tf2  
       2023-01-27 00:15:39 +08:00
    应该有些 mysql proxy 能做到。既然读写分离都能做到,区分 host 应该也不难。
    coolwind1981
        10
    coolwind1981  
       2023-01-27 09:01:05 +08:00 via Android
    coolwind1981
        11
    coolwind1981  
       2023-01-27 09:05:59 +08:00 via Android
    @seagull7558 @vibbow HTTP tunnel 挺好的
    lazyfighter
        12
    lazyfighter  
       2023-01-27 09:54:30 +08:00
    https://tengine.taobao.org/document/stream_sni.html 他可以做到, 楼主我觉得可以描述一下问题场景, 别说解决方案, 可能是你想偏了
    johnkiller
        13
    johnkiller  
       2023-01-27 12:38:04 +08:00
    域名在请求之前就已经在客户端解析成 IP 了,到入口服务器那里的报文已经没有域名了,而不像 HTTP 是会带一个 Host: xxx 字段。
    通过不同 MySQL 用户名+ Proxy 来分流也许是一种可行的方式。
    另外,用 tunnel 应该是最简单的,只是需要在 Navicat 上多配置一下代理。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2847 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:27 PVG 08:27 LAX 16:27 JFK 19:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86