1、MPP 架构基础概念
MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构,专门设计用来高效处理大规模数据集。在这种架构下*,数据库被分割成多个部分,每个部分可以在不同的服务器节点上并行处理*。这意味着,当执行一个查询时,它可以被分解为许多小的任务,并且这些任务可以同时在多个节点上运行,从而极大地提高查询性能和系统的整体吞吐量。
MPP(大规模并行处理)是一种分布式计算架构,其核心特点是:
(1)、共享无(Share-Nothing):每个节点独立存储和计算,节点间通过网络通信,无共享资源(如内存或磁盘)。
(2)、分布式并行计算:数据分片存储在多个节点上,查询时各节点并行处理自己的数据分片,最终合并结果。
(3)、高扩展性:通过增加节点数线性提升计算和存储能力。
ClickHouse的MPP架构是其高性能查询的核心支撑,尤其适用于OLAP场景(如大数据分析、实时报表等)。
2、ClickHouse 的 MPP 架构设计
(1)、核心组件
ClickHouse的MPP架构主要由以下组件构成:
说明:
-
协调节点
协调节点(Coordinator)也称为查询发起节点,是客户端连接并提交查询请求的地方。这个节点负责解析查询、制定执行计划,并将执行任务分配给相关的数据节点。此外,它还负责收集来自各个数据节点的中间结果,并对它们进行整合以生成最终的查询结果返回给客户端。 -
数据节点
实际存储数据并执行由协调节点分配的任务的节点。每个数据节点都包含一部分完整的数据集,并能够独立地执行查询任务。这种设计使得查询可以并行执行,从而提高查询性能。
(2)、ClickHouse中的分片机制
在ClickHouse中,数据通常会根据一定的规则被分割成多个部分,每部分被称为一个“分片”。分片可以跨多个服务器部署,这有助于扩展系统容量以及提升查询处理速度。
- 每个分片都可以配置为独立运行,即所有副本都是平等的,没有明确的领导者或跟随者之分。
- 在某些高可用性配置中,可能会采用类似主备(Primary-Secondary)的复制方案,其中有一个主要副本(可以视为leader)负责写操作,而其他副本同步该主要副本的数据。然而,读操作可以从任意副本执行,以此提供负载均衡和故障转移能力。
- 在ClickHouse中,分片并不严格遵循leader-follower结构,而是依赖于具体的配置和需求。这种灵活性允许用户根据自己的应用场景选择最合适的部署方式。对于需要高可用性的场景,可以通过设置多副本和适当的复制策略来实现。而对于追求极致性能的应用,则可以考虑通过增加分片数量来横向扩展系统。
(3)、数据分片与分布
- 分片策略:
数据按规则(如哈希、范围)分发到不同分片,常见策略包括:- 哈希分片:cityHash64(column) 将数据均匀分布到分片。
- 范围分片:按时间或数值范围划分数据(如按年分区)。
- 副本机制:
每个分片有多个副本(如 3 副本),通过 ZooKeeper 管理元数据和故障转移。
3、查询执行流程
以下是 ClickHouse 分布式查询的典型执行流程:
(1)、查询解析与优化
- 协调节点(Coordinator)解析 SQL,生成逻辑执行计划。
- 根据分布式表的元数据,确定参与计算的分片。
(2)、分布式执行
- 协调节点将查询计划分发到各个分片节点。
- 分片节点并行计算:每个节点独立处理本地数据,执行扫描、过滤、聚合等操作。
- 数据交换(Data Shuffling):若需要跨分片聚合(如 GLOBAL IN PROGRESS),数据通过网络传输。
(3)、结果合并
- 协调节点收集各分片的中间结果,进行最终聚合或排序。
- 返回最终结果给客户端。
(4)、核心特性
4、MPP 架构的优势
(1)、高性能查询
- 并行计算:数据分片并行处理,线性提升计算能力。
- 向量化执行:通过 SIMD 指令并行处理数据块(如 4-8 行同时计算)。
- 列式存储:减少 I/O,加速过滤和聚合操作。
(2)、水平扩展
- 弹性扩容:通过增加分片或副本,线性提升存储和计算能力。
- 动态分片:支持在线添加节点,无需停机。
(3)、高可用性
- 副本容错:副本节点故障时自动切换,保证服务连续性。
- 数据冗余:副本存储相同数据,避免单点故障。
(4)、低延迟
- 分布式计算:减少单节点负载,避免资源争用。
- 本地计算:数据存储与计算在同一节点,减少网络延迟。
5、MPP 架构的典型应用场景
(1)、大数据分析
- 场景:分析 PB 级日志数据(如用户行为、点击流)。
- 示例:
-- 查询过去一年各地区的销售额SELECT region, SUM(sales) FROM distributed_sales_table WHERE date BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY region;
- 优势:分片并行计算,秒级返回结果。
(2)、实时报表
- 场景:实时生成业务报表(如广告投放效果、用户活跃度)。
- 示例:
-- 实时统计当前小时的用户登录次数SELECT COUNT(*) FROM distributed_login_events WHERE event_time >= NOW() - INTERVAL 1 HOUR;
(3)、复杂聚合查询
- 场景:多维度聚合(如按时间、地域、产品分类统计)。
- 示例:
-- 按天、地区、产品分类统计销售额SELECT date, region, product_category, SUM(sales) FROM distributed_sales GROUP BY date, region, product_category;
6、MPP 架构的实现细节
(1)、分布式表(Distributed Table)
- 定义:通过 Distributed 引擎创建逻辑表,指向分片的本地表。
sql示例:
CREATE TABLE distributed_table (id UInt64,name String,create_time DateTime) ENGINE = Distributed('cluster_name', 'local_database', 'local_table', rand());
- 参数说明: - cluster_name:集群名称。 - local_database:本地数据库名。 - local_table:本地表名。 - rand():分片键(如随机分片)。
(2)、分片与副本配置
- 分片配置示例:
sql示例:
-- 创建分片和副本(通过 ZooKeeper 管理)CREATE CLUSTER company_cluster LOCAL(shard 1,'192.168.1.100:9000')AS company_replica1;CREATE CLUSTER company_cluster shard 1(replica 1,'192.168.1.100:9000');
(3)、查询优化技巧
- 分区裁剪(Partition Pruning):
通过 PARTITION BY 定义分区,查询时自动过滤无关分区。
sql示例:
CREATE TABLE sales (id UInt64,amount Float64,create_time DateTime) ENGINE = MergeTree()PARTITION BY toYYYYMM(create_time)ORDER BY id;
- 预聚合(Aggregation Pushdown):
在分片内完成部分聚合,减少数据传输量。
sql示例:
SELECT region, SUM(sales) FROM distributed_sales GROUP BY region SETTINGS distributed_aggregation = 1;
7、MPP 架构的局限性
(1)、复杂 JOIN 的限制
- 跨分片的 JOIN 需要全表数据传输,可能产生性能瓶颈。
- 建议通过预处理或物化视图优化。
(2)、数据一致性延迟
- 分布式事务仅保证最终一致性,不支持跨分片 ACID 事务。
(3)、配置复杂度
- 需要合理设计分片键,避免数据倾斜(如哈希分片键选择不当)。
8、总结
ClickHouse 的 MPP 架构 通过分布式并行计算、列式存储和向量化执行,实现了 “亿级数据秒级响应” 的性能。其核心优势在于:
- 高性能:适合海量数据的分析型查询。
- 高扩展:通过分片和副本轻松扩展存储和计算能力。
- 易用性:通过 SQL 接口和分布式表透明化分布式计算。
在实际应用中,合理设计分片策略、利用分区裁剪和预聚合,可以最大化 MPP 架构的性能优势。对于需要处理 PB 级数据的 OLAP 场景(如日志分析、实时报表),ClickHouse 是一个极具竞争力的选择。
逆风翻盘,Dare To Be!!!