一.Clickhouse分区的概念
1.分区是表的分区,具体的DDL操作关键词是 PARTITION BY,指的是一个表按照某一列数据(比如日期)进行分区,对应到最终的结果就是不同分区的数据会写入不同的文件中。
2.ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区、对Enum类型的列直接每种取值作为一个分区等。
3.数据Partition在ClickHouse中主要有两方面应用:
在partition key上进行分区裁剪,只查询必要的数据。灵活的partition expression设置,使得可以根据SQL Pattern进行分区设置,最大化的贴合业务特点
对partition进行TTL管理,淘汰过期的分区数据。
4.分区的建立方式
使用函数操作现有字段分区:PARTITION BY toYYYYMM(date_column)。
使用元组指定分区:PARTITION BY (toMonday(StartDate),EventType)
使用现有字段分区:PARTITION BY (name)
5.分区规则
.1 不定分区 书友数据使用all分区
.2 使用整型 直接按照整型的字符形式输出.
.3 使用日期 使用YYYYMMDD的进行格式化
.4 使用其它类型通过128位的hash算法作为分区的ID
6.分区虽好,但不是所有的表引擎都可以使用这项特性,目前只有合并树(MergeTree) 家族系列的表引擎才支持数据分区。
7.可以通过 system.parts 表查看表片段和分区信息。例如,假设我们有一个 visits 表,按月分区。对 system.parts 表执行 SELECT:
SELECT
partition,
name,
active
FROM system.parts
WHERE table = 'visits'
二.Clickhouse分片的概念
1.分片复用了数据库的分区,相当于在原有的分区下,作为第二层分区, 是在不同节点/机器上的体现。
2.ClickHouse支持单机模式,也支持分布式集群模式。在分布式模式下,ClickHouse会将数据分为多个分片,并且分布到不同节点上。不同的分片策略在应对不同的SQL Pattern时,各有优势。ClickHouse提供了丰富的sharding策略,让业务可以根据实际需求选用。
1) random随机分片:写入数据会被随机分发到分布式集群中的某个节点上。
2) constant固定分片:写入数据会被分发到固定一个节点上。
3) column value分片:按照某一列的值进行hash分片。
4) 自定义表达式分片:指定任意合法表达式,根据表达式被计算后的值进行hash分片。
3.数据分片,让ClickHouse可以充分利用整个集群的大规模并行计算能力,快速返回查询结果。更重要的是,多样化的分片功能,为业务优化打开了想象空间。比如在hash sharding的情况下,JOIN计算能够避免数据shuffle,直接在本地进行local join;支持自定义sharding,可以为不同业务和SQL Pattern定制最适合的分片策略;利用自定义sharding功能,通过设置合理的sharding expression可以解决分片间数据倾斜问题等
1.ClickHouse的集群由分片 ( Shard ) 组成,而每个分片又通过副本 ( Replica ) 组成。这种分层的概念,在一些流行的分布式系统中十分普遍。例如,在Elasticsearch的概念中,一个索引由分片和副本组成,副本可以看作一种特殊的分片。如果一个索引由5个分片组成,副本的基数是1,那么这个索引一共会拥有10个分片 ( 每1个分片对应1个副本 )。
如果你用同样的思路来理解ClickHouse的分片,那么很可能会在这里栽个跟头。ClickHouse的某些设计总是显得独树一帜,而集群与分片就是其中之一。这里有几个与众不同的特性。
ClickHouse的1个节点只能拥有1个分片,也就是说如果要实现1分片、1副本,则至少需要部署2个服务节点。
分片只是一个逻辑概念(类似于Hbase中的region的概念,表的范围数据),其物理承载还是由副本承担的。
三.分区与分片的关系示意图
数据分区是针对本地数据而言的,是数据的一种纵向切分。 而数据分片是数据的一种横向切分