【问题标题】:Issue connecting to Dockerized Clickhouse Server with Python driver使用 Python 驱动程序连接到 Dockerized Clickhouse 服务器的问题
【发布时间】:2020-01-06 18:28:34
【问题描述】:

我在使用 python 驱动程序连接到 windows docker 容器中的 clickhouse 时遇到问题。 Clickhouse 服务器在我的 E 驱动器上运行在暴露于端口 8123 的 docker 容器中。我可以在 R 中使用这个包https://github.com/hannesmuehleisen/clickhouse-r 轻松连接:

conn = DBI::dbConnect(clickhouse::clickhouse(), 
              host = "my_ip", 
              port = 8123L,
              user = "myun",
              password = "mypwd")

但是当我在 python 中使用 https://clickhouse-driver.readthedocs.io/en/latest/quickstart.html 尝试同样的事情时,我遇到了一个问题:

from clickhouse_driver import Client
client = Client(host = 'my_ip',
                port = '8123',
                user='myun',
                password='mypwd',
                secure=True,
                verify=False,
                database='db_name')

print(client.execute('SELECT now()'))

File "d:\ProgramData\Anaconda3\lib\site-packages\clickhouse_driver\connection.py", line 249, in connect
    '{} ({})'.format(e.strerror, self.get_description())

NetworkError: Code: 210. [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777) (my_ip:8123)

有人知道可能是什么问题吗?

更新

尝试安全 = F 并得到:

  File "d:\ProgramData\Anaconda3\lib\site-packages\clickhouse_driver\connection.py", line 243, in connect
    '{} ({})'.format(e.strerror, self.get_description())

SocketTimeoutError: Code: 209. None

【问题讨论】:

  • 你试过secure=False吗?
  • 尝试并收到此错误:文件“d:\ProgramData\Anaconda3\lib\site-packages\clickhouse_driver\connection.py”,第 243 行,连接“{} ({})”。格式(e.strerror,self.get_description())SocketTimeoutError:代码:209。无
  • 你确定 my_ip 相同并且属于运行 clickhouse-server 的 docker 容器吗?在您运行 python 代码的主机上显示 telnet my_ip 8123ping my_ip 什么?
  • 是的,它是相同的 IP 地址,因为当我在 R 中运行相同的连接时,它可以工作。我还使用该 IP 地址从浏览器访问服务器 my_ip:8123

标签: python docker clickhouse


【解决方案1】:

ClickHouse 服务器和客户端之间的通信有两种协议:http(端口 8123)和本地(端口 9000)。

Http 适用于 curl/wget 等工具。大多数 ClickHouse 客户端使用 http 进行数据传输。在你的情况下包括 R。但是有些客户端使用本机协议(go 和这个 python 客户端)。该协议应该比 http 更有效。 https://clickhouse-driver.readthedocs.io/en/latest/#user-s-guide

从服务器容器中公开端口 9000 并在客户端中使用它。此端口也是此客户端的默认端口。

【讨论】:

    【解决方案2】:

    让我们分别考虑不安全和安全通信:


    TCP(非安全通信)

    • clickhouse-driver 通过9000-port 上的本机协议与 ClickHouse 服务器通信
    • docker 容器应该将 9000 端口发布到主机
    docker run -d -p 9000:9000 --ulimit nofile=262144:262144 yandex/clickhouse-server
    
    • 应用代码
    client = Client(host='localhost',
                    port='9000', # this param can be missed because port 9000 is used by default
                    # ..
                    database='test')
    

    TCP(安全通信)

    • clickhouse-driver 通过9440-port 上的本机协议与 ClickHouse 服务器通信
    • docker 容器应该将 9440 端口发布到主机
    docker run -d -p 9440:9440 --ulimit nofile=262144:262144 yandex/clickhouse-server
    
    • 配置 ClickHouse

    在容器上执行交互式bash-shell:

    docker exec -it {CONTAINER_ID} bash
    

    在容器内进行所需的更改:

    apt-get update
    
    # modify config-file
    apt-get install nano
    # uncomment the '<tcp_port_secure>'-section in config-file & save changes
    nano /etc/clickhouse-server/config.xml
    
    # generate a self-signed certificate & 'dhparam.pem'-file
    apt-get install openssl
    
    openssl req -subj "/CN=my.host.name" -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout /etc/clickhouse-server/server.key -out /etc/clickhouse-server/server.crt
    
    openssl dhparam -out /etc/clickhouse-server/dhparam.pem 512 # 4096
    
    # set required access mode to 'server.key'-file
    chmod 644 /etc/clickhouse-server/server.key
    
    # exit from interactive mode
    exit
    

    重启容器:

    docker restart {CONTAINER_ID}
    
    • 应用代码
    client = Client(host='localhost',
                    port='9440', # this param can be missed because port 9440 is used by default
                    secure=True,
                    verify=False,
                    # ..
                    database='test')
    

    备注:

    • Docker 容器内的 SSL 手动配置仅用于测试。最好将所需的 SSL 文件和 config.xml 挂载到容器或创建具有所需更改的自定义 Docker 映像
    • 请参阅Altinity - ClickHouse Networking, Part 2-article 以深入了解 SSL 配置

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2015-07-21
      • 2020-11-19
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多