写点什么

大数据 -135 ClickHouse 集群连通性自检 + 数据类型避坑实战|10 分钟跑通 ON CLUSTER

作者:武子康
  • 2025-10-26
    山东
  • 本文字数:3400 字

    阅读完需:约 11 分钟

大数据-135 ClickHouse 集群连通性自检 + 数据类型避坑实战|10 分钟跑通 ON CLUSTER

TL;DR

  • 场景:三节点集群已安装完毕,如何 10 分钟内验证连通 / 复制 / 分片 / 分布式查询都正常?

  • 结论:按本文 SOP,一条脚本跑完连通性检查 → 创建 ReplicatedMergeTree/Distributed → 跨分片写读压测。

  • 产出:cluster_check.sql(系统表体检)、ddl_on_cluster.sql(建表)、mini_bench.sql(压测)。



版本矩阵

最小可运行示例

# 连接任意节点(请改为你的主机/端口/口令)clickhouse-client -m \  --host <node1> --port 9000 \  --user <user>  --password <password>
复制代码


-- 1) 集群视图应返回3行(3分片×1副本)SELECT cluster, shard_num, replica_num, host_name, host_address, portFROM system.clustersWHERE cluster = 'perftest_3shards_1replicas'ORDER BY shard_num, replica_num;
-- 2) 基本连通(每节点自报家门)SELECT hostName() AS node, version() AS ch_version;
-- 3) 复制表 & 分布式表(一次性在全集群创建)CREATE DATABASE IF NOT EXISTS demo ON CLUSTER perftest_3shards_1replicas;
CREATE TABLE demo.events ON CLUSTER perftest_3shards_1replicas( id UUID, ts DateTime, v Decimal(18,4))ENGINE = ReplicatedMergeTree( '/clickhouse/tables/{shard}/demo.events','{replica}')PARTITION BY toYYYYMM(ts)ORDER BY (ts, id);
CREATE TABLE demo.events_all ON CLUSTER perftest_3shards_1replicasAS demo.eventsENGINE = Distributed(perftest_3shards_1replicas, demo, events, rand());
-- 4) 写入100k 行到分布式表(随机打到各分片)INSERT INTO demo.events_allSELECT generateUUIDv4(), now(), number/10.0FROM numbers(100000);
-- 5) 快速校验:各分片行数分布SELECT hostName() AS node, count() AS cntFROM demo.eventsGROUP BY nodeORDER BY node;
-- 6) 跨分片聚合(验证分布式查询)SELECT toStartOfMinute(ts) AS m, sum(v) AS s, count() cFROM demo.events_allGROUP BY mORDER BY m DESCLIMIT 5;
复制代码

测试连接

clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password clickhouse@wzk.icu
复制代码


如果可以从 122 连接到 121 说明你的服务已经搭建好了。你可以测试以下,是否三台节点之间都是互通的,确保服务和服务之间一切正常,方便我们后续的学习研究。


检验集群

任意连接一个节点,我们进行测试

h121

clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password clickhouse@wzk.icu
复制代码


SELECT * FROM system.clusters WHERE cluster = 'perftest_3shards_1replicas';
复制代码


h122

clickhouse-client -m --host h122.wzk.icu --port 9001 --user default --password clickhouse@wzk.icu
复制代码


h123

clickhouse-client -m --host h123.wzk.icu --port 9001 --user default --password clickhouse@wzk.icu
复制代码


数据类型

简单介绍

ClickHouse 作为一个面向 OLAP 场景的高性能列式数据库,在数据处理语言(DML)支持方面有其独特的设计。与传统的关系型数据库不同,ClickHouse 通过以下特性来优化数据处理性能:


  1. 复合数据类型支持

  2. 提供 Array、Tuple、Nested 等复合数据类型

  3. 支持 Map、JSON 等半结构化数据格式

  4. 例如:Array(String)可以存储字符串数组,Tuple(Int32, String)可以存储不同类型的组合数据

  5. 数据修改操作的实现

  6. Update 和 Delete 操作是通过 ALTER TABLE 语句的变种实现的

  7. 例如:ALTER TABLE table_name DELETE WHERE condition

  8. 又如:ALTER TABLE table_name UPDATE column=value WHERE condition

  9. 这种设计避免了传统数据库的锁机制,提高了批量操作的效率

  10. 性能优化特点

  11. 采用批量处理而非单行操作

  12. 适合大批量数据的分析场景

  13. 通过 MergeTree 引擎实现高效的数据修改

  14. 修改操作是异步执行的,会生成新的数据部分(part)而非原地修改


这种设计使 ClickHouse 在保持高性能的同时,也能支持必要的数据修改操作,特别适合数据仓库和分析型应用场景。

启动测试

我这里采用了 h121 机器的服务,当然如果你使用别的机器的服务也可以。


clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password clickhouse@wzk.icu
复制代码

整型

固定长度的整型,包括有符号整型,和无符号整型。




SELECT 255;SELECT -128;
复制代码


执行的结果截图如下图:


浮点型


建议尽可能以整数形式存储数据,例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型计算行为可能引起四舍五入的误差。


SELECT 1-0.9;SELECT 1/0;SELECT 0/0;
复制代码


执行的结果如下图:


Decimal

如果要求更高精度,可以选择 Decimal 类型,格式:Decimal(P,S)


  • P:代表精度,决定总位数(正数部分+小数部分),取值 0-38

  • S:代表规模,决定小数位数,取值范围是 0-P


ClickHouse 对 Decimal 提供三种简写:


  • Decimal32

  • Decimal64

  • Decimal128

相加、减精度取大

SELECT toDecimal32(2, 4) + toDecimal32(2, 2);SELECT toDecimal32(4, 4) + toDecimal32(2, 2);
复制代码


运行结果的截图如下图所示:


相乘精度取和

SELECT toDecimal32(2, 2) * toDecimal32(4, 4)
复制代码


运行结果的截图如下图所示:


相除精度取被除数

SELECT toDecimal32(4, 4) / toDecimal32(2, 2)
复制代码


运行结果的截图如下图所示:


字符串

String

字符串可以任意长度,它可以包含任意的字符集,包含空字节。

FixedString(N)

固定长度为 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。当服务端读取长度小于 N 的字符串的时候,将返回错误。


SELECT toFixedString('abc', 5), LENGTH(toFixedString('abc', 5)) AS LENGTH;
复制代码


执行结果如下图:


UUID

ClickHouse 将 UUID 这种在传统数据库中充当主键的类型直接做成了数据类型

创建新表

CREATE TABLE UUID_TEST(  `c1` UUID,  `c2` String)ENGINE = memory;
复制代码


执行结果如下图:


插入数据

INSERT INTO UUID_TEST SELECT generateUUIDv4(), 't1';INSERT INTO UUID_TEST(c2) VALUES('t2');
复制代码


执行结果如下图:


查询结果

SELECT * FROM UUID_TEST;
复制代码


执行结果如下图:


枚举类型

包括 Enum8 和 Enum16 类型,保存 string = integer 的对应关系。Enum8 用 String = Int8 对描述 Enum16 用 String = Int16 对描述。

创建新表

CREATE TABLE t_enum (  x Enum8('hello' = 1, 'word' = 2)) ENGINE = TinyLog;
复制代码


执行结果如下所示:



注意:这个列 x 只能存储定义列出的值,“Hello” 或者 “world”,如果插入其他值则会报错。

插入数据

INSERT INTO t_enum VALUES ('hello'), ('word'), ('hello');
复制代码


执行结果如下图:


查询数据

SELECT * FROM t_enum;
复制代码


如果需要看到对应行的数值,则必须将 Enum 转换为整数类型。


SELECT CAST(x, 'Int8') FROM t_enum;
复制代码


执行结果如下图:


数组

Array(T):由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型,但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能再 MergeTree 表中存储多维数组。

创建数组

SELECT array(1, 2.0) AS x, toTypeName(x);SELECT [1, 2] AS x, toTypeName(x);
复制代码


执行结果如下图:



如果是声明字段的时候,则需要指明数据类型:


CREATE TABLE Array_test (  `c1` Array(String)) ENGINE = Memory;
复制代码

元组

Tuple(T1,T2):元组,每个元素都有单独的类型。创建元组的示例:


SELECT tuple(1, 'a') AS x, toTypeName(x);
复制代码


执行的结果如下图:



注意:在定义表字段的时候也需要指明数据类型。

Date、DateTime

日期类型、用两个字节存储,表示 1970-01-01 (无符号)到当前的日期值。

布尔型

没有单独的类型来存储布尔值,可以使用 UInt8 类型,取值限制为 0 或 1。

错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-154 深入浅出 MongoDB 用 Java 访问 MongoDB 数据库 从环境搭建到 CRUD 完整示例 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 刚刚阅读数: 3
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-135 ClickHouse 集群连通性自检 + 数据类型避坑实战|10 分钟跑通 ON CLUSTER_大数据_武子康_InfoQ写作社区