Mac 使用 Docker-compose 安装部署 Clickhouse 的经验和问题

本贴最后更新于 399 天前,其中的信息可能已经渤澥桑田

最近尝试在 Macbook 上部署 Clickhouse 学习使用,在此记录下相关经验和问题

安装部署

Clickhouse 主要针对 Linux 系统进行开发,尽管也有针对 Mac OS 的安装包,但官方文档中说不推荐使用。因此,为了最接近原生 Linux 版本的 Clickhouse 运行的效果,尝试使用 Docker 进行部署安装。

可以按照 Clickhouse 中 Docker hub 上的官方文档:clickhouse/clickhouse-server - Docker Image | Docker Hub 执行 docker run 命令来进行安装。但为了避免输入一长串 Docker 容器的启动命令,同时方便之后修改容器相关配置,我个人更偏好使用 Docker-compose 启动容器。具体的 docker-compose.yml 文件内容为:

version: '2'
services:
  clickhouse-server:
    image: clickhouse/clickhouse-server
    container_name: clickhouse-server
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    ports:
      - 8123:8123
      - 9000:9000
      - 9004:9004
    volumes:
      - /etc/localtime:/etc/localtime
      - ./ch_data:/var/lib/clickhouse/
      - ./ch_logs:/var/log/clickhouse-server/
      - ./user:/root/data/
    restart: always
    mem_limit: 2048m

Docker-compose.yml 参数分析

接下来一个个对参数进行分析:

  • ulimits 是用于控制 shell 程序的资源限制的命令,由于在官方 Docker 文档中的启动命令加了该参数,所以这里也加上了。个人理解去掉这个参数也问题不大
  • 端口
    • 8123 端口是 clickhouse 提供的 http 协议端口,第三方的数据库管理工具如 DBeaver 在连接 clickhouse 时使用的就是该端口号
    • 9000 端口是 clickhouse 原生连接工具使用的 TCP 协议端口,理论上使用该端口进行数据库连接的性能应该优于 8123 端口,但目前官方并没有给出在该端口上规范的协议定义,因此实际上只有 clickhouse 自己的原生连接工具支持该端口。这里开放该端口的原因是,如果本地下载了官方提供的二进制包,可以在不启动服务端(clickhouse-server)的情况下,只使用里面的客户端工具(clickhouse-client)连接到 Docker 中的服务端。个人测试过直接使用 clickhouse-client 导入较大的 csv 数据时的速度优于在 DBeaver 中导入相同的数据,且 clickhouse-client 中可以在线读取一个较大数据集并导入(即官方文档中的英国房地产支付价格),且中途不会报超时,而我在 DBeaver 中执行相同的导入命令时,过了一会儿就报超时并且停止了导入操作。
    • 9004 端口是 Clickhouse 提供的模拟 MySQL 协议的端口,官方文档中声称可以使用在该端口上使用 MySQL 协议连接到 Clickhouse 数据库。开放该端口主要是测试一下是不是真的能实现用 MySQL 连接工具访问 Clickhouse
  • volumes
    • /etc/localtime 用于将本地时区和 Docker 内的时区同步,要不然可能会出现不可预料的错误
    • /var/lib/clickhouse/是 clickhouse 存储数据的地方,挂载到宿主机后,即便容器被删除,下次重新启动里面的数据依然存在
    • /var/log/clickhouse-server/是 clickhouse 存放日志文件的地方,可以查看其中的日志文件进行分析错误等操作
    • 最后/root/data/是我自己为了方便 Docker 内读取宿主机文件创建的目录,只要直接把文件放在./user 文件夹下,在 Docker 容器内就可以访问到
  • restart:设置下次启动 Docker 时自动启动该容器
  • mem_limit:给该容器分了 2G 内存。因为 Clickhouse 非常吃 CPU 和内存资源,而我只是学习使用,不太希望它占用过多的资源导致我其他应用运行不了,因此限制了内存使用量

    测试数据导入和查询操作

在 docker-compose.yml 对应的目录下执行 docker-compose up 即可启动 clickhouse 容器。该 clickhouse 容器的默认用户名是 default,密码为空。

为了测试 clickhouse 对数据的处理能力,我根据官方文档中提供的蜂窝信号塔数据使用方法,首先创建了相关表,之后下载了 csv 数据,并将它放到宿主机中和 docker-compose.yml 文件同个目录的./user 目录下,再使用 docker exec -it clickhouse-server bash 命令进入容器,到/root/data 文件夹下执行命令:clickhouse-client --query "INSERT INTO cell_towers FORMAT CSVWithNames" < cell_towers.csv。成功导入数据。

之后可以在 clickhouse-client 里面执行文档中后续的 SQL 语句查看结果,但为了更方便后续管理,我在 DBeaver 工具中执行查询语句。如查询各个移动国家代码(MCC)对应的蜂窝信号塔数量:
截屏 2023112720.49.11.png
个人感觉查询速度确实非常快

测试使用 MySQL 协议访问

之后为了验证是否真的可以使用 MySQL 客户端工具来在 9004 端口上连接 Clickhouse,我尝试了多种工具。

首先依然是 DBeaver,尝试直接在 9004 端口上创建一个 MySQL 连接,但是报错了:截屏 2023112720.51.56.png

之后是 MySQL 官方的图形化管理工具 MySQL Workbench,同样也报错:截屏 2023112720.52.56.png

这时候我感觉已经希望不大了,抱着最后试一试的心情,根据 Clickhouse 官方文档中的方法直接使用本地 MySQL 的命令行客户端连接:mysql --protocol tcp -u default -P 9004
结果竟然成功了:截屏 2023112720.57.26.png

这说明在使用特定工具的情况下用 MySQL 协议直接访问 Clickhouse 确实是可行的。

趁热打铁,我又使用 pymysql 工具尝试连接 Clickhouse,代码如下:

import pymysql.cursors

# Connect to the database
connection = pymysql.connect(host='localhost',
                             port=9004,
                             user='default',
                             password='',
                             database='default',
                             cursorclass=pymysql.cursors.DictCursor)

with connection:
    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT avg(samples) FROM cell_towers"
        cursor.execute(sql)
        result = cursor.fetchone()
        print(result)

结果是令人欣喜的,确实可以输出结果:截屏 2023112721.03.08.png
这表明可以在不添加额外工具的情况下,直接使用 pymysql 访问 clichouse 数据库进行数据分析操作

问题

在 clickhouse 的 Docker hub 文档中,提到可挂载的目录除了我在上面提到的,还包括:

  • /etc/clickhouse-server/config.d/*.xml - files with server configuration adjustmenets 存服务端的配置文件
  • /etc/clickhouse-server/users.d/*.xml - files with user settings adjustmenets 存用户设置信息
  • /docker-entrypoint-initdb.d/ - folder with database initialization scripts (see below). 存启动脚本

最后一个启动脚本我没试,因为我也不打算修改。我尝试挂载前面的配置文件目录和用户设置目录,具体方法是在 docker-compose.yml 的 volumes 部分增加配置项,变为:

volumes:
  - /etc/localtime:/etc/localtime
  - ./ch_data:/var/lib/clickhouse/
  - ./ch_logs:/var/log/clickhouse-server/
  - ./user:/root/data/
  - ./ch_config:/etc/clickhouse-server/config.d/
  - ./ch_usersetting:/etc/clickhouse-server/users.d/

但启动容器后在宿主机上查看对应的配置文件和用户设置目录里面内容都是空的,这导致我没法修改这些配置信息,只能使用 clickhouse 的默认配置。如果有大佬知道如何成功挂载这些配置文件并修改,还请多多指教,在此先谢谢了!

  • ClickHouse
    16 引用 • 1 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 927 回帖
  • 数据分析
    11 引用 • 8 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    692 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...