ClickHouse创建分布式表

ClickHouse创建分布式表

当数据量剧增的时候,clickhouse是采用分片的方式进行数据的存储的,类似于redis集群的实现方式。然后想进行统一的查询的时候,因为涉及到多个本地表,可以通过分布式表的方式来提供统一的入口。由于是涉及到分布式存储,保证高可用就必须有数据冗余—即副本(replica)。Clickhouse依靠ReplicatedMergeTree引擎族与Zookeeper实现了复制表机制,成为其高可用的基础。该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。

同时,Clickhouse具有数据分片(shard)的概念,这也是分布式存储的特点之一,即通过并行读写提高效率。ClickhouseHouse依靠Distributed引擎实现了分布式表机制,在所有分片(本地表)上建立视图进行分布式查询。

本文使用ReplicatedMergeTree和Distributed引擎来构建Clickhouse的分布式表。分布式表包括了逻辑表和物理表,逻辑表主要用于查询,物理表是实际存储数据的。

官方给出的创建复制表示例

CREATE TABLE table_name
(EventDate DateTime,CounterID UInt32,UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID)

贴上本文本地表的创建代码:

-- 建本地表
CREATE TABLE test.countly_device_local on cluster ch_cluster
(`appKey` String COMMENT 'appKey',`deviceId` String COMMENT 'deviceId',`nginxTime` DateTime COMMENT 'nginxTime',`rooted` String COMMENT 'rooted',`charging` String COMMENT 'charging',`idfa` String COMMENT 'idfa'
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test/countly_device_local', '{replica}')
PARTITION BY toYYYYMMDD(nginxTime)
ORDER BY (nginxTime);

其中,on cluster ch_cluster语法标识分布式DDL,即执行一次就可以在集群所有实例上创建同样的本地表。

ReplicatedMergeTree

ReplicatedMergeTree引擎族接受两个参数:

  • zoo_path—Zookeeper中该表的路径
  • replica_name—Zookeeper中的该表的副本名称

如上例所示,这些参数可以包含宏替换的占位符,即大括号的部分。它们会被替换为配置文件里macros那部分配置的值。

示例:

<macros><layer>05</layer><shard>02</shard><replica>example05-02-1.yandex.ru</replica>
</macros>

«ZooKeeper 中该表的路径»对每个可复制表都要是唯一的。不同分片上的表要有不同的路径。

这种情况下,路径应包含下面这些部分:

/clickhouse/tables/ 是公共前缀,官方推荐使用这个。

{layer}-{shard} 是分片标识部分。在此示例中,由于 Yandex.Metrica 集群使用了两级分片,所以它是由两部分组成的。但对于大多数情况来说,你只需保留 {shard} 占位符即可,它会替换展开为分片标识。

table_name 是该表在 ZooKeeper 中的名称。使其与 ClickHouse 中的表名相同比较好。 这里它被明确定义,跟 ClickHouse 表名不一样,它并不会被 RENAME 语句修改。

HINT:你可以在前面添加一个数据库名称 table_name 也是 例如。 db_name.table_name

副本名称用于标识同一个表分片的不同副本。你可以使用服务器名称,如上例所示。同个分片中不同副本的副本名称要唯一。

你也可以显式指定这些参数,而不是使用宏替换。对于测试和配置小型集群这可能会很方便。但是,这种情况下,则不能使用分布式 DDL 语句(ON CLUSTER)。使用大型集群时,官方建议使用宏替换,因为它可以降低出错的可能性。

要删除副本,使用 DROP TABLE。但它只删除那个 – 位于运行该语句的服务器上的副本。

想要删除集群上的所有副本,可以使用drop table [if exists] table_name on cluster cluster_name

Distributed Table & Distributed Engine

ClickHouse分布式表的本质并不是一张表,而是一些本地物理表(分片)的分布式视图,分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

支持分布式表的引擎是Distributed,建表DDL语句示例如下

Distributed(logs, default, hits[, sharding_key])

分布式引擎参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)。

将会从位于«logs»集群中 default.hits 表所有服务器上读取数据。

建立上面的本地表的分布式的语句为:

-- 建分布式表
create TABLE test.countly_device_dist on cluster ch_cluster as test.countly_device_local
ENGINE = Distributed("ch_cluster", "test", "countly_device_local", rand());

远程服务器不仅用于读取数据,还会对尽可能数据做部分处理。 例如,对于使用 GROUP BY 的查询,数据首先在远程服务器聚合,之后返回聚合函数的中间状态给查询请求的服务器。再在请求的服务器上进一步汇总数据。

要查看集群的详细信息,可以查看system.clusters表:

select * from system.clusters
r-clickhouse-m220-210.hd163.internal :) select * from system.clusters;SELECT *
FROM system.clustersQuery id: bbf4a9fa-5a94-48b4-b485-e50bc9a2e891┌─cluster─────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──────────────┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ ch_base_cluster │         1 │        10000 │           1 │ clickhouse_node1_1_1   │ 10.105.220.210 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ ch_base_cluster │         1 │        10000 │           2 │ clickhouse_node2_1_2   │ 10.105.220.211 │ 9001 │        0 │ default │                  │            0 │                       0 │
│ ch_base_cluster │         2 │        10000 │           1 │ clickhouse_node2_2_1   │ 10.105.220.211 │ 9000 │        0 │ default │ 
...

本文所使用的环境有一个名为ch_cluster的集群,它由两个分片组成,每个分片包含两个副本。

要注意区分分片和副本:

  • 分片是指包含数据不同部分的服务器(要读取所有数据,必须访问所有分片)。
  • 副本是存储复制数据的服务器(要读取所有数据,访问任一副本上的数据即可)。

向分布式表中写数据

向集群写数据的方法有两种:

  1. 自已指定要将哪些数据写入哪些服务器,并直接在每个分片上执行写入。换句话说,在分布式表上«查询»,在数据表上 INSERT。 这是最灵活的解决方案 – 你可以使用任何分片方案,对于复杂业务特性的需求,这可能是非常重要的。 这也是最佳解决方案,因为数据可以完全独立地写入不同的分片。
  2. 在分布式表上执行 INSERT。在这种情况下,分布式表会跨服务器分发插入数据。 为了写入分布式表,必须要配置分片键(最后一个参数)。当然,如果只有一个分片,则写操作在没有分片键的情况下也能工作,因为这种情况下分片键没有意义。

每个分片都可以在配置文件中定义权重。默认情况下,权重等于1。数据依据分片权重按比例分发到分片上。例如,如果有两个分片,第一个分片的权重是9,而第二个分片的权重是10,则发送 9 / 19 的行到第一个分片, 10 / 19 的行到第二个分片。

选择将一行数据发送到哪个分片的方法是,首先计算分片表达式,然后将这个计算结果除以所有分片的权重总和得到余数。该行会发送到那个包含该余数的从prev_weightprev_weights + weight的半闭半开区间对应的分片上,其中 prev_weights 是该分片前面的所有分片的权重和,weight 是该分片的权重。例如,如果有两个分片,第一个分片权重为9,而第二个分片权重为10,则余数在 [0,9) 中的行发给第一个分片,余数在 [9,19) 中的行发给第二个分片。

分片表达式可以是由常量和表列组成的任何返回整数表达式。例如,您可以使用表达式 ‘rand()’ 来随机分配数据,或者使用 ‘UserID’ 来按用户 ID 的余数分布

总结

Clickhouse采用了特殊的引擎设计结构和各种方案保证其查询和存储的高效。分布式的创建和使用还有很多的细节等待去深挖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetson Orin Nano平台自研载板MIPI 4Lane 2.5G 接收不稳定问题调试记录

1. 前言 问题描述 参考官方文档,设计了载板,配套Orin Nano SOM来使用 测试过程中发现4lane的MIPI在2.5G速率下工作不稳定(丢帧/断流) 部分板子在2.3G/2.4G速率下才可以长时间稳定工作 2. 测试对比 2.1 根据上述现象,单独制作了转接板 转接板严格控制了MIPI走线长度(…

常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式

目前开发的项目很大程度上是为明年的国产化做准备了&#xff0c;所以借这个机会把用了十年的自研系统全部重写&#xff0c;订立更严格的规范&#xff0c;本文记录一下返回格式及对应状态码。 常见 HTTP 状态码及解释 HTTP 状态码用于表示客户端请求的响应状态&#xff0c;它们…

Redis相关技术内容

1. Redis整体的技术全景 应用场景&#xff1a;数据结构的应用、缓存应用、集群应用 底层原理&#xff1a;线程模型、主从复制、负载均衡 ​ 数据结构、哨兵机制、数据分片 ​ AOF、 RDB 2. 并发承载 redis&#xff08;官方 10w/s&#xff09;数据库->mysql 并发范围&…

深入理解JVM

文章目录 1. JVM内存区域划分2. JVM中类加载过程类加载&#xff08;1&#xff09;类加载的基本流程&#xff08;2&#xff09;双亲委派模型 《深入理解java虚拟机》 在这本书前&#xff0c;面试官对于JVM也不是很了解。 这本书主要还是写个一下开发 JVM 的人。 1. JVM内存区域…

如何选情绪龙头

一、情绪龙头的特性及选股指标 情绪龙头股在市场中的表现往往具有独特的特性&#xff0c;这些特性不仅反映了市场的情绪波动&#xff0c;也为投资者提供了重要的选股依据。以下是情绪龙头股的十大特性及其对应的选股指标&#xff1a; 1. 高波动性 情绪龙头股通常具有极高的股…

启动软件是用例吗

沙亚雄 2020-8-13 14:06 潘老师&#xff0c;你好&#xff0c;最近读了您的软件方法&#xff0c;结合自己的项目发现始终有一个疑问&#xff1f;那就是启动软件算不算一个用例&#xff0c;因为软件在启动的时候一般都要实例化一些对象&#xff0c;读一些配置文件等等。那启动软…

Ubuntu22.04中使用CMake配置运行boost库示例程序

Ubuntu22.04中使用CMake配置运行boost库示例程序 boost是一个比较强大的C准标准库&#xff0c;里面有很多值得学习的东西&#xff0c;比较asio网络库可以用来编写C TCP客户端或者TCP服务端接收程序。本文主要讲解如何在Ubuntu22.04中使用Cmake配置boost库&#xff0c;以及运行…

弄巧成拙的 PFC(Priority-based Flow Control)

先说几句车轱辘话&#xff0c;TCP 性能低&#xff0c;所以 RDMA&#xff0c;以太网丢包&#xff0c;所以 PFC&#xff0c;网卡不能太复杂&#xff0c;所以 GBN… HPC&#xff0c;AI 对吞吐&#xff0c;时延要求非常高&#xff0c;同时需要更多计算资源&#xff0c;而 TCP 处理…

指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾

10月30日&#xff0c;袋鼠云成功举办了以“AI驱动&#xff0c;数智未来”为主题的2024年秋季发布会。大会深度探讨了如何凭借 AI 实现新的飞跃&#xff0c;重塑企业的经营管理方式&#xff0c;加速数智化进程。 作为大会的重要环节之一&#xff0c;袋鼠云数栈产品经理潮汐带来了…

Windows配置NTP时间同步

Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具&#xff1a;w32tm3.2 控制面板中的设置 4. 高级设置&#xff08;Windows Server 环境&#xff09;5.调整时间同步的间隔5.1 通过组策略调整时…

系统安全第七次作业题目及答案

一、 1.RBAC0 RBAC1 RBAC2 RBAC3 2.属性 身份标识 3.接入访问控制 资源访问控制 网络端口和节点的访问控制 二、 1.B 2.A 3.ABE 4.BCD 5.ABC 三、 1. 答&#xff1a;基于属性的访问控制&#xff08;ABAC&#xff09;是通过对实体属性添加约束策略的方式实现主、客体之…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class)&#xff0c;Go 语言的结构体(st…

Node(节点)、Menu(菜单) 和 Tab(标签页)之间的关系

在系统开发中&#xff0c;尤其是在涉及到前端界面设计和后台管理系统时&#xff0c;我们经常会看到 Node&#xff08;节点&#xff09;、Menu&#xff08;菜单&#xff09; 和 Tab&#xff08;标签页&#xff09; 这几个概念。这些概念有不同的用途和功能&#xff0c;理解它们之…

C# WPF 打印机

C# WPF 打印机 打印机接口打印文本打印图片打印机属性对话框设置默认打印机搜索打印机 打印机接口 PrintServerPrintQueuePrintDocument 打印文本 /// <summary> /// 打印文本 /// </summary> /// <param name"text"></param> /// <pa…

Python数据分析案例64——杭帮菜美食探索数据分析可视化

案例背景 杭州是真没啥美食呀.....但是 总是还是有好吃的店家&#xff0c;于是就发挥专业长处&#xff0c;进行一下分析&#xff0c;看看杭帮菜的一些特点。。例如看看品种分布啊&#xff0c;类型分布啊&#xff0c;行政区的分布啊&#xff0c;店铺评分的一些分布啊&#xff0…

基于SSD模型的路面坑洼检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于SSD模型的路面坑洼检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于SSD模型的路面坑洼检测系统是在 Py…

《Python编程实训快速上手》第四天--字符串操作

一、处理字符串 1、单引号和双引号 Python中单双引号均可以表示字符串&#xff0c;区别在于&#xff1a; 1、双引号中可以使用到单引号 2、单引号字符串中如果要使用单引号&#xff0c;要使用到转义字符 \ \ \t \n \\ 原始字符串 在开始的引号前加r&#xf…

泷羽sec学习打卡-Windows基础命令

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows的那些事儿-Base 一、Windows-BaseWindows有哪些版本呢&#xff0c;有什么区别呢&#xff1f…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力&#xff0c;我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束&#xff0c;欢迎大家评论区…

Java与HTML:构建静态网页

在Web开发领域&#xff0c;HTML是构建网页的基础标记语言&#xff0c;而Java作为一种强大的编程语言&#xff0c;也能够在创建HTML内容方面发挥重要作用。今天&#xff0c;我们就来探讨一下如何使用Java来制作一个不那么简单的静态网页。 一、项目准备 首先&#xff0c;我们需…