使用 SSH 反向隧道连接到本地资源

将本地资源连接到Azure Databricks,而无需打开入站防火墙访问。 本地隧道主机在Azure中打开与代理虚拟机(VM)的出站 SSH 连接,允许Azure Databricks经典计算和无服务器计算访问本地资源。

工作原理

SSH 反向隧道允许本地隧道主机在 Azure 中打开到云代理 VM 的出站 SSH 连接。 Azure Databricks通过负载均衡器连接到代理 VM,流量通过隧道流回本地资源。 本地网络只需出站 SSH(端口 22)连接到 Azure,因此不需要任何入站端口。

在反向隧道中,本地主机启动出站连接(本地到云),以避免放宽防火墙限制,并且返回流量通过已建立的路径返回(云到本地)。

经典计算通过对等连接连接到代理 VM。 无服务器计算通过专用终结点连接,使用云提供商的专用连接服务访问这些服务。

注释

这是一种自我管理的解决方案。 预配和维护代理 VM 和本地隧道主机。

必需组件和可选组件

注释

此设置需要云环境和本地网络之间的专用网络线路。 此电路允许本地隧道主机启动对代理 VM 专用 IP 地址的出站 SSH 连接。 常见选项包括 ExpressRoute 或 VPN 隧道。

必需 (最低工作设置):

  • 运行 autossh 用于建立出站 SSH 连接的本地隧道主机。
  • 在云中运行一个代理 VM socat 来接受隧道,并在其网络接口上开放资源端口。
  • 从Azure Databricks到代理 VM 的网络路径:
    • Classic compute:在 Azure Databricks VNet 和代理集线器 VNet 之间进行对等互连。
    • 无服务器计算:使用云提供商的专用连接服务和具有专用终结点规则的网络连接配置(NCC)。
    • 这两种计算类型:配置这两个路径。

没有负载均衡器的单个代理 VM 足以进行开发和测试。

可选 (增加了高可用性和生产可靠性):

  • 用于冗余的其他代理 VM。
  • 前端代理 VM 的负载均衡器。 隧道发生故障时提供稳定的连接点和自动故障转移功能。
  • 每个代理 VM 上的 HTTP 运行状况检查服务。 这允许负载均衡器检测隧道级故障,而不仅仅是 VM 或端口可用性。

Azure Databricks建议此配置,但请根据环境和安全要求对其进行调整。

隧道代理中心

代理中心由以下组件组成。

  • 代理 VM (至少两个用于高可用性)。 每个代理 VM 运行三个服务:
    • sshd:SSH 守护程序接受来自本地隧道主机的传入反向隧道,并将隧道侦听器放置在localhost上(例如,localhost:13306用于 MySQL)。
    • socat:将 VM 的网络接口桥接到隧道侦听器(例如,NIC:3306 → localhost:13306),以便来自Azure Databricks的流量可以访问隧道终结点。
    • HTTP 运行状况检查服务:当隧道处于活动状态时返回 HTTP 200;当隧道不处于活动状态时返回 HTTP 503。 纯 TCP 探测仅检测 socat 是否正在侦听;即使 socat 仍在运行,应用程序级 HTTP 探测也会检测死隧道。
  • 负载均衡器
    • 前端:代理子网中的专用 IP。
    • 后端池:所有代理 VM。
    • 负载均衡规则:资源端口上的 TCP(例如,MySQL 端口 3306)。
    • 运行状况探测:对每个代理 VM 上的运行状况检查端点发起 HTTP GET 请求。 建议的起点是设置为间隔 5 秒,并在连续 2 次失败后将 VM 标记为不健康,然后根据您的恢复容忍度进行调整。
  • 专用连接服务(用于无服务器计算(必需)):附加到负载均衡器前端并附带专用 NAT 子网。 Azure使用专用链接服务(PLS)。
  • 本地隧道主机:每个代理 VM 运行一个 autossh 进程。 单个 autossh 连接支持多资源设置的多个 -R 端口转发(一个 SSH 连接、多个隧道)。 使用Restart=always的 systemd 服务。 交互式隧道在注销时终止,不适合生产。

配置 Azure Databricks

使用负载均衡器的前端 IP 地址连接到您的本地资源。 请选择您计算类型的选项卡。

注释

以下示例使用 MySQL。 对于其他数据库,请替换连接类型、端口和 JDBC 驱动程序 Maven 坐标。

经典计算

在连接之前,请确认代理中心 VNet 与 Azure Databricks 工作区 VNet 之间的对等互连已激活。 然后在连接配置中使用负载均衡器前端专用 IP:

CREATE CONNECTION mysql_onprem TYPE mysql
OPTIONS (
  host '<lb-frontend-ip>',
  port '3306',
  user '<db-user>',
  password '<db-password>'
);

CREATE FOREIGN CATALOG onprem_catalog
USING CONNECTION mysql_onprem
OPTIONS (database '<db-name>');

查询在共享访问模式下失败,因为类加载程序隔离会阻止执行程序访问基于 Maven 的 JDBC 驱动程序。 使用单用户访问模式验证驱动程序在整个群集中是否可用。 在创建连接之前,请将 JDBC 驱动程序添加到 Unity 目录允许列表:

ALTER METASTORE ADD ALLOWLIST maven ('mysql:mysql-connector-java:8.0.33');

无服务器计算

  1. 作为帐户管理员,请转到帐户控制台。

  2. 在边栏中,单击“ 安全性”。

  3. 单击 “网络连接配置 ”并为工作区区域创建 NCC。

  4. 在 NCC 中,添加专用终结点规则并输入服务资源 ID。

  5. 将 NCC 附加到工作区,等待 10-15 分钟进行传播。

  6. 在专用连接服务上批准专用终结点连接:

    az network private-link-service connection update \
      --service-name <pls-name> \
      --resource-group <rg> \
      --name "<connection-name>" \
      --connection-status Approved
    
  7. 使用专用终结点域创建连接:

    CREATE CONNECTION mysql_onprem_serverless TYPE mysql
    OPTIONS (
      host '<pe-domain>',
      port '3306',
      user '<db-user>',
      password '<db-password>'
    );
    

Azure Databricks UI 中的测试连接按钮不适用于专用终结点连接。 请跳过它并直接创建连接。

Lakeflow Connect CDC

Lakeflow Connect 网关在工作区 VNet 中的经典计算资源上运行,并通过对等关系到达代理虚拟机。 使用负载均衡器前端专用 IP 作为连接主机,而不是单个代理 VM 的 IP。 请参阅 高可用性和管道复原能力

在创建 CDC 管道之前,请完成数据库引擎的以下步骤:

  1. 启用更改日志记录:将数据库配置为记录行级更改(例如 MySQL 中的二进制日志记录、PostgreSQL 中的逻辑复制或 Oracle 中的补充日志记录)。

  2. 授予复制权限:向管道用户提供读取更改日志和执行快照所需的权限。 请参阅特定数据库的连接器文档。

  3. 设置日志保留:将日志保留期配置为至少七天。 如果 CDC 网关在日志过期时处于脱机状态,则管道必须对所有源表执行完整重新快照。

高可用性和管道复原能力

在后端池中使用两个或多个代理 VM 时,单个实例上的隧道故障不会中断服务。 如果隧道失败,运行状况检查服务将返回 HTTP 503。 然后,负载均衡器在大约 10 秒内停止将新连接路由到该 VM。

注释

在连接字符串中使用负载均衡器前端 IP,而不是单个代理 VM 的 IP。 如果隧道断开,负载均衡器会自动重新路由流量,而无需手动干预或管道停机。

失败方案 没有应用程序运行状况检查 附带应用程序健康检查
代理 VM 停止响应 负载均衡器检测到→故障转移 负载均衡器检测到→故障转移
端口转发器停止 负载均衡器检测到→故障转移 负载均衡器检测到→故障转移
SSH 隧道失败,端口转发器正在运行 负载均衡器无法检测到→间歇性故障 负载均衡器检测(HTTP 503)→故障转移

对于 Lakeflow Connect CDC 管道,请将二进制日志保留期设置为至少 7 天。 如果二进制日志过期时 CDC 网关处于脱机状态,则管道必须对所有源表执行完整重新快照。

已知的限制

此解决方案具有以下限制。

  • 每个本地资源都需要在每个代理 VM 上具有单独的端口映射。 对于同一默认端口上具有相同类型的多个资源,请在代理 VM 的网络接口(例如 3306、3307 或 3308)上使用不同的端口,或使用单独的代理 VM。
  • 必须预配和维护代理 VM 和本地隧道主机。
  • 负载均衡器阻止后端池中 VM 的默认出站 Internet 连接。 在将 VM 添加到池之前安装所需的包。
  • Azure Databricks UI 中的测试连接按钮不适用于专用终结点连接。
  • 在共享访问模式下,Maven JDBC 库仅在驱动程序节点上可用。 对 JDBC 工作负荷使用单用户访问模式。

后续步骤