地址信息
官网地址:Fast Open-Source OLAP DBMS - ClickHouse
官网文档:什么是ClickHouse? | ClickHouse Docs
全局配置(官网):Global Server 设置 |ClickHouse 文档
users配置参数:Users and Roles Settings | ClickHouse Docs
config配置参数:Global Server Settings | ClickHouse Docs
下载地址(官网):packages.clickhouse.com/rpm/stable/
下载地址(阿里云):clickhouse-rpm-stable安装包下载_开源镜像站-阿里云
1.clickhouse-client-23.1.3.5.x86_64.rpm
2.clickhouse-common-static-23.1.3.5.x86_64.rpm
3.clickhouse-common-static-dbg-23.1.3.5.x86_64.rpm
4.clickhouse-server-23.1.3.5.x86_64.rpm
系统架构
特别注意:执行顺序是从上到下执行
Cluster(集群)与Replication(副本):集群由Shard(分片)组成,而Shard(分片)由Replica(副本)组成;
Functions(函数):分为单行函数和组函数;
Interpreter(解释器):负责将SQL语句以递归下降的方法解析成AST语法树,不同的SQL语句有不同的解析器;
Parser(解析器):对SQL语句进行解析;
Table(数据表):底层没有表的概念,Table是多个列的集合体,读取数据以表为单位操作,通过BlockStreams(块流)操作Block(块);
数据读写IO:通过字节流实现数据的输入和输出,用于处理文件、socket、压缩等;
Formats(格式化):数据格式同块一起实现,用于向客户端输出数据的展示格式;
BlockStreams(块流):通过块流实现块数据的输入和输出;
Block(块):表示内存中表的子集(chunk)的容器,由三元组【Column(列)、DataType(数据类型、列名)】组成的集合,表操作的对象是Block(块);
DataType(数据类型):负责序列化和反序列化,读取二进制或文本形式的列或单个值构成的块,但不直接负责数据的读取,而是转由从Column或Field对象读取;
Column(列)&Field(领域):Column和Field是Clickhouse中最基础的单元,其中Column是一个对象用于存储一列数据;而Field也是一个对象,代表列中的一个单值,采用聚合设计模式,内部有13种数据类型及相应的处理逻辑;
核心概念
1)数据分片:将数据进行横向切分,每个分片对应了Clickhouse的1个服务节点,还提供了本地表(Local Table)与分布式表(Distributed Table)的概念,本地表等同于一份数据的切片,而分布式表本身不存储数据,它是本地表的访问代理,类似分库中间件,借助分布式表,能够访问多个数据切片,从而实现分布式查询。
2)列式存储:a.同一列中的数据属于同一类型,列存的压缩比更高,节省了大量存储空间;b.压缩比高意味着更小的data size,从磁盘中读数据时间更短;c.可以根据根据不同列的类型选择最合适的压缩算法;
3)向量化:Clickhouse不仅将数据按列存储,而且按列计算,将多次for循环计算变成一次计算;
4)表;
5)分区:ClickHouse支持PARTITION BY字句,在建表时可以按照表达式进行数据分区操作,比如:toYYYYMM()按月分区,toMonday()按周分区,对num类型的列分区,数据以分区的形式统一管理和维护一批数据;
6)副本:通过复制集,保障数据的可靠性,也通过多副本的方式,增加了CK查询的并发能力,a.分布式DDL执行、ReplicatedMergeTree表主备节点之间的状态同步; c.并发访问数据;d.索引的使用;e.是否可以执行多线程请求;f.数据是否存储副本;g.并发操作insert into tb_x select * from tb_x 表引擎决定数据在文件系统中的存储方式,官方推荐的存储引擎是MergeTree系列,数据副本用ReplicatedMergeTree系列,读取集群数据需要使用分布式表引擎Distribute;
7)block:ClickHouse能处理的最小单位是block,block是一群行的集合,默认最大为8192行。因为每一列单独存储,因此每个数据文件相比于行式存储更有规律,通过对block采用LZ4压缩算法,整体压缩比大致可以8:1。ClickHouse通过出色的压缩比与block结构实现了批处理功能;
8)LSM:LSM的原理:把一颗大树拆分成N棵小树,数据先写入内存中,随着小树越来越大,内存的小树会flush到磁盘中。磁盘中的树定期做合并操作,合并成一棵大树。ClickHouse通过LSM实现数据的预排序,从而减少磁盘的读取量;ClickHouse的写入步骤可以总结为以下几点:a.每一批次数据写入,先记录日志,保证高可用机制;b.记录日志之后存入内存排序,后将有序结果写入磁盘,记录合并次数Level=0; c.定期将磁盘上Level=0或1的文件合并,并标记删除,后续物理删除;
9)索引:ClickHouse的采用一级索引(稀疏索引)+二级索引(跳数索引)来实现索引数据定位与查询。一级索引记录每个block块的第一个,每次基于索引字段查询只需要确定查询第几个block块即可,避免一个查询遍历所有数据,一级索引占用存储较小,可常驻内存,加速查询。二级索引由数据的聚合信息构建而成,根据索引类型的不同,其聚合信息的内容也不同,跳数索引的目的与一级索引一样,也是帮助查询时减少数据扫描的范围,原则都是“排除法”,即尽可能的排除那些一定不满足条件的索引粒度。
优&缺点
优点 | 缺点 |
真正面向列的DBMS(Database Management System:是一种用于创建、维护、查询和管理数据库的软件); | 不支持事务 |
高效的数据压缩; | 缺完整的修改和删除操作,缺少高频率、低延迟的修改和删除能力 |
数据磁盘存储; | 聚合结果必须小于该机器的内存大小 |
多核并行处理; | 不适合key-value存储,不支持Blob等文档型数据库 |
分布式架构; | |
支持SQL语法; | |
向量化引擎; | |
实时数据更新; | |
支持索引; | |
支持近似预估计算; | |
支持嵌套的数据结构; | |
支持数组类型; | |
支持限制查询复杂性及配额; | |
支持数据复制; |
数据类型
分类 | 代码 | 取值范围 |
整型(有符号) | Int8 | -128 ~ 127 |
Int16 | -32768 ~ 32767 | |
Int32 | -2147483648 ~ 2147483647 | |
Int64 | -9223372036854775808 ~ 9223372036854775807 | |
整型(无符号) | UInt8 | 0 ~ 255 |
UInt16 | 0 ~ 65535 | |
UInt32 | 0 ~ 4294967295 | |
UInt64 | 0 ~ 18446755073709551615 | |
浮点型 | Float32 | 注意:存钱时不能用该类型,要用Decimal |
Float64 | ||
Decimal型 | Decimal32(s代表小数点位数) | 有效位数为 1 ~ 9 |
Decimal64(s) | 有效位数为 1 ~ 18 | |
Decimal128(s) | 有效位数为 1 ~ 38 | |
字符串型 | String | |
FixedString(N) | ||
枚举型 | Enum8 | |
Enum16 | ||
时间型 | Date | 年-月-日 2024-12-14 |
DateTime | 年-月-日 时:分:秒 2024-12-14 20:30:10 | |
DateTime64 | 年-月-日 时:分:秒.亚秒 2024-12-14 20:30:10.44 | |
数组型 | Array(T) |
表引擎
表引擎 | 描述 |
TinyLog | 以列文件形式保存在磁盘上,不支持索引、没有并发控制,一般保存少量数据的小表,主要用于测试 |
Memory | 内存引擎,读写操作不会相互阻塞,不支持索引 |
MergeTree | 合并树引擎,支持索引和分区 |
ReplacingMergeTree | 去重合并树引擎,支持索引和分区,去重时机:只有数据合并时才会去重,clickhouse的合并是在后台进行的,时间无法预料;去重范围:只能在本分区内去重;注意:1.去重是根据order by关键字中的字段作为唯一键;2.去重不能跨分区;3.在数据批量插入时(新版本)或合并分区时才会去重;4.根据传入的字段的最大值去重,如果值相同或者不传字段时保留最后一个数据;5.能保证最终数据一致性; |
SummingMergeTree | 预聚合合并树引擎,支持索引和分区,只有分片合并时才能聚合(只能在本分区内);注意:1.可以传入多个列,如果不传,以所有非维度列的数字列字段为汇总;2.以order by的列为准,作为维度列;3.在数据批量插入时(新版本)或分片合并时才会聚合; |
常用函数
名称 | 含义 | 用法 | 效果 |
CAST | 类型转换 | select CAST(字段名,'数据类型') from t_text; | |
with rollup | 数据上卷(按照分组字段从右往左依次统计) | select id,sku_id,sum(total_amount) from order_mt group by id,sku_id with rollup; | ![]() |
with cube | 多维分析(从右往左去掉维度进行小计,在从左往右去掉维度进行小计) | select id,sku_id,sum(total_amount) from order_mt group by id,sku_id with cube; | ![]() |
with total | 总计 | select id,sku_id,sum(total_amount) from order_mt group by id,sku_id with totals; | ![]() |
argMax | 根据某个列获取最大值 注意:查询参数1,通过参数2筛选出最新的值 | select argMax(sku_id,create_time) from order_mt; | ![]() |
final | ClickHouse会在返回结果之前完全合并数据,实现数据的一致性;注意:1.只有ReplacingMergeTree有效;2.只有本次查询有效 | select * from order_mt_r final; | ![]() |
数据副本
写入流程
注意:副本是通过Zookeeper实现的,且只支持MergeTree家族,用于保障数据的高可用,副本之间没有主从的概念,它们互相备份
修改配置
<!--===================增加集群分片配置===============-->
<!--进入目录-->
cd /etc/clickhouse-server/config.d
<!--创建文件,存储集群信息-->
mkdir metrika-shard.xml
<!--增加以下内容-->
<?xml version="1.0"?>
<!-- 公司名称-->
<yandex>
<remote_servers>
<!-- 集群名称,可根据自己情况修改-->
<test_cluster>
<!--集群的第一个分片-->
<shard>
<!--内部副本同步-->
<internal_replication>true</internal_replication>
<!--第一个分片的第一个副本-->
<replica>
<!--机器-->
<host>hadoop101</host>
<!--端口号-->
<port>9000</port>
</replica>
<!--第一个分片的第二个副本-->
<replica>
<host>hadoop102</host>
<port>9000</port>
</replica>
</shard>
<!--集群的第二个分片-->
<shard>
<!--内部副本同步-->
<internal_replication>true</internal_replication>
<!--第二个分片的第一个副本-->
<replica>
<host>hadoop103</host>
<port>9000</port>
</replica>
<!--第二个分片的第二个副本-->
<replica>
<host>hadoop104</host>
<port>9000</port>
</replica>
</shard>
<!--集群的第三个分片-->
<shard>
<!--内部副本同步-->
<internal_replication>true</internal_replication>
<!--第三个分片的第一个副本-->
<replica>
<host>hadoop105</host>
<port>9000</port>
</replica>
<!--第三个分片的第二个副本-->
<replica>
<host>hadoop106</host>
<port>9000</port>
</replica>
</shard>
</test_cluster>
</remote_servers>
<!--zookeeper集群的配置信息-->
<zookeeper-servers>
<!--第一个节点-->
<node index="1">
<!--机器名-->
<host>hallo100</host>
<!--端口号-->
<port>2181</port>
</node>
<!--第二个节点-->
<node index="2">
<host>hallo101</host>
<port>2181</port>
</node>
<!--第三个节点-->
<node index="3">
<host>hallo102</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!--宏,是一种在配置文件或通过命令行参数定义的符号替换机制-->
<macros>
<!--分片数-->
<shard>01</shard>
<!--副本名 格式为:IP_分片数_副本数-->
<replica>rep_1_1</replica>
</macros>
</yandex>
<!--修改文件权限-->
chown clickhouse:clickhouse metrika.xml
<!--增加文件路径-->
cd /etc/clickhouse-server/
<!--编辑配置文件,并全局搜索 <zookeeper 在该配置上增加以下内容 -->
vim config.xml
<!--增加该内容-->
<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika-shard.xml</include_from>
<!--重启clickhouse服务-->
clickhouse restart
视图
普通试图(normal view):不存储任何数据,只是一个子查询。当从视图读取数据时,实际是查询创建视图的子查询语句(创建视图的查询被用作from子句中的子查询);
物化试图(materialized view):物化视图实际存储了一份数据。用户查询的时候和表没有区别,更像是一张时刻在预计算的表。在创建物化视图的时候也需要定义存储引擎;
实时视图(live view):存储CREATE语句中SELECT查询的结果,并在查询结果更改时进行更新。
窗口视图(window view):
SQL操作
--================================建表语句==============================
--建表语句(单机表,没副本) MergeTree用法
create table order_mt(
id UInt32,
sku_id String,
total_amount Decimal(16,2) TTL create_time+interval 10 SECOND, --TTL(过期时间),注意:该方式属于字段级别的过期时间
create_time DateTime,
INDEX a total_amount TYPE minmax GRANULARITY 5 --开启二级索引(跳数索引)
) engine=MergeTree --合并树引擎
partition by toYYYYMMDD(create_time)
primary key(id)
order by(id,sku_id)
--建表语句(本地分片,副本表) test_cluster是集群名称,要与metrika-shard.xml配置文件中的集群标签名一致
create table order_mt_load on cluster test_cluster (
id UInt32,
sku_id String,
total_amount Decimal(16,2) ,
create_time DateTime
--副本引擎 参数1:zookeeper的路径,注意:从metrika-shard.xml配置文件中读取;参数2:副本名称,注意:从metrika-shard.xml配置文件中读取
) engine=ReplicatedMergeTree('/clickhouse/tables/{shard}/order_mt_load','{replica}')
partition by toYYYYMMDD(create_time)
primary key(id)
order by(id,sku_id)
--建表语句(分布式表) test_cluster是集群名称,要与metrika-shard.xml配置文件中的集群标
create table order_mt_load_di on cluster test_cluster
(
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
--Distributed代表分布式;参数1:集群名称、参数2:数据库名、参数3:本地表名、参数4:按照什么字段进行分片
)engine = Distributed(test_cluster, default, order_mt_load, hiveHash(sku_id));
--建表语句(单机表,没副本) ReplacingMergeTree用法
create table order_mt_r(
id UInt32,
sku_id String,
total_amount Decimal(16,2) ,
create_time DateTime
) engine=ReplacingMergeTree(create_time) --去重合并树引擎,参数:数据去重依据,会根据该字段去重
partition by toYYYYMMDD(create_time)
primary key(id)
order by(id,sku_id)
--建表语句(单机表,没副本) SummingMergeTree用法
create table order_mt_t(
id UInt32,
sku_id String,
total_amount Decimal(16,2) ,
create_time DateTime
) engine=SummingMergeTree(total_amount) --聚合合并树引擎,参数:想要聚合的列
partition by toYYYYMMDD(create_time)
primary key(id)
order by(id,sku_id)
--创建物化视图 关键字:materialized(物化)、 view(视图) 、populate会将原表的所有数据加到视图中,不加该关键字,只会将新增的数据加到视图中
create materialized view test_view
engine=SummingMergeTree
partition by toYYYYMMDD(create_time)
order by(id,sku_id) populate AS select id,sku_id,total_amount,create_time from order_mt
--===============相关优化=========================
--建表, 日期类型不要使用String,可以用DateTime或者Int32
--数据插入不要用NULL,可以用""或者-1
--分区粒度不要过粗或者过细,如果有一亿条数据的话,分区控制在10 ~ 30个最佳
--查询语句中,尽量使用prewhere 而不是where 注意:prewhere只支持MergeTre家族
--数据采样 SAMPLE 0.1 代表采样10%的数据,也可以是具体的条数
--虚拟列 查询语句中不要使用虚拟列(也就是表中没有的字段)
--查询语句中,数据去重尽量使用uniqCombined(不精准去重) 而不是distinct(精准去重)
--多表查询,用IN 而不用join,还有就是将小表放到右边 注意:因为join会将右边的表数据全部加载到内存中,然后左边的表会逐条的去内存中匹配查询
--分布式多表关联查询时,在IN或join 之前 加上 GLOBAL关键字 注意:是为了解决查询放大问题,也就是每个节点上的表都会与其它节点上的表全量数据对比
--查询数据时,在表后面加上 final 关键字
--==============建表语句中的关键字含义=================
partition by toYYYYMMDD(create_time) 分区; toYYYMMDD时间格式转换; 注意:该关键字可选
primary key 主键,提供数据的一级索引,但不是唯一约束,注意:该关键字会帮我们创建SETTINGS index_granularity = 8192(稀疏索引力度)
order by 在同一个分区内排序 注意:排序关键字非常重要,主键必须按照排序中字段的顺序
INDEX a total_amount TYPE minmax GRANULARITY 5 --开启二级索引; INDEX(添加索引)、a(索引名)、 total_amount(索引字段)、TYPE(索引类型)、minmax(记录一段数据内的最小和最大极值)、GRANULARITY(设定二级索引对于一级索引的粒度)
TTL create_time+interval 10 SECOND TTL(过期时间分为表和字段级别)、create_time(表中的日期字段,注意:该字段不能是主键切必须是日期类型)、interval 10(时间的固定写法)、SECOND(时间单位,时、分、秒、天)
--==================参数设置==============================
--开启三元运算符优化 0代表关闭
set optimize_if_chain_to_multiif=1;
--开启where优化 0代表关闭
set optimize_move_to_prewhere=1;
--===========================sql语句====================================
insert into 表名 values(generateUUIDv4()); --插入UUID类型的格式(方式一)
insert into 表名 select generateUUIDv4(),'变量名'; --插入UUID类型的格式(方式二 )
insert into 表名 values('RED'),('BLUE'); --插入Enum('RED'=1,'BLUE'=2 )枚举类型(方式一)
insert into 表名 values(1),(2); --插入Enum('RED'=1,'BLUE'=2 )枚举类型(方式二)
insert into 表名 values([1,2,3],['zhd','zdf','fddf']); --插入Nested类型的方式
insert into 表名 values(('yy',12)),(('ss',22)) --插入Tuple类型的方式
insert into 表名 values('192.168.19.10'); --插入IP的方式
insert into 表名 values(map('ddd',123)); --插入map的方式(方式一)
insert into 表名 values({'fsd': 233}); --插入map的方式(方式二)
insert into 表名 values(array('lay','zytf')); --插入数组(字符串)类型
select fs.size0 from 表名; --用sql方式 查询数组长度
select length(fs) from 表名; --用函数方式 查询数组长度
select fs[1] from 表名; --用函数方式 根据下标值查数组数据(方式一)
select arrayElement[fs,1] from 表名; --用函数方式 根据下标值查数组数据(方式二)
select arrayMap(e->upper(e),fs) 表名; --用函数方式 将所有字符串转成大写
select aa.s,aa.i from 表名; --查询元组数据方式
select mm['ddd'] from 表名; --查询map的方式 根据key取值(方式一)
select arrayElement[mm,'ddd'] from 表名; --用函数方式 根key查map的值(方式二)
select (1.2+3) :: Int8; --类型强制转换
with 100 as number select money + number from 表名; --with定义变量在和表中的字段操作
with toYYYYMM(create_time) as c_t select c_t from 表名; --with定义变量通过函数修改字段的格式
with splitByString(',',name) as str_arr select str_arr from 表名; --将字符串转成数组
--array join将数组炸开(按行显示)
select
id,
name --炸开后的别名
from 表名
array join names as name; --names是表中的字段【Array(String)数组类型】
/*********************创建试图***********************/
create view xx_view as select id,name,age from 表名; --创建普通试图(不会落盘)
create materialized view xx_view engine = 表引擎 populate as select * from 表名; --创建物化试图(落盘)【materialized(物化试图)、populate(数据同步) 】
/********************操作表结构************************/
--查看集群名称
show clusters;
--查看表结构
SHOW CREATE TABLE order_mt;
--新增字段 注意:在id字段后面增加 aabb
alter table order_mt_r add column aabb String after id;
--修改字段的类型
alter table order_mt_r modify column aabb UInt32;
--删除字段
alter table order_mt_r drop column aabb;
alter table 表名 add colume name2 String; --添加字段
alter table 表名 drop colume name2 String; --删除字段
alter table 表名 modify colume age String default ''; --修改字段类型(将age修改为字符串)
alter table 表名 comment colume name2 '用户名'; --给字段添加注释
alter table 表名 drop where id =3; --根据ID删除数据
alter table 表名 update name2='java' where id=3 --根据id修改name的值
rename table tb_test to t1; --修改表名
rename table tb_test to t1,ttt1 to t2; --修改多张表名
rename table t2 to test1.t; --移动表到另一个库中
/**********************分区操作************************/
select name,table,partition from system.parts where table ='表名'; --查看分区信息
alter table 表名 drop partition '20240203'; --删除分区
alter table t2 REPLACE PARTITION '20240302' FROM t1 --根据分区将t1表的数据复制到t2
alter table 表名 clear colume name in partition '20240203'; --根据分区清空name字段数据
alter table 表名 detach partition '20240203'; --卸载分区(底层只是移动文件)
alter table 表名 attach partition '20240203'; --装载分区(底层只是移动文件)
--根据表 手动合并分区 注意:去重的规则是根据 order by中的字段
optimize table order_mt final;
--根据分区名 手动合并分区 注意:去重的规则是根据 order by中的字段
optimize table order_mt partition '20200621' final;
--删除 注意:数据并没真正删除,只是将数据移到了新创建的分区中,只有合并时才会删除旧分区的数据
alter table order_mt delete where sku_id='sku_001';
--清空数据
alter table order_mt delete where 1=1;
--修改 注意:数据并没真正修改,只是将数据移到了新创建的分区中
alter table order_mt update total_amount=toDecimal32(800,2) where sku_id='sku_004';
--explain syntax查看优化后的sql
explain syntax select arrayJoin([1,2,3,null,null]);
命令
sudo /etc/init.d/clickhouse-server start --启动服务(方式一)
service clickhouse-server start --启动服务(方式二)
clickhouse-client -u(用户名,默认值default) -m(交互式客户端中可以执行多行函数) -h(服务端的host名称) -port(端口号,默认9000) -password(密码) -q(非交互式下的查询语句) -d(要操作的数据库,默认default) -f(使用指定的格式输出结果) -t(非交互模式下打印查询执行时间) -stacktrace(如果出现异常,打印堆栈信息) -config-file(配置文件的名称)
/*******************导入数据**********************/
cat file.txt | clickhouse-client -q 'insert into 库名.表名 format CSV' --将txt中的数据插入到表中(方式一)
clickhouse-client -q 'insert into 库名.表名 format CSV' < file.txt --将txt中的数据插入到表中(方式二)
clickhouse-client --format_csv_delimiter='_' -q 'insert into 库名.表名 format CSV' < file.txt --将txt中的数据插入到表中(方式三) 指定txt中字段之间的分隔符--format_csv_delimiter='_'
安装步骤
序号 | 内容 | 代码 | 描述 |
1 | 安装依赖 | sudo yum install -y libtool sudo yum install -y *unixODBC* | |
2 | 修改系统配置 | vim /etc/security/limits.conf * soft nofile 65536 | * 代表用户名@用户组 soft、hard 代表最小值/最大值 nofile、nproc 代表文件数/进程数 最后一列是具体的值 |
3 | 修改系统配置 | vim /etc/security/limits.conf * soft nofile 65536 | |
4 | 关闭安全策略 | vim /etc/selinux/config SELINUX=disabled | |
5 | 重启服务 | reboot | |
6 | 查看是否生效 | getenforce | 结果为:Disabled |
7 | 创建包存放路径 | mkdir clickhouse_rpm | |
8 | 上传安装包 | cd clickhouse_rpm rz -bye | 共计4个安装包 |
9 | 安装 | sudo rpm -ivh *.rpm | 备注:在安装过程中会让输入密码,直接点击回车键,说明不设置登入密码 |
10 | 查看是否安装 | rpm -qa|grep clickhouse | ![]() |
11 | 修改配置文件 | cd /etc/clickhouse-server vim config.xml <!--远程访问,将原有注释去掉--> <listen_host>::</listen_host> | <!--数据存储路径--> <path>/var/lib/clickhouse/</path> <!--日志级别--> <level>trace</level> <!--日志路径--> <log>/var/log/clickhouse-server/clickhouse-server.log</log> <!--错误日志路径--> <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog> |
12 | 启动(测试用) | clickhouse start | ![]() |
13 | 查看启动状态(测试用) | clickhouse status | ![]() |
14 | 命令行登入 | clickhouse-client -m | ![]() |
15 | 停止(测试用) | clickhouse stop | ![]() |
16 | 启动 | sudo systemctl start clickouse-server | |
17 | 设置开机自启动 | sudo systemctl enabled clickouse-server | |
18 | 查看启动状态 | systemctl status clickhouse-server | ![]() |
文件作用
1 | 默认安装路径 | bin ---> /usr/bin conf ---> /etc/clickhouse-server lib ---> /var/lib/clickhouse log ----> /var/log/clickhouse | |
2 | 配置文件路径 | cd /etc/clickhouse-server config.d 默认配置 config.xml 服务端的配置 users.d users.xml 参数配置 | |
3 | 数据文件路径 | cd /var/lib/clickhouse/data/default/order_mt 20200601_1_1_0 分区目录(分区字段值_最小分区块编号_最大分区块编号_合并层级) detached 卸载 format_version.txt 格式版本 | 注意:最小编号:自增类型,从1开始向上递增,每产生一个新的目录分区就向上递增一个数字; 合并等级:被合并的次数,合并的次数越多,层级值越大; |
4 | 数据文件 | cd /var/lib/clickhouse/data/default/order_mt/20200601_1_1_0 | ![]() |
checksums.txt 校验文件,用于校验各个文件的正确性,存放各个文件的size以及hash值 | |||
columns.txt 列信息(列名和数据类型) | |||
count.txt 记录表的行数 | |||
data.bin 数据文件(每一个列都会有一个bin文件) | |||
data.mrk3 标记文件,标记文件在idx索引文件和bin数据文件之间起到了桥梁作用;(每一个列都会有一个mrk文件) | |||
default_compression_codec.txt 默认压缩格式 | |||
minmax_create_time.idx 分区键的最小和最大值(主要是给分区文件使用) | |||
partition.dat 分区文件 | |||
primary.idx 稀疏索引文件 |
常用配置
备注:主要是修改config.xml和users.xml配置文件 | |||
全局配置(官网):Global Server 设置 |ClickHouse 文档 | |||
类型 | 配置 | 值 | 描述 |
CPU | background_pool_size | CPU个数的2倍 | 后台线程池的大小,clickhouse的merge也会使用线程池中的线程,默认值为16 |
background_schedule_pool_size | CPU个数的2倍 | 执行后台任务的线程数,默认值为128 | |
background_distributed_schedule_pool_size | CPU个数的2倍 | 分布式发送执行后台任务的线程数,默认值为16 | |
max_concurrent_queries | 150 ~ 300 | 最大并发处理的请求数(包含select、inster等),默认值为100 | |
max_threads | 默认值既可 | 单个查询所能使用的最大CPU个数,默认值是CPU核数 | |
内存 | max_memory_usage | 比如:128G的机器,可以设置为100G | 单次Query占用内存最大值 |
max_bytes_before_external_group_by | max_memory_usage参数的一半 | 当group by(分组)使用内存超过阈值后会刷新到磁盘上排序 | |
max_bytes_before_external_sort | max_memory_usage参数的一半 | 当order by(排序)使用内存超过阈值后会刷新到磁盘上排序 | |
max_table_size_to_drop | 删除表的阈值,默认值50G,当该表的数据量达到该阈值时,该表将无法删除 |