Clickhouse第一讲-CK概述

常用的数据架构

Clickhouse第一讲-CK概述_第1张图片

OLAP场景

绝大多数是读请求。 
数据以相当大的批次(> 1000 行)更新,而不是单行更新;或者根本没有更新。 
已添加到数据库的数据不能修改。 
对于读取,从数据库中提取相当多的行,但只提取列的一小部分。 
宽表,即每个表包含着大量的列。 
查询相对较少(通常每台服务器每秒查询数百次或更少)。 
对于简单查询,允许延迟大约 50 毫秒。 
列中的数据相对较小:数字和短字符串(例如,每个 URL 60 个字节)。  处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)。

事务不是必须的。 
对数据一致性要求低。有副本情况下,写入一个即可,后台自动同步。

每个查询有一个大表。除了他以外,其他的都很小。

查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的 RAM 中

行存储与列存储 

Clickhouse第一讲-CK概述_第2张图片

行存储在数据写入和修改上的优势

行存储的写入是一次完成的,如果这种写入建立在操作系统的文件系统上,可以保证写 入过程的成功或者失败,可以保证数据的完整性。列式存储需要把一行记录拆分成单列保存, 写入次数明显比行存储多(因为磁头调度次数多,而磁头调度是需要时间的,一般在 1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际消耗更大。 数据修改实际上也是一次写入过程,不同的是,数据修改是对磁盘上的记录做删除标记。 行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行 存储的列数倍。 所以,行式存储在数据写入和修改上具有很大优势。

列式存储在数据读取和解析、分析数据上具有优势

数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会 存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。列存储 每次读取的数据是集合的一段或者全部,不存在冗余性问题。 列式存储中的每一列数据类型是相同的,不存在二义性问题,例如,某列类型为整型 int,那么它的数据集合一定是整型数据,这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据 类型之间频繁转换,这个操作很消耗 CPU,增加了解析的时间。

所以,列式存储在数据读取和解析数据做数据分析上更具优势。
综上所述,行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的
完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略,数
量大可能会影响到数据的处理效率。列存储在写入效率、保证数据完整性上都不如行存储,
它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域比
较重要。一般来说一个 OLAP 类型的查询可能需要访问几百万或者几十亿行的数据,但是
OLAP 分析时只是获取少数的列,对于这种场景列式数据库只需要读取对应的列即可,行式
数据库需要读取所有的数据列,因此这种场景更适合列式数据库,可以大大提高 OLAP 数据
分析的效率。 ClickHouse 就是一款使用列式存储的数据库,数据按列进行组织,属于同
一列的数据会被保存在一起,列与列之间也会由不同的文件分别保存,在对 OLAP 场景分析
时,效率很高。

CK的数据压缩

ClickHouse 默认 使用 LZ4 算法压缩,数据总体压缩比可达 8:1
ClickHouse 采用列式存储,列式存储相对于行式存储另一个优势就是对数据压缩的
友好性。例如:有两个字符串“ABCDE”,“BCD ”,现在对它们进行压缩:

 通过以上案例可以看到,压缩的本质是按照一定步长对数据进行匹配扫描,当发现重复 部分的时候就进行编码转换。例如:(5,3)代表从下划线往前数 5 个字节,会匹配上 3 个 字节长度的重复项,即:“BCD”。当然,真实的压缩算法比以上举例更复杂,但压缩的本 质就是如此,数据中重复性项越多,则压缩率越高,压缩率越高,则数据体量越小,而数据 体量越小,则数据在网络中的传输越快,对网络带宽和磁盘 IO 的压力也就越小。

列式存储中同一个列的数据由于它们拥有相同的数据类型和现实语义,可能具备重复项 的可能性更高,更利于数据的压缩。所以 ClickHouse 在数据压缩上比例很大。

向量化执行引擎(SIMD)-SSE4.2指令集【数据并行】

Clickhouse第一讲-CK概述_第3张图片

在计算机系统的体系结构中,存储系统是一种层次结构,典型服务器计算机的存储层次
结构如上图,上图表述了 CPU CPU 三级缓存、内存、磁盘数据容量与数据读取速度对比,
我们可以看出存储媒介距离 CPU 越近,则访问数据的速度越快。
由上图可知,从内存读取数据速度比磁盘读取数据速度要快 1000 倍,从 CPU 缓存中 读取数据的速度比从内存中读取数据的速度最快要快 100 倍,从 CPU 寄存器中读取数据的 速度为 300ps(1000ps 皮秒 = 1ns),比 CPU 缓存要快 3 倍还多。从寄存器中访问数据 的速度,是从内存访问数据速度的 300 倍,是从磁盘中访问数据速度的 30 万倍。 如果能从 CPU 寄存器中访问数据对程序的性能提升意义非凡,向量化执行就是在寄存 器层面操作数据,为上层应用程序的性能带来了指数级的提升。
何为向量化执行?向量化执行,可以简单地看作一项消除程序中循环的优化。
为了 制作 n 杯果汁,非向量化执行的方式是用 1 台榨汁机重复循环制作 n 次,而向量化执行的
方式是用 n 台榨汁机只执行 1 次。
Clickhouse第一讲-CK概述_第4张图片
为了实现向量化执行,需要利用 CPU SIMD 指令, SIMD 的全称是 Single
Instruction Multiple Data ,即用单条指令操作多条数据。现代计算机系统概念中,
它是通过数据并行以提高性能的一种实现方式 ( 其他的还有指令级并行和线程级并行 ) ,它
的原理是在 CPU 寄存器层面实现数据的并行操作。 ClickHouse 列式存储除了降低 IO 和存储的压力之外,还为向量化执行做好了铺垫, 除了读取磁盘速度快之外, ClickHouse 还利用 SSE4.2 指令集实现向量化执行,为处理 数据提升很大效率。

CLICKHOUSE支持的类型

支持关系模型和标准SQL查询,大小写敏感

ClickHouse完全使用 SQL 作为查询语言(支持 GROUP BY、ORDER BY、JOIN、IN 等大部分标准 SQL),ClickHouse 提 供了标准协议的 SQL 查询接口,可以与第三方分析可视化系统无缝集成对接。在 SQL 解析 方面,ClickHouse 是大小写敏感,SELECT a 和 SELECT A 所代表的语义不同。

支持多样化的表引擎

支持多线程和分布式

向量化执行是通过数据级并行的方式提升了性能,多线程处理是通过线程级并行的方式
实现了性能的提升。相比基于底层硬件实现的向量化执行 SIMD ,线程级并行通常由更高层
次的软件层面控制,目前市面上的服务器都支持多核心多线程处理能力。由于 SIMD 不适合
用于带有较多分支判断的场景, ClickHouse 也大量使用了多线程技术以实现提速,以此
和向量化执行形成互补。 ClickHouse 在数据存取方面,既支持分区 ( 纵向扩展,利用多线
程原理 ) ,也支持分片 ( 横向扩展,利用分布式原理 ) ,可以说是将多线程和分布式的技术
应用到了极致。
Clickhouse第一讲-CK概述_第5张图片

ClickHouse则采用Multi-Master 多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果。这 种多主的架构有许多优势,例如对等的角色使系统架构变得更加简单,不用再区分主控节点、 数据节点和计算节点,集群中的所有节点功能相同。所以它天然规避了单点故障的问题,非 常适合用于多数据中心、异地多活的场景。

交互式查询

数据分片与分布式查询

数据分片是将数据进行横向切分,这是一种在面对海量数据的场景下,解决存储和查询
瓶颈的有效手段,是一种分治思想的体现。 ClickHouse 支持分片,而分片则依赖集群。
每个集群由 1 到多个分片组成,而每个分片则对应了 ClickHouse 1 个服务节点。分片
的数量上限取决于节点数量( 1 个分片只能对应 1 个服务节点)。
ClickHouse 拥有高度自动化的分片功能。 ClickHouse 提供了本地表 ( Local
Table )与分布式表( Distributed Table )的概念。一张本地表等同于一份数据的分
片。而分布式表本身不存储任何数据,它是本地表的访问代理,其作用类似分库中间件。借
助分布式表,能够代理访问多个数据分片,从而实现分布式查询

CLICKHOUSE安装

  Clickhouse 仅支持 Linux 系统 且 cpu 必须支持 SSE4.2 指令集,可以通过以下命令查询 Linux 是否支持
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE   4.2 not supported"
服务器不支持 SSE4.2 指令集,则不能下载预编译安装包,需要通过源码编译特 定版本进行安装。

单节点安装

rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm

rpm -ivh ./clickhouse-*.rpm

配置文件

/etc/clickhouse-server : 服务端的配置文件目录,包括全局配置 config.xml 和用户配置 users.xml。  /var/lib/clickhouse : 默认的数据存储目录,通常会修改,将数据保存到大容 量磁盘路径中。  /var/log/cilckhouse-server : 默认保存日志的目录,通常会修改,将数据保 存到大容量磁盘路径中。  在/usr/bin 下会有可执行文件: clickhouse:主程序可执行文件
clickhouse-server:一个指向 clickhouse 可执行文件的软连接,供服务端启动 使用。
clickhouse-client:一个指向 clickhouse 可执行文件的软连接,供客户端启动 使用

启动&停止服务

启动 clickhouse-server 服务:service clickhouse-server start
client 客户端连接到 ch 服务:clickhouse-client
client客户端使用的命令:clickhouse-client --host localhost --port 9000
查看9000端口占用情况:yum install net-tools
查看端口是否启动:netstat -tunlp  | grep 9000
停止ClickHouse服务:service clickhouse-server stop

分布式安装

1、选择三台 clickhouse 节点,在每台节点上安装 clickhouse 需要的安装包
2、需要使用 Zookeeper 去实现集群副本之间的同步
3、配置外网可以访问:在每台 clickhouse 节点中配置/etc/clickhouse-server/config.xml 文
::

4、在每台./etc目录下面创建metrika.xml文件 编辑文件中的内容

Clickhouse第一讲-CK概述_第6张图片

Clickhouse第一讲-CK概述_第7张图片

Clickhouse第一讲-CK概述_第8张图片

配置文件说明:

clickhouse_remote_servers
clickhouse 集群配置标签,固定写法。
clickhouse_cluster_3shards_1replicas:
配置 clickhouse 的集群名称,可自由定义名称,注意集群名称中不能包含点号。这
里代表集群中有 3 个分片,每个分片有 1 个副本。
分片是指包含部分数据的服务器,要读取所有的数据,必须访问所有的分片。
副本是指存储分片备份数据的服务器,要读取所有的数据,访问任意副本上的数据即可。
shard
分片,一个 clickhouse 集群可以分多个分片,每个分片可以存储数据,这里 分片可
以理解为 clickhouse 机器中的每个节点 。这里可以配置一个或者任意多个分片,在每个
分片中可以配置一个或任意多个副本,不同分片可配置不同数量的副本。如果只是配置一个
分片,这种情况下查询操作应该称为远程查询,而不是分布式查询。
replica
每个分片的副本,默认每个分片配置了一个副本。也可以配置多个。如果配置了副本,
读取操作可以从每个分片里选择一个可用的副本。如果副本不可用,会依次选择下个副本进
行连接。该机制利于系统的可用性。
internal_replication
默认为 false, 写数据操作会将数据写入所有的副本,设置为 true, 写操作只会选择
一个正常的副本写入数据,数据的同步在后台自动进行。

zookeeper-servers
配置的 zookeeper 集群
macros
区分每台 clickhouse 节点的宏配置,每台 clickhouse 需要配置不同名称。

networks
这里配置 ip 为“ ::/0 ”代表任意 IP 可以访问,包含 IPv4 IPv6
注意:允许外网访问还需配置 /etc/clickhouse-server/config.xml 参照第三 步骤
clickhouse_compression
MergeTree 引擎表的数据压缩设置, min_part_size :代表数据部分最小大小。
min_part_size_ratio :数据部分大小与表大小的比率。 method :数据压缩格式。
注意:需要在每台 clickhouse 节点上配置 metrika.xml 文件,并且修改每个节点
macros 配置名称。
在每台节点上启动 clickhouse 服务
首先启动 zookeeper 集群,然后分别在 node1 node2 node3 节点上启动
clickhouse 服务,这里每台节点和单节点启动一样。启动之后, clickhouse 集群配置
完成
在每台机器上启动clickhouse服务
service clickhouse-server start
检查集群配置是否完成: node1 node2 node3 任意一台节点进入 clickhouse 客户端,查询集群配置
clickhouse-client
select * from system.clusters;
rpm包的其他安装方式
yum -y install yum-utils
rpm --import  https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
yum -y install clickhouse-server clickhouse-client
centeros7中yum源安装启动ck的命名为:systemctl start clickhouse-server

客户端链接CK的方式

Clickhouse第一讲-CK概述_第9张图片

--host -h:
使 用 -h 指 定 ip 或 者 host 名 称 时 , 需 要 在
/etc/clickhouse-server/config.xml 配 置 文 件 中 114 行 配 置 :
:: ,代表可以任意 ip 可访问。配置完成后需要重启
当期 clickhouse 节点生效。
--query -q
clickhouse-client -q "show databases"
--database, -d:
clickhouse-client -d "system" -q "show tables"
--multiline, -m:
clickhouse-client -m
select
:-] 1+1
:-] ;
--time, -t:
clickhouse-client -t -q "show databases"
--stacktrace:
clickhouse-client --stacktrace
--multiquery -n
clickhouse-client  -n -q "show databases;use  default;"

你可能感兴趣的:(CK,p2p,linq,sql)