当前位置: 首页 > news >正文

从底层原理上理解ClickHouse 中的 Distributed 引擎

        ClickHouse 的 Distributed 引擎 是实现大规模分布式查询和高可用性的关键技术之一,它允许集群中的多个节点协同工作,提供横向扩展能力和负载均衡机制。在底层,Distributed 引擎通过一系列的机制和策略,确保数据的分布、查询的并行执行、数据合并等操作高效执行。以下从底层架构、分片、查询执行、数据传输以及容错机制等方面详细介绍 Distributed 引擎的工作原理。

1. 底层架构概述

        在分布式系统中,查询的处理需要考虑数据的分布、计算的并行性以及数据传输的高效性。ClickHouse 的 Distributed 引擎在这方面提供了透明化的支持,使用户可以像操作单一节点一样操作分布式集群。

        Distributed 引擎自身并不存储数据,而是充当一个代理层,它通过定义集群拓扑,将查询任务分发给集群中不同节点上的实际表。每个节点上使用的表通常是基于 MergeTree 系列引擎的表,用于存储实际的数据。

Distributed 引擎的核心组件
  1. 协调节点(Coordinator Node):负责接收用户的查询请求,并将查询分发到集群中的其他节点,同时合并各个节点的查询结果。
  2. 分片(Shards):每个分片包含集群中的一个或多个节点,用于存储数据的不同部分。每个分片可以进一步有多个副本(replicas)以提高可用性。
  3. 分片键(Sharding Key):决定数据如何在不同分片之间进行分布。分片键通常是某个列或多列的组合,ClickHouse 使用这些列的值对数据进行哈希或其他分片算法的运算,从而决定数据的存储位置。

2. 数据分布和分片机制

分片模型(Sharding Model)

        数据在 Distributed 引擎中通过分片存储,每个分片存储数据集的一部分。如何将数据分配到不同的分片是分片机制的核心,常见的分片方式包括:

  • 基于哈希的分片(Hash-based Sharding):最常用的分片方式之一,系统对分片键的值进行哈希计算,然后根据哈希值将数据分配到不同的分片中。这种方式可以保证数据均匀分布,避免数据倾斜。
  • 范围分片(Range Sharding):根据分片键的范围来进行数据分片,适用于时间序列数据等可以按顺序存储的数据集。
  • 自定义分片:用户可以基于业务逻辑自行定义分片策略,以实现更复杂的数据分布需求。
分片键的选择

        分片键的选择至关重要,它影响到查询的效率和数据的均匀分布。理想的分片键应该使得数据能够均匀分布在所有分片上,避免热点问题(即某些分片存储的数据远远多于其他分片,导致这些分片的节点负载过高)。

分片与副本(Shards and Replicas)
  • 每个分片可以有多个副本(replica),副本之间数据一致,用于容错和高可用性
  • Distributed 引擎可以自动选择副本,在某个副本不可用时切换到其他副本,这大大提升了系统的可用性和容错能力

3. 查询执行流程

当客户端向 Distributed 表发起查询时,整个过程分为以下几个步骤:

1. 查询解析与分发
  • 查询首先由协调节点(Coordinator Node)解析。协调节点并不会处理实际数据,而是负责将查询路由到合适的分片和副本上。
  • 协调节点根据查询的条件和分片键,判断哪些分片需要参与此次查询,并将查询请求并行分发到这些分片上的节点。
2. 局部查询的执行
  • 每个分片上的节点接收到查询请求后,执行局部查询。通常这些节点上的表使用 MergeTree 系列引擎,支持高效的数据存储、索引和查询优化。
  • 局部查询的结果可以是部分数据,也可以是已经完成的聚合结果,具体取决于查询类型。
3. 数据传输与合并
  • 局部查询完成后,每个节点将结果集传输回协调节点。
  • 协调节点负责将不同分片的结果集进行合并。对于简单的 SELECT 查询,合并可能只是将结果集连接起来;对于涉及聚合、排序的查询,协调节点还需要对各个分片的部分结果进行最终的汇总或排序。
4. 返回最终结果
  • 协调节点将合并后的结果集返回给客户端,整个查询过程结束。

4. 数据传输与网络优化

分布式数据传输

        数据传输是分布式查询中的关键瓶颈,特别是当查询需要跨多个节点进行时,网络 I/O 和数据序列化/反序列化的开销可能非常高。ClickHouse 采用了一系列技术来优化数据传输:

  • 批量数据传输:ClickHouse 避免逐行传输数据,而是尽可能地将数据批量传输,以减少网络 I/O 次数
  • 数据压缩:通过使用高效的数据压缩算法(如 LZ4、ZSTD),减少在网络上传输的数据量,进一步降低 I/O 开销。
  • 异步查询执行:Distributed 引擎采用异步查询模式,允许多个分片的查询任务并行执行并独立返回结果,减少查询的整体等待时间。
智能副本选择

        在分片有多个副本时,Distributed 引擎会自动选择一个最合适的副本来执行查询,副本选择的逻辑包括:

  • 负载均衡:尽量将查询请求分散到不同的副本上,以均衡各个节点的负载。
  • 网络延迟:选择网络延迟较低的副本来执行查询,减少数据传输的时间。
  • 副本可用性:自动跳过不可用的副本,选择可用副本来保证查询的高可用性。

5. 容错和高可用机制

副本切换与恢复
  • 如果一个分片的主副本发生故障,Distributed 引擎会自动将查询路由到该分片的其他副本,保证查询的连续性和高可用性。
  • 副本之间的数据通过复制机制保持一致性。当主副本恢复后,可以通过 ClickHouse 的自动复制机制将丢失的数据同步回来。
动态节点管理
  • Distributed 引擎支持动态添加或移除节点。新加入的节点可以通过数据重分布机制快速接入集群,承担部分负载;故障节点恢复后,也可以自动重新加入集群。
容错机制
  • 当某些分片的节点暂时不可用时,Distributed 引擎可以智能地跳过这些节点,继续执行部分查询,并返回部分结果集。
  • 对于有副本的分片,如果查询时某个副本不可用,系统会自动切换到其他副本。

6. 跨数据中心部署

        ClickHouse 的 Distributed 引擎支持跨数据中心部署,这对于全球性业务或需要地理分布的集群尤为重要。跨数据中心部署时,需要处理以下挑战:

  • 网络延迟:跨数据中心的网络延迟较高,Distributed 引擎通过智能副本选择和批量数据传输,尽量减少跨数据中心的数据交换。
  • 数据一致性:不同数据中心之间的副本可能存在数据同步延迟,ClickHouse 的复制机制可以确保数据最终一致性,同时支持异步复制模式以降低同步延迟。

7. 查询优化策略

本地化查询优化
  • 如果查询条件中包含分片键,ClickHouse 可以根据分片键的值提前判断哪些分片可能包含相关数据,从而将查询只发送给必要的分片,避免不必要的全分片扫描。
  • 例如,如果分片键是时间戳列,并且查询包含时间范围过滤条件,Distributed 引擎可以仅将查询路由到包含该时间范围数据的分片。
预先聚合与分片内聚合
  • 在涉及聚合操作的查询中,每个分片的节点可以首先对本地数据进行局部聚合,然后将部分聚合结果返回给协调节点,协调节点只需要执行最终的聚合操作。这种 "预先聚合" 策略可以显著减少跨节点的数据传输量。

总结

        ClickHouse 的 Distributed 引擎是分布式查询和数据存储的核心,它通过分片和副本机制将数据分布在多个节点上,提供了良好的横向扩展性和高可用性。在底层,Distributed 引擎依赖于分布式数据路由、并行查询执行、数据传输优化和容错机制来确保大规模数据集下的高效查询。合理的分片键设计、智能的副本选择、批量数据传输和异步执行策略都是确保其高性能和高可用的关键。

相关文章:

从底层原理上理解ClickHouse 中的 Distributed 引擎

ClickHouse 的 Distributed 引擎 是实现大规模分布式查询和高可用性的关键技术之一,它允许集群中的多个节点协同工作,提供横向扩展能力和负载均衡机制。在底层,Distributed 引擎通过一系列的机制和策略,确保数据的分布、查询的并行…...

社区志愿者服务系统小程序的设计

管理员账户功能包括:系统首页,个人中心,志愿者管理,社区管理,活动类型管理,志愿者活动管理,活动报名管理,活动签到管理,证书信息管理,系统管理 微信端账号功…...

echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】

在数据可视化中,地图是很重要的一个环节,很多时候需要展现的不仅是国家地图,还需要能从国家进入到省市。这个逐级进入的过程就是我们今天说的地图下钻。 地图下钻看起来很屌、很高大上,但是仔细琢磨一下,技术实现上真的…...

Python热频随机森林分类器算法模型模拟

🎯要点 研究发射测量斜率和时滞热频率表征,使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应,测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…...

C++11新增特性:lambda表达式、function包装器、bind绑定

一、lambda表达式 1)、为啥需要引入lambda? 在c98中,我们使用sort对一段自定义类型进行排序的时候,每次都需要传一个仿函数,即手写一个完整的类。甚至有时需要同时实现排升序和降序,就需要各自手写一个类&…...

动态主题模型DTM(Dynamic topic model)简介及python代码

文章目录 DTM模型简介DTM实现1:gensim.models.ldaseqmodel包DTM实现2:gensim.models.wrappers.dtmmodel.DtmModel包DTM模型简介 DTM模型(Dynamic Topic Model)是一种用于文本数据分析的概率模型,主要用于发现文本数据背后的主题结构和主题的演化过程。DTM模型是LDA模型的…...

GDPU MySQL数据库 天码行空1 数据库的创建和基本操作

💖 必看 MySQL 5.7默认的 innodb 存储引擎Windows10 和 Centos7 一、实验目的 1.熟知机房用机安全规则。 2.通过上机操作,加深对数据库系统理论知识的理解;通过使用具体的DBMS,了解一种实际的数据库管理系…...

《告别卡顿,一键卸载!IObit Uninstaller 13 免费版让电脑重获新生》

随着电脑使用时间的增长,各种软件的安装和卸载,难免会让电脑变得臃肿不堪,运行速度大不如前。你是否也有过这样的烦恼?别担心,IObit Uninstaller 13 免费版来帮你解决这个问题! IObit Uninstaller 13 是一…...

Python|基于Kimi大模型,实现上传文档并进行对话(5)

前言 本文是该专栏的第5篇,后面会持续分享AI大模型干货知识,记得关注。 我们在利用大模型进行文本处理的时候,可能会遇到这样的情况。 笔者在这里举个例子,比如说我们的目标文本是一堆docx文档,或者pdf文档,doc文档等等。这时需要大模型对这样的文档文本内容进行语义处…...

C++设计模式——Prototype Pattern原型模式

一,原型模式的定义 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。 原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化…...

Vue3 : ref 与 reactive

目录 一.ref 二.reactive 三.ref与reactive的区别 四.总结 一.ref 在 Vue 3 中,ref 是一个用于创建可读写且支持数据跟踪的响应式引用对象。它主要用于在组件内部创建响应式数据,这些数据可以是基本类型(如 number、string、boolean&…...

html实现好看的多种风格手风琴折叠菜单效果合集(附源码)

文章目录 1.设计来源1.1 风格1 -图文结合手风琴1.2 风格2 - 纯图片手风琴1.3 风格3 - 导航手风琴1.4 风格4 - 双图手风琴1.5 风格5 - 综合手风琴1.6 风格6 - 简描手风琴1.7 风格7 - 功能手风琴1.8 风格8 - 全屏手风琴1.9 风格9 - 全屏灵活手风琴 2.效果和源码2.1 动态效果2.2 源…...

Nacos分布式配置中心

分布式配置的优势: 不需要重新发布我们的应用 新建父工程:【将它作为跟 所以要把父工程里面的src删掉】 新建子模块: 新建bootstrap.properties: 在使用Nacos作为配置中心时,推荐在bootstrap.properties中配置Nacos相…...

C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果

在Windows Forms(WinForms)开发中,DataGridView 控件是一个功能强大的组件, 用于显示和管理表格数据。无论是展示大量数据,还是实现交互式的数据操作, DataGridView 都能提供多样的功能支持,比如…...

GANs-生成对抗网络

参考: https://mp.weixin.qq.com/s?__bizMjM5ODIwNjEzNQ&mid2649887403&idx3&snf61fc0e238ffbc56a7f1249b93c20690&chksmbfa0f632460e035f00be6cc6eb09637d91614e4c31da9ff47077ca468caad1ee27d08c04ca32&scene27 https://cloud.tencent.com…...

e冒泡排序---复杂度O(X^2)

排序原理: 1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。 2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值, public class 冒泡排序 {public static void main(String[] args) {I…...

C语言--结构体(学习笔记)

内容借鉴于b站杜远超官方频道(C语言结构体详解【干货】) 首先C语言中定义变量格式为“数据类型 变量名”,如int a; float b;等等。 那么结构体则是将多个变量(数据类型 变量名)结合在一起的一种新的数据类型&…...

Vue项目中实现用户登录后跳回原地址

本地存储 在 Vue 3 中,你可以使用 Vue Router 和 sessionStorage 或 localStorage 来实现用户登录后跳回原来的页面。以下是一种常见的实现方式: 在用户登录之前,记录当前页面的路由路径: 在需要登录的页面组件中,在…...

【Google Chrome Windows 64 version及 WebDriver 版本】

最近升级到最新版本Chrome后发现页面居然显示错乱实在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 64 位 VersionSize下载地址Date104.0.5112.10282.76 MBhtt…...

[ffmpeg] 音视频编码

本文主要梳理 ffmpeg 中音视频编码的常用函数 API调用 常用 API const AVCodec *avcodec_find_encoder(enum AVCodecID id); AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); void avcodec_free_context(AVCodecContext **avctx); int avcodec_open2(AVCode…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...