📅 2025年2月11日

📦 ck版本 25.1.3.23

🏆 Clickhouse 的基础使用

1️⃣ 安装 ClickHouse

在安装之前需要准备一个 linux系统,可以使用云服务器、虚拟机或者 wsl等,我这里选择是 wslubuntu系统

可以查看本篇博客了解wsl:https://blog.tanc.fun:9999/archives/6fc7fa3e-0327-434f-ab41-c1f955a7de3b#Wsl

随后可以直接参照官网简单粗暴的来安装

🏢 官网地址: https://clickhouse.com/docs/zh/getting-started/install#deb%E5%AE%89%E8%A3%85%E5%8C%85

# 安装必要的工具和库,以支持从HTTPS源安装软件
sudo apt-get install -y apt-transport-https ca-certificates dirmngr

# 添加ClickHouse的GPG密钥,用于验证软件包的来源
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754

# 将ClickHouse的软件源添加到系统的APT源列表中
# 注意:这里的URL是ClickHouse的软件包仓库地址,但由于网络原因,可能无法正常解析
# 如果无法访问,请检查URL的合法性或尝试其他网络环境
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \
    /etc/apt/sources.list.d/clickhouse.list

# 更新APT的软件包索引,以便能够找到新添加的ClickHouse软件源中的软件包
sudo apt-get update

# 安装ClickHouse的服务器端和客户端软件包
sudo apt-get install -y clickhouse-server clickhouse-client

# 启动ClickHouse服务器服务
sudo service clickhouse-server start

# 使用ClickHouse客户端工具连接到服务器
# 如果设置了密码,可以使用 "clickhouse-client --password" 并输入密码
clickhouse-client

按照如上步骤 ClickHouse就安装好了,在安装过程中会提升你输入密码,随后就可以通过 clickhouse-client命令行进入了

⭐️ 目录结构

🅾️ 核心部分

  1. 服务端的配置文件: 包括了全局配置 config.xml和用户配置 user.xml
root@DESKTOP-HLBQNO4:/etc/clickhouse-server# ls
config.d  config.xml  users.d  users.xml
  1. 默认数据存储目录: /var/lib/clickhouse 但是一般会修改默认路径配置,将数据保存到大容量磁盘中去
  2. 默认保存日志的目录: /var/log/clikhouse-server

🅾️ 配置文件部分

  1. 文件的句柄数量配置: 这个配置也可以通过 config.xml文件的 max_open_files修改
root@DESKTOP-HLBQNO4:~# cat /etc/security/limits.d/clickhouse.conf
clickhouse      soft    nofile  1048576
clickhouse      hard    nofile  1
  1. 用户恢复因异常中断的ck服务进程的定时任务 /etc/cron.d/clickhouse-server (有些版本可能没有)

🅾️ 可执行文件

  1. clickhouse 主程序可执行文件
  2. clickhouse-client 客户端链接
  3. clickhouse-server 服务端启动
  4. clickhouse-compressor 内置压缩工具,用于数据的正压反解

有意思的是,这些可执行文件都指向于 clickhouse主程序可执行文件

root@DESKTOP-HLBQNO4:/usr/bin# ll |grep click
lrwxrwxrwx  1 root root           10 Feb  4 10:10 ch -> clickhouse*
lrwxrwxrwx  1 root root           10 Feb  4 10:10 chc -> clickhouse*
lrwxrwxrwx  1 root root           10 Feb  4 10:10 chl -> clickhouse*
-r-xr-xr-x  1 root root    562534496 Feb  4 10:10 clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-benchmark -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-client -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-compressor -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-disks -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-extract-from-config -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-format -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-git-import -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-keeper -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           10 Feb  4 10:12 clickhouse-keeper-client -> clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-keeper-converter -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-local -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-obfuscator -> /usr/bin/clickhouse*
lrwxrwxrwx  1 root root           19 Feb 10 22:13 clickhouse-server -> /usr/bin/clickhouse*

ClickHouse中,/usr/bin目录下的多个可执行文件(如 chchcchl等)通常都是指向 clickhouse主程序的符号链接。这是因为 ClickHouse的设计理念是将多个功能集成到一个统一的代码库中,而不是为每个功能单独提供一个二进制文件。以下是具体的原因:

1. 统一的代码库

ClickHouse的核心功能和逻辑都集中在 clickhouse主程序中。通过不同的命令行参数或运行环境(如服务模式、客户端模式等),clickhouse主程序可以切换到不同的功能模块。例如:

  • clickhouse-server用于启动ClickHouse服务器。
  • clickhouse-client用于与ClickHouse服务器进行交互的命令行工具。
  • clickhouse-benchmark用于性能测试。

这些功能模块实际上都是基于 clickhouse主程序的不同调用方式实现的。

2️⃣ 使用ck

ck底层支持 tcphttp,其中 tcp性能更好,默认端口为为9000,主要用于集权间的内部通信以及 CLI命令行;而 Http协议则拥有更好的兼容性,可以通过RESTFUL的形式被广泛用于编程语言,客户端接口为8123。

ck的非交互执行,可以用于批量处理支持导入导出 tsv文件或者 csv文件,而且支持一次性执行多个文件

⭐️ 客户端命令行参数

在交互式中执行的命令行参数会在 ~/.clickhouse-client-history 文件中显示

root@DESKTOP-HLBQNO4:~# cat ~/.clickhouse-client-history
### 2025-02-11 22:47:03.615
show databases;
### 2025-02-11 22:47:12.327
use system
### 2025-02-11 22:47:16.811
show tables;
### 2025-02-11 22:51:03.435
exit

以下是 ClickHouse客户端(clickhouse-client)的一些重要命令行参数及其演示命令:

1. 连接相关参数

  • --host-h:指定 ClickHouse服务器的主机名或IP地址。默认值是 localhost

    clickhouse-client --host=192.168.1.100
    
  • --port:指定 ClickHouse服务器的端口号。默认值是 9000

    clickhouse-client --port=9001
    
  • --user-u:指定连接 ClickHouse服务器的用户名。默认值是 default

    clickhouse-client --user=my_user
    
  • --password:指定连接 ClickHouse服务器的密码。默认为空字符串。

    clickhouse-client --password=my_password
    

2. 查询相关参数

  • --query-q:指定要执行的SQL查询语句。可以在命令行中直接执行查询,而无需进入交互式模式。

    clickhouse-client --query="SELECT * FROM my_table LIMIT 10"
    
  • --database-d:指定默认操作的数据库名称。默认值是服务端配置的默认数据库(通常是 default)。

    clickhouse-client --database=my_database --query="SHOW TABLES"
    
  • --format:指定查询结果的输出格式。可选项包括 Pretty(默认)、JSONCSV等。

    clickhouse-client --query="SELECT * FROM my_table LIMIT 10" --format=JSON
    

3. 其他常用参数

  • --multiline-m:允许多行语句查询(Enter仅代表换行,不代表查询语句完结)。

    clickhouse-client --multiline
    

    在交互式模式下,可以输入多行SQL语句,最后用 ;结束。

  • --time-t:在非交互模式下打印查询执行的时间到stderr中。

    clickhouse-client --time --query="SELECT * FROM my_table"
    
  • --stacktrace:如果指定,当出现异常时会打印堆栈跟踪信息。

    clickhouse-client --stacktrace --query="SELECT * FROM non_existent_table"
    
  • --multiquery-n:允许在非交互模式下执行多个查询,查询语句用分号分隔。

    clickhouse-client --multiquery --query="SELECT * FROM table1; SELECT * FROM table2"
    

4. 安全连接参数

  • --secure:通过安全连接(TLS/SSL)连接到 ClickHouse服务器。

    clickhouse-client --secure --host=192.168.1.100 --port=9000 --query="SELECT * FROM my_table"
    

5. 示例命令

以下是一些综合示例,展示如何使用上述参数:

  1. 连接到远程服务器并执行查询

    clickhouse-client --host=192.168.1.100 --port=9001 --user=my_user --password=my_password --query="SELECT * FROM my_table LIMIT 10"
    
  2. 执行多个查询并指定输出格式为JSON

    clickhouse-client --multiquery --format=JSON --query="SELECT * FROM table1; SELECT * FROM table2"
    
  3. 通过安全连接连接到远程服务器

    clickhouse-client --secure --host=192.168.1.100 --port=9001 --query="SELECT * FROM my_table"
    
  4. 在非交互模式下打印查询执行时间

    clickhouse-client --time --query="SELECT * FROM my_table"
    
  5. 进入交互式模式并指定默认数据库

    clickhouse-client --database=my_database
    

⭐️ 内置工具

clickhouse-locl

clickhouse-local可以独立运行大部分SQL查询,不需要依赖任 何 ClickHouse的服务端程序,它可以理解成是 ClickHouse服务的单 机版微内核,是一个轻量级的应用程序。clickhouse-local只能够使 用 File表引擎(关于表引擎的更多介绍在后续章节展开),它的数据 与同机运行的 ClickHouse服务也是完全隔离的,相互之间并不能访问

clickhouse-local是非交互式运行的,每次执行都需要指定数据 来源,例如通过 stdin标准输入,以 echo打印作为数据来源,注意需要使用 -e 选项解析换行符

root@DESKTOP-HLBQNO4:~# echo -e "1\n2\n3\n" | clickhouse-local -q "create table test_table (id Int64) ENGINE=File(CSV,stdin);select id from test_table"
1
2
3
0

还可以通过系统命令行来实现对内存用量的查询

ps aux | tail -n +2 | awk '{ printf("%s\t%s\n", $1, $4) }' | clickhouse-local -S "user String, memory Float64" -q "SELECT user, round(sum(memory), 2)  as memoryTotal FROM table GROUP BY user ORDER BY memoryTotal DESC FORMAT Pretty"
   ┏━━━━━━━━━━┳━━━━━━━━━━━━━┓
   ┃ user     ┃ memoryTotal ┃
   ┡━━━━━━━━━━╇━━━━━━━━━━━━━┩
1. │ clickho+ │          24 │
   ├──────────┼─────────────┤
2. │ root     │         3.3 │
   ├──────────┼─────────────┤
3. │ systemd+ │         0.5 │
   ├──────────┼─────────────┤
4. │ tanc     │         0.4 │
   ├──────────┼─────────────┤
5. │ syslog   │         0.1 │
   ├──────────┼─────────────┤
6. │ message+ │         0.1 │
   └──────────┴─────────────┘

解析一下

学习 linux命令可以查看博客:

https://blog.tanc.fun:9999/archives/1fbd47fc-e66a-4500-acaa-ad267d810efd

https://blog.tanc.fun:9999/archives/fbd21358-695c-46fe-a79c-e618dec16b99

ps aux | tail -n +2 | awk '{ printf("%s\t%s\n", $1, $4) }'

pa aux 查看进程 
tail -n +2 查看最后几行+2
打印输出 第一行和第四行,第一行为用户第四行为内存用量

核心参数如下:

(1) -S/--structure:表结构的简写方式,例如以下两种声明的 效果是相同的

#使用-S简写 
clickhouse-local -S "id Int64"  
#使用DDL  
clickhouse-local -q "CREATE TABLE test_table (id Int64) ENGINE = File(CSV,  stdin)"

(2)-N/--table:表名称,默认值是 table

clickhouse-local -S "id Int64" -N "test_table" -q "SELECt id FROM test_table"

(3)-if/--input-format:输入数据的格式,默认值是 TSV

root@DESKTOP-HLBQNO4:~# echo -e "1,2,3" | clickhouse-local -S "id Int64" --input-format "CSV" -N "test_table"
1       2       3

(4)-f/--file:输入数据的地址,默认值是 stdin标准输入。

(5)-q/--query:待执行的SQL语句,多条语句之间以分号间 隔。

clickhouse-benchmark

clickhouse-benchmark是基准测试的小工具,它可以自动运行 SQL查询,并生成相应的运行指标报告,例如执行下面的语句启动测试

root@DESKTOP-HLBQNO4:~# echo "SELECT * FROM system.numbers LIMIT 100" | clickhouse-benchmark -i 5  Loaded 1 queries --password=000000
Loaded 1 queries.

## 执行五次
Queries executed: 5.

## 指标信息
localhost:9000, queries: 5, QPS: 31.329, RPS: 3132.885, MiB/s: 0.024, result RPS: 3132.885, result MiB/s: 0.024.

## 各百分位的查询执行时间
0%              0.002 sec.
10%             0.002 sec.
20%             0.002 sec.
30%             0.002 sec.
40%             0.003 sec.
50%             0.003 sec.
60%             0.003 sec.
70%             0.003 sec.
80%             0.003 sec.
90%             0.003 sec.
95%             0.003 sec.
99%             0.003 sec.
99.9%           0.003 sec.
99.99%          0.003 sec.

可以指定多条SQL进行测试,此时需要将SQL语句定义在文件中

root@DESKTOP-HLBQNO4:/opt/ck# cat ck-muti
SELECT * FROM system.numbers LIMIT 100
SELECT * FROM system.numbers LIMIT 200

##执行
root@DESKTOP-HLBQNO4:/opt/ck# clickhouse-benchmark -i 5 --password=000000 < ./ck-muti
Loaded 2 queries.

Queries executed: 5 (250%).

localhost:9000, queries: 5, QPS: 31.276, RPS: 4378.675, MiB/s: 0.033, result RPS: 4378.675, result MiB/s: 0.033.

0%              0.002 sec.
10%             0.002 sec.
20%             0.002 sec.
30%             0.002 sec.
40%             0.002 sec.
50%             0.002 sec.
60%             0.002 sec.
70%             0.003 sec.
80%             0.003 sec.
90%             0.004 sec.
95%             0.004 sec.
99%             0.004 sec.
99.9%           0.004 sec.
99.99%          0.004 sec.

以下是 clickhouse-benchmark 命令行的参数作用及示例代码:

  1. --query=QUERY:指定要执行的查询语句。如果未指定,clickhouse-benchmark 会从标准输入读取查询。
  2. -c N, --concurrency=N:指定同时发送的查询数量(并发数)。默认值为 1。
  3. -d N, --delay=N:指定中间报告的时间间隔(秒)。设置为 0 可禁用报告。默认值为 1。
  4. -h HOST, --host=HOST:指定 ClickHouse 服务器的主机名或 IP 地址。默认值为 localhost
  5. -p N, --port=N:指定 ClickHouse 服务器的端口号。默认值为 9000。
  6. -i N, --iterations=N:指定查询的总执行次数。默认值为 0(无限循环)。
  7. -r, --randomize:如果有多个查询,以随机顺序执行。
  8. -s, --secure:使用 TLS 安全连接。
  9. -t N, --timelimit=N:指定时间限制(秒)。达到时间限制时停止发送查询。默认值为 0(禁用时间限制)。
  10. --confidence=N:指定 T 检验的置信水平。可能的值:0 (80%)、1 (90%)、2 (95%)、3 (98%)、4 (99%)、5 (99.5%)。默认值为 5。
  11. --cumulative:打印累计数据而不是每个时间间隔的数据。
  12. --database=DATABASE_NAME:指定 ClickHouse 数据库名称。默认值为 default
  13. --user=USERNAME:指定 ClickHouse 用户名。默认值为 default
  14. --password=PSWD:指定 ClickHouse 用户密码。默认值为空字符串。
  15. --stacktrace:输出异常的堆栈跟踪。
  16. --stage=WORD:指定查询处理的阶段。可能的值:completefetch_columnswith_mergeable_state。默认值为 complete
  17. --help:显示帮助信息。
  18. 单查询测试
echo "SELECT * FROM system.numbers LIMIT 10000000" | clickhouse-benchmark -i 10
  • 说明:执行 SELECT * FROM system.numbers LIMIT 10000000 查询 10 次。
  1. 多查询测试
cat <<EOF | clickhouse-benchmark -i 5
SELECT * FROM system.numbers LIMIT 10000000
SELECT 1
EOF
  • 说明:执行两个查询,每个查询执行 5 次。
  1. 并发测试
clickhouse-benchmark --query="SELECT * FROM system.numbers LIMIT 10000000" -c 5 -i 10
  • 说明:并发执行 5 个查询,总共执行 10 次。
  1. 时间限制测试
clickhouse-benchmark --query="SELECT * FROM system.numbers LIMIT 10000000" -t 60
  • 说明:执行查询,直到达到 60 秒的时间限制。
  1. 随机顺序执行查询
clickhouse-benchmark --query="SELECT * FROM system.numbers LIMIT 10000000" --query="SELECT 1" -i 10 -r
  • 说明:随机顺序执行两个查询,总共执行 10 次。
  1. 使用 TLS 安全连接
clickhouse-benchmark --query="SELECT * FROM system.numbers LIMIT 10000000" -s --host=clickhouse-server --port=9001
  • 说明:通过 TLS 安全连接到 clickhouse-server,端口号为 9001。
  1. 输出 JSON 格式结果
clickhouse-benchmark --query="SELECT * FROM system.numbers LIMIT 10000000" --json=output.json
  • 说明:将测试结果输出到 output.json 文件中。