clickhouse 入门介绍和预演

一:简介

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

简称CK, 与Hadoop, Spark相比,ClickHouse很轻量级,由俄罗斯第一大搜索引擎Yandex于2016年6月15日开源, 开发语言为C++这对保守俄罗斯人来说是个特大事。更让人惊讶的是,这个列式存储数据库的跑分要超过很多流行的商业MPP数据库软件,例如Vertica如果你没有听过Vertica,那你一定听过 Michael Stonebraker,2014年图灵奖的获得者,PostgreSQL和Ingres发明者(Sybase和SQL Server都是继承Ingres而来的), Paradigm4和SciDB的创办者。Michael Stonebraker于2005年创办Vertica公司,后来该公司被惠普收购,惠普 Vertica成为MPP列式存储商业数据库的高性能代表,Facebook就购买了Vertica数据用于用户行为分析。简单的说,ClickHouse作为分析型数据库,有三大特点:一是跑分快,二是功能多,三是文艺范

Yandex.Metrica目前已经成为世界第三大Web流量分析平台,每天处理超过200亿个跟踪事件。能够拥有如此惊人的体量,在它背后提供支撑的ClickHouse功不可没。ClickHouse已经为Yandex.Metrica存储了超过20万亿行的数据,90%的自定义查询能够在1秒内返回,其集群规模也超过了400台服务器。

与Hadoop生态的其他数据库相比,ClickHouse更像一款"传统"MPP架构的数据库,它没有采用Hadoop生态中常用的主从架构,而是使用了多主对等网络结构,同时它也是基于关系模型的ROLAP方案如果把数据库比作汽车,那么ClickHouse俨然就是一辆手动挡的赛车。

ClickHouse的特点:

1.真正的面向列的DBMS

在一个真正的面向列的DBMS中,没有任何“垃圾”存储在值中。

作为一个DBMS,它具备了一些基本功能,如下所示。

DDL ( 数据定义语言 ):可以动态地创建、修改或删除数据库、表和视图,而无须重启服务。

DML ( 数据操作语言 ):可以动态查询、插入、修改或删除数据。

权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。

数据备份与恢复:提供了数据备份导出与导入恢复机制,满足生产环境的要求。

分布式管理:提供集群模式,能够自动管理多个数据库节点。

这里只列举了一些最具代表性的功能,但已然足以表明为什么Click House称得上是DBMS了。

2.数据压缩

ClickHouse就是一款使用列式存储的数据库,数据按列进行组织,属于同一列的数据会被保存在一起,列与列之间也会由不同的文件分别保存 ( 这里主要指MergeTree表引擎 )。数据默认使用LZ4算法压缩,在Yandex.Metrica的生产环境中,数据总体的压缩比可以达到8:1 ( 未压缩前17PB,压缩后2PB )。列式存储除了降低IO和存储的压力之外,还为向量化执行做好了铺垫。

3.磁盘存储的数据

许多的列式数据库(如 SAP HANA, Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果有可以使用SSD和内存,它也会合理的利用这些资源。

4.多核并行处理

多核多节点并行化大型查询。

5.在多个服务器上分布式处理

上面列出的列式DBMS几乎都不支持分布式处理。在ClickHouse中,数据可以驻留在不同的分片上。每个分片可以是用于容错的一组副本。查询在所有分片上并行处理。这对用户来说是透明的。

6.SQL支持

ClickHouse支持基于SQL的声明式查询语言,该语言大部分情况下是与SQL标准兼容的。

支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。

不支持窗口函数和相关子查询。

7.向量化引擎

数据不仅按列存储,而且由矢量 – 列的部分进行处理。这使我们能够实现高CPU性能。

向量化执行,可以简单地看作一项消除程序中循环的优化。

为了实现向量化执行,需要利用CPU的SIMD指令。SIMD的全称是Single Instruction Multiple Data,即用单条指令操作多条数据。现代计算机系统概念中,它是通过数据并行以提高性能的一种实现方式 ( 其他的还有指令级并行和线程级并行 ),它的原理是在CPU寄存器层面实现数据的并行操作。

在计算机系统的体系结构中,存储系统是一种层次结构。典型服务器计算机的存储层次结构如图1所示。一个实用的经验告诉我们,存储媒介距离CPU越近,则访问数据的速度越快。

从上图中可以看到,从左向右,距离CPU越远,则数据的访问速度越慢。从寄存器中访问数据的速度,是从内存访问数据速度的300倍,是从磁盘中访问数据速度的3000万倍。

所以利用CPU向量化执行的特性,对于程序的性能提升意义非凡。

8.实时数据更新

ClickHouse支持主键表。为了快速执行对主键范围的查询,数据使用合并树(MergeTree)进行递增排序。由于这个原因,数据可以不断地添加到表中。添加数据时无锁处理。

9.索引

例如,带有主键可以在特定的时间范围内为特定客户端(Metrica计数器)抽取数据,并且延迟时间小于几十毫秒。

10.支持在线查询

这让我们使用该系统作为Web界面的后端。低延迟意味着可以无延迟实时地处理查询,而Yandex.Metrica界面页面正在加载(在线模式)。

11.支持近似计算

<1>系统包含用于近似计算各种值,中位数和分位数的集合函数。

<2>支持基于部分(样本)数据运行查询并获得近似结果。在这种情况下,从磁盘检索比例较少的数据。

<3>支持为有限数量的随机密钥(而不是所有密钥)运行聚合。在数据中密钥分发的特定条件下,这提供了相对准确的结果,同时使用较少的资源。

12.数据复制和对数据完整性的支持。

使用异步多主复制。写入任何可用的副本后,数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据。数据在失败后自动恢复

clickHouse的性能:

低延迟:对于数据量(几千行,列不是很多)不是很大的短查询,如果数据已经被载入缓存,且使用主码,延迟在50MS左右。
并发量:虽然 ClickHouse 是一种在线分析型数据库,也可支持一定的并发。当单个查询比较短时,官方建议 100 Queries / second。
写入速度:在使用 MergeTree 引擎的情况下,写入速度大概是 50 – 200 M / s,如果按照 1 K 一条记录来算,大约每秒可写入 50000 ~ 200000 条记录每秒。如果每条记录比较小的话写入速度会更快

其主要的应用场景:

<1>读多于写

<2>大宽表,读大量行但是少量列,结果集较小

<3>数据批量写入,且数据不更新或少更新

<4>无需事务,数据一致性要求低

<5>灵活多变,不适合预先建模

用于结构良好清晰且不可变的事件或日志流分析

需要注意的是: 由于clickHouse不支持事务操作, 顾不能作为传统数据库来使用(OLTP),以及高请求率的键值访问,Blob或文档存储,超标准化数据

缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据

稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。

二,架构

核心模块如下:

具体参考官网:https://clickhouse.tech/docs/zh/development/architecture/

三,引擎表级

不同的引擎用各种不同的技术存储在文件(或者内存)中。

这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平。

1. TinyLog

最简单的一种引擎,每一列保存为一个文件,里面的内容是压缩过的,不支持索引,没有并发控制。所以,当你需要在读,又在写时,读会出错。并发写,内容都会坏掉。 应用场景基本上就是那种只写一次,然后就是只读的场景。同时,它也不适用于处理量大的数据,官方推荐,使用这种引擎的表最多 100 万行的数据。 因为这种引擎的实现非常简单,所以当你有很多很多的小表数据要处理时,使用它是比较合适的,最基本的,它在磁盘上的文件量很少,读一列数据只需要打开一个文件就好了。

2. Log

TinyLog 基本一致,它的改进点,是加了一个 __marks.mrk 文件,里面记录了每个数据块的偏移,这种做的一个用处,就是可以准确地切分读的范围,从而使用并发读取成为可能。 但是,它是不能支持并发写的,一个写操作会阻塞其它读写操作。

3. Merge

工具引擎,本身不保存数据,类似视图,只用于把指定库中的指定多个表链在一起。这样,读取操作可以并发执行,同时也可以利用原表的索引,但是,此引擎不支持写操作。 指定引擎的同时,需要指定要链接的库及表,库名可以使用一个表达式,表名可以使用正则表达式指定。 _table 这个列,是因为使用了 Merge 多出来的一个的一个 虚拟列 ,它表示原始数据的来源表,它不会出现在 show table 的结果当中,同时, select * 不会包含它。

4. Distributed

Merge 可以看成是单机版的 Distributed ,而真正的 Distributed 具备跨服务器能力,当然,机器地址的配置依赖配置文件中的信息。

5. Memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,不支持索引,简单查询下有非常非常高的性能表现,一般用来测试 Buffer:像是 Memory 存储的一个上层应用似的(磁盘上也是没有相应目录的)。它的行为是一个缓冲区,写入的数据先被放在缓冲区,达到一个阈值后,这些数据会自动被写到指定的另一个表中。没有索引。可以设置阈值,若一次性数据量大于阈值,则直接写入表。“友好重启”时, Buffer 数据会先落到源表,“暴力重启”, Buffer 表中的数据会丢失。

6. Null

空引擎,写入的任何数据都会被忽略,读取的结果一定是空。

7. Set

只用在 IN 操作符右侧,你不能对它 select。语法比较复杂,是全内存运行的,但是相关数据会落到磁盘上保存,启动时会加载到内存中

8. Join

跟 Set 类似 只用在join右侧

9. MergeTree

支持一个日期和一组主键的两层式索引,可以实时更新数据,支持直接采样功能。tree /data/clickhouse/data/default/ 文件在/data/clickhouse/data/default(schema)/(tablename)/.bin(列文件) .mrk(块偏移量) primary.idx主键索引 。

10. ReplacingMergeTree

在 MergeTree 的基础上,添加了“处理重复数据”的功能,在最后加一个“版本列”,它跟时间列配合一起,用以区分哪条数据是“新的”,并把旧的丢掉(这个过程是在 merge 时处理,不是数据写入时就处理了的,平时重复的数据还是保存着的,并且查也是跟平常一样会查出来的,所以在 SQL 上排序过滤 Limit 什么的该写还是要写的)。同时,主键列组用于区分重复的行。“版本列”允许的类型是, UInt 一族的整数,或 Date 或 DateTime。

11. SummingMergeTree

就是在 merge 阶段把数据加起来了,当然,哪些列要加(一般是针对可加的指标)可以配置,不可加的列,会取一个最先出现的值。可加列不能是主键中的列,并且如果某行数据可加列都是 null ,则这行会被删除。

12. AggregatingMergeTree

聚合数据的预计算,聚合数据的增量计算的情况。对于 AggregatingMergeTree 引擎的表,不能使用普通的 INSERT 去添加数据,那怎么办?一方面可以用 INSERT SELECT 来插入数据,更常用的,是可以创建一个物化视图。

四,稀疏索引

四维云10.60.150.218服务器

tree /data/clickhouse/data/default/

图上左边的结构图为/data/clickhouse/data/default(schema)/(tablename)/.bin(列文件) .mrk(块偏移量) primary.idx主键索引

主键是有序数据的稀疏索引。我们用图的方式看一部分的数据(原则上,图中应该保持标记的平均长度,但是用ASCI码的方式不太方便)。 mark文件,就像一把尺子一样。主键对于范围查询的过滤效率非常高。对于查询操作,CK会读取一组可能包含目标数据的mark文件。

MergeTree引擎中,默认的index_granularity(索引粒度)设置是8192;

在CH里,主键索引用的并不是B树,而是稀疏索引。

每隔8192行数据,是1个block 主键会每隔8192,取一行主键列的数据,同时记录这是第几个block 查询的时候,如果有索引,就通过索引定位到是哪个block,然后找到这个block对应的mrk文件 mrk文件里记录的是某个block的数据集,在整列bin文件的哪个物理偏移位置 加载数据到内存,之后并行化过滤 索引长度越低,索引在内存中占的长度越小,排序越快,然而区分度就越低。这样不利于查找。 索引长度越长,区分度就高,虽然利于查找了,但是索引在内存中占得空间就多了。

五,搭建

官网 https://clickhouse.tech/#quick-start

clickhouse集群的理想方案是如下所示:

这里有3个集群,每个集群n个节点,每个节点的数据依靠zookeeper协调同步,比如cluster1提供服务,如果cluster1里面挂掉多台机器那么cluster2的副本可以切换过来提供服务,如果cluster2的分片再挂了,那么cluster3中的副本也可以提供服务,cluster1~3同时挂掉的概率就非常小了,所以集群的稳定性可以非常高,其中单个集群的节点个数n决定了clickhouse的性能,性能是可以线性扩展的,具体副本集群的个数根据机器资源配置.

如果机器资源确实特别少,想每个节点都用上提供服务的话,那么可以每个节点存储两个以上的副本,即提供服务的分片和其他机器的副本,实现相互备份,但是clickhouse不支持单个节点多个分片的配置,我们可以人为设置在每个节点上启动两个实例来实现,设计图如下:

可以看出来3个节点每个节点的tcp 9000对外提供服务,9001提供副本,其中2提供1的备份,3提供2的备份,1提供3的备份,这样假设挂掉1个节点,集群也可以正常使用,但是挂掉2个几点,就不正常了,这样的话是机器越多越稳定一些.

上面两种方案,官网上还是推荐的第一种方案可用性最高,这里为了演示采用第二种方式配置,其实两种方式的配置是完全一样的,

(10.60.150.218,10.60.150.219) 服务器单机搭建 version 20.5.4

1,root安装

sudo yum install yum-utils

sudo rpm –import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG

sudo yum-config-manager –add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo

sudo yum install clickhouse-server clickhouse-client

  1. 修改配置文件

ClickHouse有几核心的配置文件:

config.xml 端口配置、本地机器名配置、内存设置等

metrika.xml 集群配置、ZK配置、分片配置等(这些配置也可直接配置到config.xml

users.xml 权限、配额设置

单机部署需要修改以下文件

/etc/clickhouse-server/config.xml

替换文件中/var/lib/clickhouse/为/data/clickhouse/ (/data/clickhouse/为数据存储目录)

修改服务器的配置文件/etc/clickhouse-server/config.xml,第65行,放开注释即可(放开远程访问)

<listen_host>::</listen_host>

修改 /etc/clickhouse-server/users.xml (单次查询使用的最大内存量)

<max_memory_usage>10000000000</max_memory_usage>

每个个节点多实例多副本集群部署需要修改以下文件

具体为什么这样配置可以参考clickhouse-server/config.xml就能明白,有这么一段被注释的配置说明:

<!– If element has 'incl' attribute, then for it's value will be used corresponding substitution from another file.

By default, path to file with substitutions is /etc/metrika.xml. It could be changed in config in 'include_from' element.

Values for substitutions are specified in /yandex/name_of_substitution elements in that file.

–>

<1>复制启动脚本,启动脚本路径:/etc/init.d/clickhouse-server

cp /etc/init.d/clickhouse-server /etc/init.d/clickhouse-server2

主要修改clickhouse-server2脚本中配置文件位置和pid文件位置

配置文件比如使用config1.xml,pid使用clickhouse-server-1.pid

<2>修改 /etc/clickhouse-server/config.xml

进入到配置文件目录,将原有配置文件拷贝一份,这里是config1.xml,

首先 cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config1.xml

然后重点修改配置:

主要修改内容是:日志文件(和之前不要冲突)、http端口、tcp端口、副本同步端口

(这个改完之后clickhouse按照当前实例的端口自动和其他实例同步)、数据文件和tmp目录、users.xml(这个如果都一样可以用同一个)、

最后就是集群配置了,下面重点叙述:

集群配置默认为:<remote_servers incl="clickhouse_remote_servers" />

zookeeper默认为:<zookeeper incl="zookeeper-servers" optional="true" />

macros默认为:<macros incl="macros" optional="true" />

首先是集群分片的配置,这个配置所有节点的所有实例完全保持一致:

<remote_servers>

<perftest_2shards_2replicas>

<shard>

<weight>1</weight>

<internal_replication>true</internal_replication>

<replica>

<host>s02</host>

<port>9000</port>

</replica>

<replica>

<host>s03</host>

<port>9001</port>

</replica>

</shard>

<shard>

<weight>1</weight>

<internal_replication>true</internal_replication>

<replica>

<host>s03</host>

<port>9000</port>

</replica>

<replica>

<host>s02</host>

<port>9001</port>

</replica>

</shard>

</perftest_2shards_2replicas>

</remote_servers>

配置里面的<perftest_2shards_2replicas>是分布式标识标签,可以自定义,到最后创建分布式表的时候会用到;然后weight是分片权重,

即写数据时有多大的概率落到此分片,因为这里所有分片权重相同所有都设置为1,然后是internal_replication,表示是否只将数据写入

其中一个副本,默认为false,表示写入所有副本,在复制表的情况下可能会导致重复和不一致,所以这里一定要改为true,clickhouse分

布式表只管写入一个副本,其余同步表的事情交给复制表和zookeeper来进行,然后是replica配置这个好理解,就是一个分片下的所有副本,

这里副本的分布一定要手动设计好,保证相互备份,然后再次说明是所有的节点配置一致. 此部分配置严格按照官网配置,

参考链接:https://clickhouse.yandex/docs/en/operations/table_engines/distributed/

然后是zookeeper配置,这个也是所有示例配置都一样:

<zookeeper optional="true">

<node index="1">

<host>m01</host>

<port>2181</port>

</node>

<node index="2">

<host>s01</host>

<port>2181</port>

</node>

<node index="3">

<host>s02</host>

<port>2181</port>

</node>

</zookeeper>

然后是复制标识的配置,也称为宏配置,这里唯一标识一个副本名称,每个实例都要配置并且都是唯一的,这里配置如下:

clickhouse1 9000 分片1, 副本1:

<macros optional="true">

<layer>01</layer>

<shard>01</shard>

<replica>cluster01-01-1</replica>

</macros>

clickhouse1 9001 分片2, 副本2:

<macros>

<layer>01</layer>

<shard>02</shard>

<replica>cluster01-02-2</replica>

clickhouse2 9000 分片2, 副本1:

<macros>

<layer>01</layer>

<shard>02</shard>

<replica>cluster01-02-1</replica>

</macros>

clickhouse2 9001 分片1, 副本2:

<macros>

<layer>01</layer>

<shard>01</shard>

<replica>cluster01-01-2</replica>

</macros>

由上面配置可以看到replica的分布规律,其中layer是双级分片设置,在Yandex公司的集群中用到,

因为我们这里是单集群所以这个值对我们没有影响全部一样即可,这里是01;然后是shard表示分片编号;

最后是replica是副本标识,这里使用了cluster{layer}-{shard}-{replica}的表示方式,比如cluster01-02-1表示cluster01

集群的02分片下的1号副本,这样既非常直观的表示又唯一确定副本. 副本的文档链接下面会给出.

3,启动服务

sudo /etc/init.d/clickhouse-server start

sudo /etc/init.d/clickhouse-server2 start

登录客户端

用clickhouse-client连接本机clickhouse-server服务器:

Clickhouse-client

用本机clickhouse-client连接远程clickhouse-server服务器:

clickhouse-client –host 10.60.150.218 –port 9000

clickhouse-client –host 10.60.150.218 –port 9001

clickhouse-client –host 10.60.150.219 –port 9000

clickhouse-client –host 10.60.150.219 –port 9001

4.验证集群

在每个节点启动clickhouse客户端,和单节点启动完全一样,查询集群信息

select * from system.clusters;

六,单机使用

1,建表

CREATE TABLE fact_user_trip_info(

trip_id String,

user_id String,

start_times Int64,

start_lon_lat String,

end_times Int64,

end_lon_lat String,

data_dt date

) ENGINE MergeTree() PARTITION BY toYYYYMM(data_dt) ORDER BY (user_id,trip_id) SETTINGS index_granularity=8192;

举例:

ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192

ENGINE – 引擎名和参数。 ENGINE = MergeTree(). MergeTree 引擎没有参数。

PARTITION BY — 分区键 。

要按月分区,可以使用表达式 `toYYYYMM(date_column)` ,这里的 `date_column` 是一个 [Date](../../../engines/table_engines/mergetree_family/mergetree.md) 类型的列。这里该分区名格式会是 `"YYYYMM"` 这样。

ORDER BY — 表的排序键。

可以是一组列的元组或任意的表达式。 例如: `ORDER BY (CounterID, EventDate)` 。

PRIMARY KEY – 主键,(如果要设成 跟排序键不相同的话设置,默认情况和排序键相同)。

默认情况下主键跟排序键(由 `ORDER BY` 子句指定)相同。

因此,大部分情况下不需要再专门指定一个 `PRIMARY KEY` 子句。

SAMPLE BY — 用于抽样的表达式。

如果要用抽样表达式,主键中必须包含这个表达式。例如:

`SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))` 。

SETTINGS — 影响 MergeTree 性能的额外参数:

index_granularity — 索引粒度。即索引中相邻『标记』间的数据行数。默认值,8192 。该列表中所有可用的参数可以从这里查看 MergeTreeSettings.h 。

index_granularity_bytes — 索引粒度,以字节为单位,默认值: 10Mb。如果仅按数据行数限制索引粒度, 请设置为0(不建议)。

enable_mixed_granularity_parts — 启用或禁用通过 index_granularity_bytes 控制索引粒度的大小。在19.11版本之前, 只有 index_granularity 配置能够用于限制索引粒度的大小。

当从大表(数十或数百兆)中查询数据时候,index_granularity_bytes 配置能够提升ClickHouse的性能。如果你的表内数据量很大,可以开启这项配置用以提升SELECT 查询的性能。

use_minimalistic_part_header_in_zookeeper — 数据片段头在 ZooKeeper 中的存储方式。如果设置了 use_minimalistic_part_header_in_zookeeper=1 ,ZooKeeper 会存储更少的数据。

min_merge_bytes_to_use_direct_io — 使用直接 I/O 来操作磁盘的合并操作时要求的最小数据量。合并数据片段时,ClickHouse 会计算要被合并的所有数据的总存储空间。如果大小超过了

min_merge_bytes_to_use_direct_io 设置的字节数,则 ClickHouse 将使用直接 I/O 接口(O_DIRECT 选项)对磁盘读写。如果设置 min_merge_bytes_to_use_direct_io = 0 ,则会禁用直接 I/O。

默认值:10 * 1024 * 1024 * 1024 字节。

merge_with_ttl_timeout — TTL合并频率的最小间隔时间。默认值: 86400 (1 天)。

write_final_mark — 启用或禁用在数据片段尾部写入最终索引标记。默认值: 1(不建议更改)。

storage_policy — 存储策略。

2,准备数据

下载hive行程数据作为测试数据(206395条)

INSERT OVERWRITE local DIRECTORY '/home/big_data/biwenjun/ckdata'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select

trip_id

,uid

,start_times

,regexp_replace(start_lon_lat,',',':')

,end_times

,regexp_replace(end_lon_lat,',',':')

,from_unixtime(unix_timestamp(data_dt,'yyyyMMdd'),'yyyy-MM-dd')

from fact_user_trip_info_dt

distribute by 1;

复制数据到clickhouse 所在服务器

scp -rv test.csv big_data@10.60.150.218:/home/big_data/biwenjun/clickhouse

3,导入CSV文件数据

cat test.csv | clickhouse-client –query="insert into default.fact_user_trip_info FORMAT CSV"

4,查询数据

echo 'select * from default.fact_user_trip_info' | clickhouse-client

七,集群使用

CK是如何实现分布式的

CK的分布式,完全依赖配置文件,即每个节点,都共享同样的配置文件,这个配置文件里,写了我跟谁是一个cluster的,我自己的名字是啥

集群怎么用?

答案是指定引擎

CK里的引擎有十几个,这里只推荐3个:

MergeTree,是CK里最Advanced的引擎,性能超高,单机写入可以达到50w峰值,查询性能非常快,有兴趣看我其他文章

ReplicatedMergeTree,基于MergeTree,同时引入ZK,做了复制,下文会说

Distributed,分布式引擎,本身不存储数据,可认为就是一张View,如果写入,会把请求丢到集群里的节点(有算法控制),如果查询,会帮你做查询转发再聚合返回

高可用原理:zookeeper + ReplicatedMergeTree(复制表) + Distributed(分布式表)

采用 ReplicatedMergeTree + Distributed引擎作为集群结构的引擎

ReplicatedMergeTree(zoo_path, replica_name,partition,primykey,8192)

zoo_path,zk路径(自动在zookeeper中创建),如果要相互复制,必须一样,

replica_name'副本名称, 必须不一样,

partition,分区

primykey,含有主键相关字段的元组,可以为单独列

8192,索引粒度)

Distributed(cluster, datebase, local_table, sharding_key)

cluster,需要写成在config里自定义的cluster名称

database,是分片数据库的名称

local_table,是分片本地表的名称 -最后一项sharding_key是选填的,可以是一个表达式,

例如rand(),也可以是某列 如user_id,不过该列必须是integer类型,

通过对该具体的值进行取余进行分片,如果担心这样没法均匀的进行分片,也可以加上hash函数,如intHash64(user_id)

1,建表

登录四个实例客户端

clickhouse-client –host 10.60.150.218 –port 9000

clickhouse-client –host 10.60.150.218 –port 9001

clickhouse-client –host 10.60.150.219 –port 9000

clickhouse-client –host 10.60.150.219 –port 9001

每个实例创建库

create database cktest;

use cktest;

各自创建表

实例1 9000

CREATE TABLE cktest.fact_user_trip_info_repli(

trip_id String,

user_id String,

start_times Int64,

start_lon_lat String,

end_times Int64,

end_lon_lat String,

data_dt date

) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/fact_user_trip_info_repli','cluster01-01-1',data_dt,(trip_id, data_dt),8192);

实例1 9001

CREATE TABLE cktest.fact_user_trip_info_repli(

trip_id String,

user_id String,

start_times Int64,

start_lon_lat String,

end_times Int64,

end_lon_lat String,

data_dt date

) ENGINE = ReplicatedMergeTree('/clickhouse/tables/02-01/fact_user_trip_info_repli','cluster01-02-2',data_dt,(trip_id, data_dt),8192);

实例2 9000

CREATE TABLE cktest.fact_user_trip_info_repli(

trip_id String,

user_id String,

start_times Int64,

start_lon_lat String,

end_times Int64,

end_lon_lat String,

data_dt date

) ENGINE = ReplicatedMergeTree('/clickhouse/tables/02-01/fact_user_trip_info_repli','cluster01-02-1',data_dt,(trip_id, data_dt),8192);

实例2 9001

CREATE TABLE cktest.fact_user_trip_info_repli(

trip_id String,

user_id String,

start_times Int64,

start_lon_lat String,

end_times Int64,

end_lon_lat String,

data_dt date

) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/fact_user_trip_info_repli','cluster01-01-2',data_dt,(trip_id, data_dt),8192);

注意引号部分只能用单引号,其中核心的地方是同一个分片在zookeeper上面的znode相同

创建分布式表,分布式表只是作为一个查询引擎,本身不存储任何数据,查询时将sql发送到所有集群分片,然后进行进行处理和聚合后将结果返回给客户端,因此clickhouse限制聚合结果大小不能大于分布式表节点的内存,当然这个一般条件下都不会超过;分布式表可以所有实例都创建,也可以只在一部分实例创建,这个和业务代码中查询的示例一致,建议设置多个,当某个节点挂掉时可以查询其他节点上的表,分布式表的建表语句如下:

CREATE TABLE fact_user_trip_info_all AS fact_user_trip_info_repli ENGINE = Distributed(perftest_2shards_2replicas, cktest, fact_user_trip_info_repli, rand());

2,准备数据

INSERT OVERWRITE local DIRECTORY '/home/big_data/biwenjun/ckdata/test'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select

trip_id

,uid

,start_times

,regexp_replace(start_lon_lat,',',':')

,end_times

,regexp_replace(end_lon_lat,',',':')

,'2020-08-25'

from fact_user_trip_info_dt

distribute by 1;

复制数据到clickhouse 所在服务器

scp 20200825.csv root@s03:/home/big_data/biwenjun/ckdata

3,导入CSV文件数据

cat 20200825.csv | clickhouse-client –query="insert into cktest.fact_user_trip_info_repli FORMAT CSV"

4,查询数据

select * from fact_user_trip_info_all where data_dt='2018-08-25' limit 1;

原文链接:https://blog.csdn.net/biwenjun999/article/details/108220600

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/7974

(0)
上一篇 2022年10月25日 05:40
下一篇 2022年10月25日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml