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

clickhouse--本地表和分布式表,副本机制,分片集群

1、本地表和分布式表

ck的表分为两种:

  • 分布式表
      一个逻辑上的表,可以理解为数据库中的视图,一般查询都查询分布式表。分布式表引擎会将我们的查询请求路由本地表进行查询,然后进行汇总最终返回给用户。
  • 本地表
      实际存储数据的表。

Distributed Table & Distributed Engine

  ClickHouse分布式表的本质并不是一张表,而是一些本地物理表(分片)的分布式视图,本身并不存储数据。分布式表建表的引擎为Distributed。
Distrbuted_table

Copy Highlighter-hljs
CREATE TABLE IF NOT EXISTS {distributed_table} as {local_table} 
ENGINE = Distributed({cluster}, '{local_database}', '{local_table}', rand())

Distributed引擎需要以下几个参数:

  • 集群标识符
  • 本地表所在的数据库名称
  • 本地表名称
  • 分片键(sharding key) - 可选
      该键与config.xml中配置的分片权重(weight)一同决定写入分布式表时的路由, 即数据最终落到哪个物理表上. 它可以是表中一列的原始数据(如site_id), 也可以是函数调用的结果, 如上面的SQL语句采用了随机值rand(). 注意该键要尽量保证数据均匀分布, 另外一个常用的操作是采用区分度较高的列的哈希值, 如intHash64(user_id).

数据查询的流程

在这里插入图片描述

  1. 各个实例之间会交换自己持有的分片的表数据;
  2. 汇总到同一个实例上返回给用户。

2、基于表的副本机制

① 特点

  • 副本策略表级别
      ClickHouse 的副本机制由表引擎(如 ReplicatedMergeTree)实现,用户可以为每张表单独配置副本数。
  • 最终一致性
      数据写入时,ClickHouse 异步复制到其他副本,可能存在短暂的数据不一致。
  • 依赖 ZooKeeper
      副本之间的协调通过 ZooKeeper 实现(如副本状态、任务分配)。

② 优点

  • 灵活性高
      用户可根据业务需求为不同表配置不同的副本策略。

  • 存储成本可控
      可以为重要表配置多副本,非重要表减少副本。

  • 适合 OLAP 场景
      高吞吐写入、实时查询。

③ 缺点

  • 依赖外部组件(如 ZooKeeper),增加了系统复杂性。
  • 数据一致性较弱(最终一致性)。

④ 与HDFS副本机制的区别

基于集群的副本机制(HDFS)

  • 特点

    • 副本策略全局化:HDFS 的副本机制是集群级别的,所有文件默认存储 3 个副本,用户无法针对单个文件或目录单独配置副本数。
    • 强一致性:数据写入时,HDFS 会同步写入所有副本,确保数据强一致性。
    • 数据块管理:HDFS 将文件切分为固定大小的数据块(如 128MB),每个块独立存储副本。
  • 优点

    • 简单易用,用户无需关心副本管理。
    • 适合通用文件存储场景(如 Hadoop 生态)。
  • 缺点

    • 灵活性差,无法针对特定数据单独配置副本策略。
    • 存储成本高(默认 3 副本)。
总结

在这里插入图片描述

3、分片集群

  副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决。
  要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。
  Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。
  注意:ClickHouse 的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。

  • 集群写入流程(3 分片 2 副本共 6 个节点)
    在这里插入图片描述

  • 集群读取流程(3 分片 2 副本共 6 个节点)
    在这里插入图片描述
    详细配置参考

http://www.lryc.cn/news/542319.html

相关文章:

  • react hook useReducer
  • 告别阻塞,迎接高效:掌握 AsyncIOScheduler 实现异步任务调度
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之加入购物车和显示购物车列表
  • 再谈影刀RPA成长学习路线
  • PHP-综合4
  • 学习笔记-沁恒第五讲-米醋
  • 【JavaScript】JavaScript 常见概念 - 变量与数据类型 - 运算符 - 条件语句 - 循环 - 函数 - 数组操作 - 对象
  • Web自动化之Selenium添加网站Cookies实现免登录
  • AI手机的技术细节
  • 10. 九转金丹炼矩阵 - 矩阵置零(标记优化)
  • [实现Rpc] 客户端 | Requestor | RpcCaller的设计实现
  • Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)
  • 山东大学软件学院nosql实验三
  • 正态分布的奇妙性质:为什么奇数阶中心矩(odd central moments)为零?
  • 【入门音视频】音视频基础知识
  • 游戏引擎学习第120天
  • 【Qt之QQuickWidget】QML嵌入QWidget中
  • Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题
  • Eureka、ZooKeeper 和 Nacos 之间的对比
  • CSS中padding和margin属性的使用
  • 【Python爬虫(49)】分布式爬虫:在新兴技术浪潮下的蜕变与展望
  • 网络安全-系统层攻击流程及防御措施
  • centos 7 安装python3 及pycharm远程连接方法
  • 【llm对话系统】如何快速开发一个支持openai接口的llm server呢
  • 跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现
  • deepseek_清华大学指导手册_pdf_1-5
  • 数据库(MySQL)二
  • 第15届 蓝桥杯 C++编程青少组中/高级选拔赛 202401 真题答案及解析
  • 《AI大模型趣味实战》第10集:开发一个基于Mermaid的AI绘图网站
  • androidstudio 运行项目加载很慢,优化方法