clickhouse--副本、分片、Distributed

2023-11-04

        副本的目的防止数据丢失,保证高可用,分片则是实现数据的水平切分。

       使用副本需要使用replicatedMergeTree存储引擎。MergeTree存储引擎存储数据时首先将数据写入内存缓冲区,然后数据被写入本地磁盘临时目录分区,待全部完成后再将临时目录重新命名为正式分区。

1、建表

     RelicatedMergeTree在MergeTree上增加了zookeeper,replicatedmergeTree会在zookeeper内创建一系列监听节点,并以此实现相互通信。zookeeper只负责通信,不需要传输数据。

     在集群上创建表

 create table st_order_mt on cluster gmall_cluster
(
id UInt32,
create table st_order_mt on cluster gmall_cluster (
   id UInt32,
sku_id String,
total_amount Decimal(16,2), create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}')
  partition by toYYYYMMDD(create_time)
  primary key (id)
  order by (id,sku_id);

创建分布式表

create table st_order_mt_all2 on cluster clustersName
(
id UInt32,
 sku_id String,
total_amount Decimal(16,2), create_time Datetime
)engine = Distributed(clustersName,default, st_order_mt,hiveHash(sku_id));

ReplicatedMergeTree('zk_path','replica_name')

2、zookeeper内的节点结构

使用prettyzoo工具连接zookeeper

          创建表时,以zk_path为路径,在zookeeper中为这张表创建一组监听节点,以节点2为例,路径为/clickhouse/tables/02/st_order_mt。创建的节点如下:

                    

这些节点按类型可以分为:

1)元数据

metadata:保存元数据信息,包括主键、分区键、采样表达式等

columns:保存列字段信息,包括列名称和数据类型

2)判断标识

block_numbers:按照分区的写入顺序,以相同的顺序记录partition_id.各个副本在本地进行merge时,会依照相同的block_numbers顺序进行。

blocks:记录block数据块的hash信息摘要,以及对应的partition_id,通过hash摘要能够判断block数据库是否重复,通过partition_id能够找到需要同步的数据分区

leader_election:用于主副本的选举工作,主副本会主导merge和mutation操作,这些任务在主副本完成之后再借助zookeeper将消息分发至其他副本

quorum:记录quorum的数量,当至少有quorum数量的副本写入成功后 ,整个操作才算成功,quorum的数量由insert_quorum参数控制,默认为0

3)日志

/log:操作日志,是zookeeper工作机制中最重要的一环,保存了副本需要执行的任务指令。log使用zookeeper的持久顺序型节点,每条指令的名称以log-为前缀递增,如log-00000000,log-00000001等。每一个副本都会监听/log节点,当有新的指令加入时,他们会把指令加入各自的任务队列,并执行任务。

mutations:mutation操作日志节点,作用与log日志类似,当执行alter delete和alter update时,操作指令会被添加到这个节点。mutations同样使用了zookeeper的持久顺序型节点,但命名没有前缀,每条指令直接以递增数字的形式保存。

replicas/{replica_name}:每个副本各自的节点下的一组监听节点,用于指导副本在本地执行具体的任务指令,其中重要的节点为:

  • queue:任务队列节点,用于执行具体的操作任务。当副本从log或mutations节点监听到操作指令时,会将任务添加到该节点下,并基于队列执行
  • log_pointer:log日志节点指针,记录了最后一次执行的log日志下标信息。如log_pointer:4对应了log/log-00000003(从0开始计数)
  • mutation_pointer:mutation日志指针节点,记录了最后一次执行的mutations日志名称,如replicas/mutation_pointer:0000000对应mutation/00000000

log、mutation记录变化,replica负责操作任务的本地执行

/log和/mutation是分发操作指令的信息通道,发送指令的方式,则是为这些父节点添加子节点。所有的副本实例,都会监听主副本父节点的变化,当有子节点被添加,他们能实时感知。

3、副本协作的流程

    以insert为例:

    对于insert,当在master执行插入语句时,master负责向/log节点推送操作日志,如日志为/log/log-0000000;

   其他副本会一直监听/log节点变化,当master推送了/log/log-00000000之后,node1会触发日志的拉取任务更更新log_pointer,将其指向最新日志下标;

   node1拉取之后,并不会直接执行,而是将任务对象放入队列;

   node1基于/queue执行任务,node1从/replicas节点拿到所有的副本节点,选择一个log_pointer值最大(大意味着该副本执行的日志最多,数据更完整),/queue最小(小意味着该副本当前的任务执行负担小)作为自己数据的副本来源

   向该副本请求下载数据

4、分布式DDL

      默认情况下,create、drop、rename、alter等不支持分布式执行,分布式DDL在zookeeper内使用的路径为/clickhouse/task_queue/ddl。该路径由users.xml中的distributed_dll指定

 DDLlogEntry日志对象

      /query-[seq]下记录的日志信息由DDLLogEntry记录,如query-0000000001的信息如下:

version: 1
query: CREATE TABLE default.st_order_mt_all2 UUID 
\'95c4d7b5-d397-4eb1-95c4-d7b5d3971eb1\' 
ON CLUSTER clustersName 
(
`id` UInt32,
 `sku_id` String, 
`total_amount` Decimal(16, 2), 
`create_time` Datetime
)
 ENGINE = Distributed(clustersName, default, st_order_mt, hiveHash(sku_id))
hosts: ['centos%2Dlinux%2Dmaster%2Eshared:9000',
'centos%2Dlinux%2Dnode1%2Eshared:9000',
'centos%2Dlinux%2Dnode2%2Eshared:9000']
initiator: centos%2Dlinux%2Dmaster%2Eshared:9000
  • query:记录了具体的执行语句
  • hosts:记录了指定集群的hosts主机列表
  • initiator:记录初始化host主机的名称,hosts主机列表的取值来自于初始化host节点上的集群。如此处为master节点

分布式DDL执行的核心流程

    假设建表语句在master上执行,步骤如下:

1)master负责创建DDLLogEntry日志并将日志推送到zookeeper,同时由这个节点负责监控任务的执行进度。假设日志为/ddl/query-0000000002

2)masrer,node1,node2监控/ddl/query-0000000002日志的推送,然后拉取日志到本地。首先判断本机host是否在DDLLogEntry的hosts列表中。若在,则执行,执行完毕后,将状态写入finished节点;不包含,则推送。

3)第一步推送日志之后,客户端会阻塞180秒,期望所有的节点执行完毕。若等待时间大于180秒,会转入后台线程继续等待。等待时间

5、Distrubted

     分布式表与本地表之间的表结构在创建时不会进行检查,只有在查询时才会进行检查。

    引擎形式为:

engine=Distributed(cluster,database,table,sharding_key);
  • cluster:集群名称
  • databse:数据库名称
  • table:本地表的名称
  • sharding_key:分片键,选填参数。在数据写入的过程中,分布式表会依据分片键的规则,将数据分布到各个host节点的本地表。分片键必须是整型数字,可以使用hivehash函数进行转换,也可以是rand()

5、1数据写入分片的过程

      公式为:slot=shard_value%sum_weight

    集群配置时<weight>val</weight> ,sum_weight是所有分片的权重之和,shard_value是分片键的取值。如三个分片的权重是10,20,30,则slot在[0,10)区间,对第一个分片写入,[10,20)则对第二个分片写入。

     以节点master,node为例,在master节点上写入数据,流程如下:

1)根据分片规则划分数据,将属于当前分片的数据写入本地表

2)将属于node1的数据以分区为单位,写入分布式表的存储目录下临时bin文件下:如此处的路径为:

/st_order_mt_all2/default/@centos-linux-node1.shard:9000/1.bin

然后与node1建立连接

3)向node2发送数据,数据在传输之前被压缩

4)接收数据并写入本地表

传输过程中由master节点的分布式表负责切分数据,并向所有分片节点发生数据。

5、2数据写入副本的过程

   有2种方式:由distributied引擎负责将数据写入副本;借助replicatedMergeTree表引擎实现副本数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clickhouse--副本、分片、Distributed 的相关文章

  • 一文了解Clickhouse

    ClickHouse是什么 ClickHouse是一个存储计算一体的工具 其与spark flink等大数据框架不同的在于它有自己的存储层 在数据压缩 存储上做了更多的优化 所以导致它在某些数据处理能力上比其他工具快上了不少 毕竟一般框架只
  • HTML学习

    HTML 我的第一个网页 基本标签 图片标签 链接标签 列表 表格 媒体元素 页面结构分析 iframe内联框架 表单 我的第一个网页
  • css中float用法

    float浮动 指将指定元素悬浮于所在整体之上 即将垂直排列的元素转换为水平同行显示 平时写出的HTML是具有先后顺序的 对于这个顺序我们称之为标准流 而浮动则是脱离标准流的另一个独立标准 下面给出float定义 float left 左浮
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • html文本元素

    文章目录 h p span pre code 实体字符 strong i em del s h h head 标题 一共有六级标题 hKaTeX parse error Expected got EOF at end of input 6
  • 通过点击按钮在页面添加图片

    点击添加按钮 在盒子中加入图片 点击图片实现删除图片效果 代码如下
  • 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业 (1)

    HTML5期末大作业 动漫电影主题 电影动漫言叶之庭 4页 带音乐 HTML CSS JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 大学生毕设网页设计源码HTML 1 临近期末 你还在为H
  • webpack5 配置&使用 文档(大全)

    一 起步 1 基本安装 首先我们创建一个目录 初始化 npm 然后 在本地安装 webpack 接着安装 webpack cli 此工具用于在命令行中运行 webpack mkdir webpack demo cd webpack demo
  • JavaScript 实现html导出为PDF文件

    相信各位前端工程狮们在一些报表项目 管理系统项目中都会遇到在这样的需求 申请报 表格 简历等等图文信息有导出为PDF文件 下面是记录我在项目中完成该需求的代码dome 发布出来也是希望对大家有些帮助 1 整体思路 将HTML元素打印或导出为
  • HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

    在日常项目中 html5的video标签还是比较常用到的 开发过程中 我们都会使用到 通过监听video标签的播放 暂停 停止等等来使用 我们是否也会遇到过 有些浏览器在显示这标签 兼容不太友好 video标签的封面是一层黑色的 ok 那么
  • 三维实时重建BundleFusion

    转自 计算机视觉方向简介 深度相机室内实时稠密三维重建 知乎 室内场景的稠密三维重建目前是一个非常热的研究领域 其目的是使用消费级相机 本文特指深度相机 对室内场景进行扫描 自动生成一个精确完整的三维模型 这里所说的室内可以是一个区域 一个
  • 如何在 ClickHouse 中向可执行 UDF 发送多个参数?

    我有一个输出输入的 python 脚本 usr bin python3 import sys if name main i 0 for line in sys stdin print i line end sys stdout flush
  • 测试基础知识

    常见测试分类 按测试阶段划分 单元测试 针对程序源码进行测试 国内是开发自测 集成测试 又称接口测试 针对模块间的访问地址进行测试 系统测试 对整个系统进行测试 包括功能 兼容性 文档等 验收测试 分为内测和公测 按代码可见度划分 黑盒测试
  • Clickhouse 不返回列标题

    我正在尝试从 clickhouse 获取一些关系数据并在 pandas 中使用 它有效 但 pd read sql query 返回数据帧 其中列名是第一行的值 相反 我希望看到关系表中命名的列名称 我用 Postgres 做了同样的尝试
  • 在 clickhouse 中将日期转换为 Jalal 日期

    我使用clickhouse版本22 3 15 33 在我的表中 日期的格式如下 2023 01 15 我想计算表中每个 Jalal 月份变量的总和 所以首先我需要将此日期转换为 Jalal 日期 然后获取月份 然后使用group by基于月
  • 通过 docker 安装 Clickhouse 的主机上的数据目录权限

    我对 clickhouse 的设置是通过 docker https hub docker com r yandex clickhouse server dockerfile https hub docker com r yandex cli
  • 是否可以从 clickhouse 表中删除旧记录?

    据我所知 clickhouse只允许插入新数据 但是是否可以删除早于某个时间段的块以避免硬盘溢出 轻量级删除 自 v22 8 起可用 MergeTree 表的标准 DELETE 语法已在 37893 https github com Cli
  • Clickhouse字符串字段磁盘使用情况:null vs 空

    我正在为一个大型 Clickhouse 表设计一个架构 其中的字符串字段可能非常稀疏 我想知道这些字段是否应该为空或者我是否应该存储一个空字符串 作为默认值 就存储而言 哪个更好 您应该存储一个空字符串 可空列会占用更多磁盘空间 并使查询速
  • 如何对多行的一列值求和?

    我有这个表 我想添加几行的 change 列的值 或者更准确地说 从 ne 值为零的行到 ne 值为零的下一行 不是第二个本身 任何答案将不胜感激 rn date ne change 0 2008 12 07 0 10330848398 1
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch

随机推荐

  • linux搭建测试环境

    微信设置水滴昵称 个性中带点萌 Linux搭建测试环境安装软件详细步骤 一 安装jdk1 8 二 jdk与tomact对应版本 三 安装tomact 四 安装mysql mysql 5 7 24 linux glibc2 12 x86 64
  • 高考+考研,如何选择人工智能相关专业?

    世界杯如火如荼 高考报志愿 确定考研目标也在火热展开中 人工智能行业如此热门 那么目前都哪有 科班 专业可供选择呢 结合相关资料 整理出与AI紧密相关的国内高校与科研院所名单 希望能帮到小伙伴们 成为朝阳产业 人工智能是研究 开发用于模拟
  • 删除文件名含有特殊字符的文件

    删除文件名含有特殊字符的文件 当你要删除含有特殊字符的文件名时 有以下几种情况 使用转义字符 引号 rm rf rm rf rm rf 上述命令删除文件名为 的文件 如果直接删除 那么根目录中的所有文件都会丢失 这种方式能够适用于大多数情况
  • jenkins war包 centos启动安装指导

    文章目录 问题回顾 1 进入官网 下载到Jenkins的war包 1 1 放置在指定位置 1 2 放置安装包和创建文件放置路径 1 3 检查环境 1 4 配置启动命令和结束命令 2 启动后进入到Jenkins页面 2 1 安装插件 例如流水
  • (一)Springboot原理源码解析之Springboot框架组成

    目录 一 总体框架构成 1 注解组成关系 2 类继承和调用关系 二 框架总体调用流程 1 入口类中的流程 2 Spring刷新流程 一 总体框架构成 我在分析Springboot的组成部分把其分成了两部分 注解组成及关系 主要说明了在启动过
  • LeetCode.81 搜索旋转排序数组Java

    LeetCode 81 搜索旋转排序数组 注意 通过mid和左边数字大小可以判断到底是左边有序还是右边有序 需要处理重复数字最后才能通过 代码 class Solution public boolean search int nums in
  • 信奥赛一本通 C++题解 2034【例5.1】反序输出

    2034 例5 1 反序输出 时间限制 1000 ms 内存限制 65536 KB 提交数 23315 通过数 9932 题目描述 输入n 个数 要求程序按输入时的逆序把这n个数打印出来 已知整数不超过100个 也就是说 按输入相反顺序打印
  • Element-ui表单验证验证失败,input内有内容仍然验证为空的问题,验证数值类型不一致问题

    首先展示正确的格式 以验证是否为空为例 html代码块
  • QProcess 类使用总结

    背景 QProcess 类用于启动外部程序并与它们通信 QProcess 将进程视为I O 设备 可以对进程进行写入和读取 调用参数设置 同时指定路径和参数调用程序 QProcess process new QProcess this pr
  • 阿里云轻量级服务器安装--宝塔面板

    一 环境 1 服务器 阿里云轻量级服务器 2 环境 CentOS 7 6 二 安装 1 打开远程链接 2 输入安装命令 yum install y wget wget O install sh http download bt cn ins
  • js加密字符串

    字符串加密 用javascript对字符串进行加密 应用于参数传递等 默认加密密钥为kb1234 使用者可自定义修改 注意加密密钥应和解密密钥相同 算法来自于互联网 使用方法 加密 var code kbt encrypt 我爱北京天安门
  • 大算力时代已经到来

    计算机发展到现在 早已经历了大数据时代 而现如今国家也注意到国民大数据的重要性 而给予保护性条款和制度的建立 我觉得这只是早已注定的结局 但是未来该走向何方 着眼当下 我们互联网人早已身处在答案之中 大算力 Big Computing Po
  • 清除windows登录密码

    清除windows登录密码 原理 替换登录界面中的工具 登录界面中的轻松使用中的工具一般有放大镜 c Windows System32 Magnify exe 屏幕键盘 讲述人等 可以使用下列方法之一完成 命令行下的操作 替换后重启系统 点
  • 为什么打两拍可以消除亚稳态的影响?

    为什么打两拍可以消除亚稳态的影响 首先 我们需要了解什么是亚稳态 看下图 简单来说 就是当时钟信号上升沿到来的时候正好采样的数据也在发生变化 但是对于采样的时钟信号 如果想要采样得到一个稳定值 在clk的上升沿的前一段时间有一个建立时间TS
  • POP3协议分析

    感谢原作者 http blog csdn net bripengandre article details 2192111 POP3协议分析 第1章 POP3概述 POP3全称为Post Office Protocol version3 即
  • vue/js实现文件流下载,文件下载进度监听

    文档下载 通过文档请求 直接下载文档 url 请求路径 fileName 下载名称 size 文件大小 loadDown url fileName size var this this var xhr new XMLHttpRequest
  • django2.0.6 连接使用redis集群

    环境需要 django gt 1 8 x python 2 7 或者python gt 3 4 安装django cluster redis包 pip install django redis 注意 django redis版本需要 gt
  • springSecurity基本使用2(实现简单的登录功能)

    文章目录 前言 一 实现用户创建 登陆后才能访问接口 注重用户认证 1 定义一个内存用户 不使用默认用户 2 效果 3 退出登陆 4 再创建一个张三用户 同时支持多用户登陆 二 实现管理员功能 注重权限控制 1 创建一个普通用户demo 2
  • vue 项目代码混淆配置(自定义插件适用)带配置项注释

    文章目录 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 二 混淆步骤 1 引入混淆插件 2 添加混淆配置 3 执行代码混淆 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 本文章适用 vue cli3
  • clickhouse--副本、分片、Distributed

    副本的目的防止数据丢失 保证高可用 分片则是实现数据的水平切分 使用副本需要使用replicatedMergeTree存储引擎 MergeTree存储引擎存储数据时首先将数据写入内存缓冲区 然后数据被写入本地磁盘临时目录分区 待全部完成后再