这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
ClickHouse列存储
本节课程分为四个部分
- 数据库基本概念
- 列式存储
- ClickHouse存储设计
- ClickHouse典型应用场景
列式存储
所谓列* 式*存储 ,指存储结构化数据时,在底层的存储介质上,数据时以列的方式来组织的,即存储完若干条记录的首个字段后,再存储这些记录的第二个字段,然后是这些记录的第三个字段,以此类推,当这些记录的所有字段存储完毕后,再按照这种方式,组织存储下一批若干条记录的所有字段;
基于列的存储自然有以下优点:
-自动索引
因为列存储是基于列的,所以每个列本身就是一个索引。因此,当您做一些需要索引的事情时,您不需要额外的数据结构来为这一列创建适当的索引。
—方便数据压缩
它有利于压缩有两个原因。首先,您会注意到列中的大部分数据都是重复的。例如,由于同一作者发布了多个博客,作者列中所有值的基数必须小于博客的数量。因此,没有必要在作者列的存储中存储如此大量的博客。二是同一列数据类型一致,这有利于优化压缩数据结构填充,而对于数字列数据类型可以采取更有利的算法进行压缩存储。
ClickHouse存储设计
整个集群被划分为多个shard (shard),不同shard的数据相互隔离。一个分片中可以配置一个或多个副本(replicas)。私有复制协议用于确保彼此的两个副本之间的最大一致性。
ClickHouse基于表引擎将表分为本地表和分布式表,在构建表时,需要在所有节点上分别创建这两个表。本地表只负责写入和查询当前服务器上的请求;另一方面,分布式表分解写请求和查询请求,将它们分发到所有服务器,并最终根据特定的规则汇总请求结果。
ClickHouse写链接
ClickHouse提供了两种写作方法:1)写表面;2)编写分布式表。
在这种模式下,服务层必须知道所有底层服务器的IP地址,并自行处理数据分片。由于每个节点都可以直接单独写,这种方法使得集群的总体写容量完全与节点数量成比例,从而提供了非常高的吞吐量和定制灵活性。然而,相对而言,它也增加了服务层的依赖性,并引入了更多的复杂性。特别是节点故障转移的容错处理、扩展和减少数据的重新平衡、写和查询需要使用不同的表引擎等,都需要在服务中自行处理。
另一方面,编写分布式表相对简单。服务层只需要将数据写入单个端点和单个分布式表,而不需要知道底层服务器拓扑等实现细节。编写分布式表还可以提供高性能。对于写吞吐量要求不高的场景,建议使用分布式表,降低业务复杂度。