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