腾讯云数据仓库TCHouse-C对接使用完全指南:从集群创建到实时分析
1. TCHouse-C:重新定义云原生实时数仓
在数据驱动决策的时代背景下,企业对于海量数据的实时分析能力提出了越来越高的要求。传统数据仓库在面对PB级数据规模和毫秒级查询延迟的双重挑战时,往往显得力不从心。腾讯云数据仓库TCHouse-C的诞生,正是为了破解这一困局。
腾讯云数据仓库TCHouse-C是基于开源OLAP引擎ClickHouse打造的企业级云数据仓库服务。它与开源版ClickHouse内核完全兼容,这意味着任何在开源ClickHouse上运行的SQL语句和业务逻辑,都可以零成本地迁移到TCHouse-C上运行。同时,TCHouse-C在云端场景下对易用性、安全性和稳定性进行了深度增强。
从架构上看,TCHouse-C集群由三个核心层组成:接入层通过负载均衡(CLB)提供统一的集群访问地址;计算层由多个分片组成,每个分片包含1到2个副本节点,负责数据的存储与并行计算;协调层使用3节点ZooKeeper或ClickHouse Keeper集群负责分布式协调,包括副本同步、DDL管理和Leader选举。这种分层架构确保了系统的高可用性和可扩展性。
在核心技术层面,TCHouse-C采用了列式存储加向量化执行引擎的设计,能够充分利用现代CPU的SIMD指令集。配合MPP分布式架构,查询可以自动分发到所有分片并行执行。智能索引(包括主键排序和跳数索引)能够精准定位目标数据块,有效避免全表扫描。这些技术组合使得TCHouse-C的单个查询峰值扫描速度可达每秒数TB,查询性能最高可达传统行式数据仓库的10倍以上。
在成本方面,ClickHouse的列式压缩算法(LZ4/ZSTD)可实现高达10:1的数据压缩比,10TB原始数据仅占约1TB磁盘空间。加上全托管架构无需配备专职DBA、支持按量计费和弹性伸缩等特性,综合使用成本可比传统方案降低50%以上。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
2. 集群创建与配置详解
2.1 创建集群
登录腾讯云数据仓库TCHouse-C控制台后,单击新建集群即可进入购买页面。在配置集群时,需要重点关注以下几个核心参数:
计费模式:支持包年包月和按量计费两种模式。包年包月适合长期稳定运行的 production 环境;按量计费适合短期项目或测试场景,按实际使用量每小时结算。
地域与可用区:目前TCHouse-C支持北京、成都、广州、南京、上海、上海金融、中国香港以及新加坡、法兰克福、硅谷等多个地域。建议按业务就近原则选择,地域一旦选定购买后无法更改。
网络:集群部署在用户VPC内,通过安全组精细控制访问权限。需要选择或新建VPC网络和子网。
高可用模式:高可用模式下每个分片有两个副本,建议生产环境务必选择。非高可用模式每个分片仅有一个副本,节点故障会导致整个集群不可用,仅适合开发测试环境。
计算节点类型:提供标准型、高性能型和大存储型三种。标准型支持挂载增强型SSD云硬盘,支持独立扩容,适合大多数分析场景;高性能型搭载NVMe SSD本地盘,提供更高I/O性能,适合对延迟极敏感的高频查询;大存储型搭载大容量HDD本地盘,适合海量冷数据存储和日志归档。规格越大性能越好,可根据实际需求选择。
Zookeeper节点:TCHouse-C使用3节点ZooKeeper或ClickHouse Keeper集群负责分布式协调。Zookeeper节点的负载需和集群规模成正比。
集群创建后,最快5分钟即可就绪,远快于自建ClickHouse需要数小时到数天的部署时间。
2.2 查看与管理集群
集群创建完成后,在控制台集群列表中选择对应集群,单击集群ID或名称即可进入集群详情页。在详情页可以查看集群基本信息、监控数据、进行参数配置、查看操作记录等。
TCHouse-C支持灵活的弹性伸缩能力:水平扩展可增加分片数量,线性提升存储容量和并行计算能力;垂直升配可提升单节点CPU和内存规格;存储独立扩容可在不改变计算规格的情况下调整云硬盘容量;业务低谷期还可缩容节点以降低成本。
3. 连接TCHouse-C的多种方式
TCHouse-C提供了多种接入方式,以适应不同的使用场景和开发语言。接入层提供三个核心端口:TCP端口9000用于ClickHouse原生协议,适用于clickhouse-client及各语言SDK;MySQL端口9004允许使用标准MySQL命令行工具或编程语言的MySQL驱动来查询ClickHouse;HTTP端口8123适用于REST调用和JDBC/ODBC连接。
3.1 使用clickhouse-client命令行工具
clickhouse-client是最直接的操作方式,适合运维人员和DBA进行日常管理和查询。连接命令的基本格式如下:
clickhouse-client --host <集群内网地址> --port 9000 --user <用户名> --password <密码>在TCHouse-C集群内直接输入clickhouse-client命令即可连接。连接成功后可以通过quit命令退出。
3.2 使用JDBC驱动连接
对于Java开发者,可以使用ClickHouse官方JDBC驱动连接TCHouse-C。JDBC连接串的典型形式为:
jdbc:clickhouse://<host>:<port>/<database>?param1=value1¶m2=value2以下是完整的Java JDBC连接示例代码:
import java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport java.sql.Statement;\n\npublic class TCHouseCJDBCDemo {\n public static void main(String[] args) {\n String url = \"jdbc:clickhouse://<集群内网地址>:8123/default\";\n String user = \"<用户名>\";\n String password = \"<密码>\";\n \n try (Connection conn = DriverManager.getConnection(url, user, password);\n Statement stmt = conn.createStatement()) {\n \n stmt.execute(\"CREATE TABLE IF NOT EXISTS user_behavior (\" +\n \"user_id UInt32, \" +\n \"action String, \" +\n \"event_time DateTime \" +\n \") ENGINE = MergeTree() \" +\n \"ORDER BY (event_time, user_id)\");\n \n stmt.execute(\"INSERT INTO user_behavior VALUES \" +\n \"(1001, 'login', now()), \" +\n \"(1002, 'purchase', now())\");\n \n ResultSet rs = stmt.executeQuery(\"SELECT user_id, count() AS cnt \" +\n \"FROM user_behavior \" +\n \"GROUP BY user_id \" +\n \"ORDER BY cnt DESC\");\n while (rs.next()) {\n System.out.println(\"user_id: \" + rs.getInt(\"user_id\") +\n \", count: \" + rs.getLong(\"cnt\"));\n }\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}3.3 使用Python连接
Python开发者可以使用clickhouse-connect或clickhouse-driver等库连接TCHouse-C。以下是使用clickhouse-connect的示例:
from clickhouse_connect import get_client\n\nclient = get_client(\n host='<集群内网地址>',\n port=8123,\n username='<用户名>',\n password='<密码>',\n database='default'\n)\n\nclient.command('''\n CREATE TABLE IF NOT EXISTS user_behavior (\n user_id UInt32,\n action String,\n event_time DateTime\n ) ENGINE = MergeTree()\n ORDER BY (event_time, user_id)\n''')\n\nclient.command('''\n INSERT INTO user_behavior VALUES\n (1001, 'login', now()),\n (1002, 'purchase', now())\n''')\n\nresult = client.query('''\n SELECT user_id, count() AS cnt\n FROM user_behavior\n GROUP BY user_id\n ORDER BY cnt DESC\n''')\n\nfor row in result.result_rows:\n print(f\"user_id: {row[0]}, count: {row[1]}\")4. 数据导入方案
TCHouse-C支持多种数据导入方式,涵盖批量和实时两种场景,可以根据数据来源和时效性要求灵活选择。
4.1 从COS对象存储导入
如果数据已经存储在腾讯云COS上,可以通过S3表引擎直接将数据导入TCHouse-C。前提条件是数据源COS和TCHouse-C集群必须在同一个VPC下。
首先创建S3表来读取COS中的数据:
CREATE TABLE cos_engine_table (\n int_id UInt32,\n name String,\n score Float64\n) ENGINE = S3(\n 'http://<bucket-name>.myqcloud.com/<path-to-file>/data.csv.gz',\n '<access-key-id>',\n '<access-key-secret>',\n 'CSV',\n 'gzip'\n)S3表引擎的参数格式为:S3(path, [aws_access_key_id, aws_secret_access_key,] format, [compression])。其中path是带有文件路径的Bucket URL,支持通配符;format是文件格式;compression支持none、gzip/gz、brotli/br、xz/LZMA、zstd/zst等。
然后创建目标表。单副本版使用MergeTree引擎:
CREATE TABLE test.test ON CLUSTER default_cluster (\n int_id UInt32\n) ENGINE = MergeTree()\nORDER BY int_id双副本版需要使用ReplicatedMergeTree引擎:
CREATE TABLE test.test ON CLUSTER default_cluster (\n int_id UInt32\n) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/test/{shard}', '{replica}')\nORDER BY int_id创建分布式表:
CREATE TABLE test.test_dis ON CLUSTER default_cluster\nAS test.test\nENGINE = Distributed('default_cluster', 'test', 'test', rand())最后将数据从S3表写入目标表:
INSERT INTO test.test SELECT * FROM cos_engine_table4.2 从Kafka实时导入
对于实时流数据,TCHouse-C支持通过Kafka引擎表实时消费数据。前提是数据源Kafka集群和TCHouse-C集群必须在同一个VPC下。
首先创建Kafka消费表:
CREATE TABLE kafka_consumer (\n user_id UInt32,\n action String,\n event_time DateTime\n) ENGINE = Kafka()\nSETTINGS\n kafka_broker_list = '<Kafka broker地址列表>',\n kafka_topic_list = '<topic名称>',\n kafka_group_name = '<消费者组名称>',\n kafka_format = 'JSONEachRow'然后创建本地目标表:
CREATE TABLE user_behavior_local ON CLUSTER default_cluster (\n user_id UInt32,\n action String,\n event_time DateTime\n) ENGINE = MergeTree()\nORDER BY (event_time, user_id)最后创建物化视图,将Kafka消费表的数据自动同步到目标表:
CREATE MATERIALIZED VIEW user_behavior_mv ON CLUSTER default_cluster\nTO user_behavior_local\nAS SELECT user_id, action, event_time\nFROM kafka_consumer这样,Kafka中的实时数据就会自动流入TCHouse-C,实现秒级可见的实时分析能力。
4.3 从本地文件导入
对于小规模数据或一次性导入,可以通过clickhouse-client从本地文件导入。首先确保已经安装clickhouse-client。导出数据的命令如下:
clickhouse-client --host <源集群地址> --port 9000 --user <用户名> --password <密码> \\\n -q \"SELECT * FROM database.table FORMAT CSV\" > data.csv导入数据的命令如下:
clickhouse-client --host <TCHouse-C集群地址> --port 9000 --user <用户名> --password <密码> \\\n -q \"INSERT INTO database.table FORMAT CSV\" < data.csv4.4 自建ClickHouse迁移
如果已有自建的ClickHouse集群需要迁移到TCHouse-C,可以通过以下几种方式。
Schema迁移:首先通过查询system.tables获取所有表的DDL语句:
clickhouse-client --host $SOURCE_HOST --port $SOURCE_PORT --user $USER --password $PASSWORD \\\n -q \"SHOW CREATE database.table\" > schema.sql然后在TCHouse-C集群中执行这些DDL语句创建对应的数据库和表。
通过Remote函数迁移:数据规模较小时,可以直接使用Remote函数将源集群数据迁移到目标集群:
INSERT INTO target_database.table\nSELECT * FROM remote('source_cluster', source_database.table, '$USER', '$PASSWORD')数据规模较大时(百GB级及以上),建议按分区或按天分批迁移:
INSERT INTO target_database.table\nSELECT * FROM remote('source_cluster', source_database.table, '$USER', '$PASSWORD')\nWHERE event_date = '2025-05-25'大规模迁移时,建议采用本地表对本地表的迁移模式,直写分布式表可能导致内存不足或出现Too many parts报错。
5. 查询分析与性能优化
5.1 基础查询
TCHouse-C兼容标准SQL语法,可以执行各种聚合、过滤、排序和连接操作。以下是一些典型查询示例:
-- 按用户统计行为次数\nSELECT user_id, count() AS action_count\nFROM user_behavior\nWHERE event_time >= '2026-07-01'\nGROUP BY user_id\nORDER BY action_count DESC\nLIMIT 100\n\n-- 按小时统计活跃用户数\nSELECT toStartOfHour(event_time) AS hour, uniq(user_id) AS dau\nFROM user_behavior\nWHERE event_time >= '2026-07-01'\nGROUP BY hour\nORDER BY hour\n\n-- 多表关联查询\nSELECT u.user_name, b.action, b.event_time\nFROM user_behavior b\nJOIN user_info u ON b.user_id = u.user_id\nWHERE b.event_time >= '2026-07-01'\nLIMIT 10005.2 性能优化最佳实践
批写入:数据必须以批量方式写入TCHouse-C,单条插入会严重影响写入性能。建议每次写入至少包含数千行数据。
减少分布式表直接写入:写入操作应尽可能直接写入本地表而非分布式表。分布式表存在写放大以及异步落盘消耗IO的问题,写入性能较差。
合理设计分区键和排序键:分区键和排序键是TCHouse-C性能优化的核心。排序键决定了数据的物理存储顺序,应选择查询中频繁作为过滤条件的字段。分区键应按时间维度设计,便于数据生命周期管理。
使用近似去重函数:如果对唯一性要求不高,可以采用uniqCombined等近似去重函数来优化去重逻辑,可提升十倍查询性能。
利用物化视图预聚合:物化视图在数据插入时进行预计算并存储结果,可以极大加速固定维度的聚合查询。创建物化视图的示例:
CREATE MATERIALIZED VIEW user_hourly_stats\nENGINE = SummingMergeTree()\nORDER BY (hour, user_id)\nAS SELECT\n toStartOfHour(event_time) AS hour,\n user_id,\n count() AS action_count\nFROM user_behavior\nGROUP BY hour, user_id冷热数据分层:TCHouse-C支持将冷数据自动迁移到COS存储。集群策略默认数据达到90%后会自动触发冷数据分层机制。这可以在不影响查询性能的前提下大幅降低存储成本。
查询存储空间和压缩比:可以通过以下SQL查询表的存储空间和压缩比:
-- 查询表的存储空间\nSELECT formatReadableSize(sum(bytes_on_disk))\nFROM system.parts\nWHERE table = 'your_table' AND active = 1\n\n-- 查询表的压缩比\nSELECT round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 3) AS compression_ratio\nFROM system.parts\nWHERE table = 'your_table' AND active = 16. 安全管理与权限控制
6.1 网络隔离与加密
TCHouse-C集群部署在用户VPC内,通过安全组可以精细控制访问权限。数据加密方面,支持云硬盘透明加密(AES-256),保障静态数据安全。云硬盘加密为免费功能,当前在北京、上海、广州、中国香港和新加坡地域支持。需要注意的是,加密仅能在集群购买时设置,且加密云盘和非加密云盘之间无法转换。
6.2 用户与权限管理
TCHouse-C支持ClickHouse原生的用户和角色权限体系。可以通过控制台的账户管理页面进行用户管理和密码重置。在权限管理方面,TCHouse-C支持API 3.0接口,可以编程方式实现对集群的全生命周期管理。在云数据仓库策略语句中,可以使用以cdwch为前缀的API操作。
建议遵循最小权限原则,为不同应用和用户分配最小必要权限,避免使用主账号密钥进行日常操作。
7. 成本控制与计费
TCHouse-C的计费主要包含以下几个维度:
计算节点费用:根据所选节点规格和数量计费,支持包年包月和按量计费两种模式。
存储费用:根据实际使用的云硬盘容量计费。ClickHouse的高压缩比(可达10:1)可以显著降低存储成本。
网络流量:同地域内网访问免流量费,跨地域或公网访问会产生流量费用。
成本优化建议:选择合适的地域以减少网络延迟和流量费用;利用弹性伸缩在业务低谷期缩减节点;开启冷热分层将历史冷数据迁移到COS以降低存储成本;合理规划数据生命周期,及时清理过期数据。
8. 总结
腾讯云数据仓库TCHouse-C为企业提供了一条快速构建PB级实时数据仓库的捷径。它继承了开源ClickHouse的极致查询性能,同时通过全托管运维、弹性伸缩、企业级安全等云端增强能力,大幅降低了数据仓库的建设和运维门槛。无论是从COS批量导入历史数据、通过Kafka实时接入流数据,还是从自建ClickHouse平滑迁移,TCHouse-C都提供了完善的解决方案。结合批写入、本地表优先、合理分区设计、物化视图等性能优化技巧,用户可以充分发挥TCHouse-C的性能潜力,实现海量数据的毫秒级实时分析。
常见问题解答
问1:TCHouse-C与开源ClickHouse是否兼容?
答:完全兼容。TCHouse-C内核与开源版ClickHouse高度兼容,任何在开源ClickHouse上运行的SQL语句和业务逻辑都可以零成本迁移到TCHouse-C上运行。
问2:TCHouse-C支持哪些数据导入方式?
答:TCHouse-C支持多种数据导入方式,包括从COS对象存储通过S3表引擎导入、从Kafka通过Kafka引擎表实时导入、通过clickhouse-client从本地文件导入,以及通过Remote函数从自建ClickHouse迁移等。
问3:生产环境应该选择高可用模式还是非高可用模式?
答:生产环境强烈建议选择高可用模式。高可用模式下每个分片有两个副本,节点故障时查询自动路由到副本,服务不中断。非高可用模式每个分片仅有一个副本,节点故障会导致整个分片不可用。
问4:如何提升TCHouse-C的查询性能?
答:可以从以下几个方面入手:采用批量写入而非单条插入;尽量直接写入本地表而非分布式表;合理设计分区键和排序键;使用uniqCombined等近似去重函数;利用物化视图进行预聚合;开启冷热分层将冷数据迁移到COS。
问5:TCHouse-C支持哪些连接方式?
答:TCHouse-C提供三种接入方式:TCP端口9000用于ClickHouse原生协议(clickhouse-client及各语言SDK);MySQL端口9004允许使用标准MySQL工具连接;HTTP端口8123适用于REST调用和JDBC/ODBC连接。
问6:如何估算TCHouse-C所需的存储空间?
答:可以通过业务数据量乘以压缩比来估算。ClickHouse的压缩比通常在2到10之间,具体取决于数据类型和排序键设置。建议单节点预留20%的存储空间以满足数据增长需求。也可以通过查询system.parts表获取精确的存储使用情况。




