【问题标题】:HAProxy settings for connecting to Snowflake Data用于连接雪花数据的 HAProxy 设置
【发布时间】:2020-01-31 03:42:00
【问题描述】:

我一直在尝试使用 ODBC 驱动程序通过代理连接到 Snowflake,但到目前为止还无法连接。我正在使用 HAProxy 来执行此操作。

这是来自odbc.ini,我在那里配置了我的 DSN:

[ODBC Data Sources]
SnowflakeDSII = Snowflake

[SnowflakeDSII]
Server = <account>.<region>.snowflakecomputing.com
Port = 443
UID = <username>
PWD = <password>
Schema =
Warehouse =
Driver = /opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib
Description = Snowflake DSII
Locale = en-US
Tracing = 0
proxy = http://127.0.0.1:8000

这是我的 HAProxy 配置:

global
  log stdout format raw local0 info

defaults
  log global
  # timeouts
  timeout connect 3600s
  timeout client 3600s
  timeout server 3600s
  maxconn 4000

frontend snowflake_proxy
  mode tcp
  option tcplog

  bind 0.0.0.0:8000
  default_backend snowflake

backend snowflake
  mode tcp
  option tcp-check
  server server0 <account>.<region>.snowflakecomputing.com:443 check

在运行 iodbctest 时,我看到了这个错误:

OOB curl_easy_perform() failed: Failure when receiving data from the peer
1: SQLDriverConnect = [Snowflake][Snowflake] (4)
      REST request for URL https://<account>.<region>.snowflakecomputing.com:443/session/v1/login-request?requestId=0fe536ed-4d6c-4858-b468-52a6757248a7&request_guid=5477913c-989a-4da3-bbbc-b62a68391749 failed: CURLerror (curl_easy_perform() failed) - code=56 msg='Failure when receiving data from the peer' osCode=36 osMsg='Operation now in progress'.
     (4) SQLSTATE=HY000
1: ODBC_Connect = [Snowflake][Snowflake] (4)
      REST request for URL https://<account>.<region>.snowflakecomputing.com:443/session/v1/login-request?requestId=0fe536ed-4d6c-4858-b468-52a6757248a7&request_guid=5477913c-989a-4da3-bbbc-b62a68391749 failed: CURLerror (curl_easy_perform() failed) - code=56 msg='Failure when receiving data from the peer' osCode=36 osMsg='Operation now in progress'.
     (4) SQLSTATE=HY000

我还尝试将 HAProxy 配置为仅充当简单的 HTTP 代理。这是我的 HAProxy 配置:

global
  log stdout format raw local0 info

defaults
  log global
  # timeouts
  timeout connect 3600s
  timeout client 3600s
  timeout server 3600s
  maxconn 4000

frontend snowflake_proxy
  mode http
  option httplog

  bind 0.0.0.0:8000
  default_backend snowflake

backend snowflake
  mode http
  option http-server-close
  option http_proxy

使用上面的 HAProxy 配置,我看到了这个错误:

OOB curl_easy_perform() failed: Failure when receiving data from the peer
1: SQLDriverConnect = [Snowflake][Snowflake] (4)
      REST request for URL https://<account>.<region>.snowflakecomputing.com:443/session/v1/login-request?requestId=01ccf8d9-895b-47d1-9102-41f7524ec436&request_guid=773e75b3-9137-4862-a5e1-3bf49e076a1d failed: CURLerror (curl_easy_perform() failed) - code=56 msg='Failure when receiving data from the peer'.
     (4) SQLSTATE=HY000
1: ODBC_Connect = [Snowflake][Snowflake] (4)
      REST request for URL https://<account>.<region>.snowflakecomputing.com:443/session/v1/login-request?requestId=01ccf8d9-895b-47d1-9102-41f7524ec436&request_guid=773e75b3-9137-4862-a5e1-3bf49e076a1d failed: CURLerror (curl_easy_perform() failed) - code=56 msg='Failure when receiving data from the peer'.
     (4) SQLSTATE=HY000

来自 HAProxy 的日志:

127.0.0.1:64824 [31/Jan/2020:13:28:19.888] snowflake_proxy snowflake/<NOSRV> -1/-1/-1/-1/0 400 211 - - PR-- 1/1/0/0/3 0/0 "CONNECT <account>.<region>.snowflakecomputing.com:443 HTTP/1.1"
127.0.0.1:64825 [31/Jan/2020:13:28:21.890] snowflake_proxy snowflake/<NOSRV> -1/-1/-1/-1/0 400 211 - - PR-- 1/1/0/0/3 0/0 "CONNECT <account>.<region>.snowflakecomputing.com:443 HTTP/1.1"
127.0.0.1:64826 [31/Jan/2020:13:28:25.894] snowflake_proxy snowflake/<NOSRV> -1/-1/-1/-1/0 400 211 - - PR-- 1/1/0/0/3 0/0 "CONNECT <account>.<region>.snowflakecomputing.com:443 HTTP/1.1"
127.0.0.1:64829 [31/Jan/2020:13:28:33.898] snowflake_proxy snowflake/<NOSRV> -1/-1/-1/-1/0 400 211 - - PR-- 1/1/0/0/3 0/0 "CONNECT <account>.<region>.snowflakecomputing.com:443 HTTP/1.1"
127.0.0.1:64830 [31/Jan/2020:13:28:33.903] snowflake_proxy snowflake/<NOSRV> -1/-1/-1/-1/0 400 211 - - PR-- 1/1/0/0/3 0/0 "CONNECT sfctest.client-telemetry.snowflakecomputing.com:443 HTTP/1.1"

有没有人幸运地做过类似的事情?您能否分享一下您的 HAProxy 配置的相关部分?

【问题讨论】:

标签: haproxy snowflake-cloud-data-platform


【解决方案1】:

由于需要在代理上配置 SSL 直通,HAProxy 可能很难配置并用作 Snowflake 的 ODBC 驱动程序的转发代理。

原因写在this SO answer:

我抓包,使用代理访问一个https网站,curl会启动一个HTTP CONNECT方法建立隧道。隧道应该在 curl 客户端和代理之间,但 TCP 代理会将所有消息传递到 Web 服务器,因此 Web 服务器会重置连接。

转发代理不应该只是在客户端和 Web 服务器之间传递消息。它应该理解 HTTP CONNECT 方法

在进行 SSL 直通时,HAProxy 的行为类似于 TCP 代理,因此不会解析底层消息。但是,它需要先设置隧道,然后再进行设置,这需要响应 HTTP CONNECT 方法。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2022-08-14
    • 2023-03-22
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2019-06-18
    相关资源
    最近更新 更多