ClickHouse笔记

ClickHouse安装

参考:官方安装文档
我这里选用手动下载rpm安装包

  • 环境准备
#列出所有的参数
[root@192 clickhouse]# ulimit -a
open files                      (-n) 65536
max user processes              (-u) 131072

其中有两个重要的配置open files(打开文件数限制)和max user processes(用户最大进程数限制)
因为clickhouse容易消耗cpu和磁盘,如果数据量大了,查询的线程多了.限制数低了发挥不出clickhouse的最大性能

[root@192 clickhouse]# vim /etc/security/limits.conf
[root@192 clickhouse]# vim /etc/security/limits.d/20-nproc.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

第一列表示生效的用户和用户组,*表示所有。针对user用户和group组:user@group
第二列soft表示软限制(当前值)、hard表示硬限制(最大值)
第三列nofile表示打开文件数、nproc表示打开进程数
重新链接会话即可生效

#安装相关依赖
[root@192 ~]# yum install -y libtool
[root@192 ~]# yum install -y *unixODBC*

下载好安装包后上传
1.clickhouse-client-xxx.rpm
2.clickhouse-common-static-xxx.rpm
3.clickhouse-common-static-dbg-xxx.rpm
4.clickhouse-server-xxx.rpm

  • 安装步骤
#安装上传的rpm包
[root@192 ~]# rpm -ivh clickhouse-xxx.rpm
#查看安装结果
[root@192 ~]# rpm -qa | grep clickhouse
clickhouse-server-xxx.noarch
clickhouse-client-xxx.noarch
clickhouse-common-static-dbg-xxx.x86_64
clickhouse-common-static-xxx.x86_64
修改服务端配置(集群/日志/绑定host等配置)
[root@192 ~]# vim /etc/clickhouse-server/config.xml
#默认本机127.0.0.1访问,开放所有host访问
::
#data数据存放路径
/var/lib/clickhouse/
#日志存放路径
/var/log/clickhouse-server/clickhouse-server.log
#错误日志存放路径
/var/log/clickhouse-server/clickhouse-server.err.log
修改参数配置(CPU/内存等配置)
[root@192 ~]# vim /etc/clickhouse-server/users.xml
16
200
8
10000000000

列举几个核心调优配置

配置 推荐值 描述
background_pool_size cpu个数*2 MergeTree 引擎的表设置执行后台合并和突变的线程数
max_concurrent_queries 200 同时处理的最大请求数
max_threads cpu个数 单个查询使用的最大cpu个数
max_memory_usage 物理内存70% 限制可用内存量。该限制适用于单个服务器中的单个查询。您可以使用SHOW PROCESSLIST查看每个查询的当前内存消耗
max_bytes_before_external_group_by max_memory_usage的50% 单个GROUP BY查询操作可以使用的最大 RAM 容量
max_bytes_before_external_sort max_memory_usage的50% 单个order BY查询操作可以使用的最大 RAM 容量
启动server
[root@192 ~]# clickhouse start
客户端连接
#支持多行以;结尾执行
[root@192 ~]# clickhouse-client -m

ClickHouse使用

Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。
MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。
create table test(
    id UInt32,
    name String,
    create_time Datetime
) engine=MergeTree
    primary key (id)
    order by (id);
insert into  test values
(1,'test1','2022-04-10 00:00:00'),
(2,'test2','2022-04-11 00:00:00');

primary key
主键索引使用稀疏索引,默认间隔8192,除非该列存在大量重复的值,大于8192间隔,可以适当调大

SETTINGS index_granularity = 8192

如果不指定分区,就会存放在all分区里,也可以指定分区,这里我使用按天分区

partition by toYYYYMMDD(create_time)

merge_with_ttl_timeout — TTL合并频率的最小间隔时间,单位:秒。默认值: 86400 (1 天)。
也可以手动触发合并

#合并临时分区
optimize table test final;
#指定分区合并
 OPTIMIZE TABLE test PARTITION 20220410 FINAL;
  • 注意点
    1.避免使用Nullable字段类型,使用 Nullable 几乎总是对性能产生负面影响,在设计数据库时请记住这一点。因为存储Nullable列需要创建一个额外的文件存储null标记,而且Nullable列无法被索引
  • SQL操作
#删除
alter table test delete where id= 1;
#修改
alter table test update name='update_test' where id= 2;

删除,修改并不会操作本身的分区数据,而是新增分区,并在下一次分区合并的时候才会真正删除旧分区数据,当分区数据很多的时候,新增分区意味着耗时更长,所以要尽可能避免频繁修改删除,尽量使用批量操作。

你可能感兴趣的:(ClickHouse笔记)