这里写目录标题
- 概述
- 优势特性
- 缺点特性
- 性能
- 安装
- 测试
- 创建表
- 导入数据
- 查询数据
ClickHouse,是一个快速,开源,OLAP的数据库管理系统。ClickHouse是列式存储的,支持实时使用SQL的查询生成分析报告。
什么场景下使用ClickHouse
分析干净,结构合理且不可变的事件或日志流。 建议将每个这样的流放入具有预连接维度的单个宽事实表中。特别是以下场景:
- 网络和应用分析
- 广告网络和实时出价
- 电信
- 电子商务和金融
- 信息安全
- 监控和遥测
- 时间序列
- 商业智能
- 网络游戏
- 物联网
概述
优势特性
- 真正的面向列的存储
不存储额外的数据,支持恒定长度存储。其他系统也可以列式存储,但是他们侧重点不同,无法有效处理OLAP分析查询,包括HBase,BigTable,Cassandra和HyperTable。这些系统支持每秒10W行的吞吐量,但是ClickHouse支持每秒亿行的吞吐量。而且Clickhouse还是一个数据库管理系统,支持运行时创建数据库和数据表,运行时加载数据、执行查询,不需要重新配置和启动服务器。 - 数据压缩
部分列式存储数据库不使用数据压缩。但是数据压缩在提升性能方便有很大空间,除了通用的权衡磁盘空间和CPU消耗的编码解码其外,ClickHouse还对于特定的数据类型提供了专门的压缩解码器。 - 磁盘存储
通过按照主键对数据进行物理排序,提高在查询特殊值或者某一值区间时的效率,通常小于几十毫秒。某些面向列的数据库只能在RAM中工作,需要更多的成本,Clickhouse多数在常规的磁盘上工作,成本较低;但是ClickHouse也可以充分利用SSD和额外的RAM。 - 多核并行处理
执行数据量大的查询时,自动并行查询,占用当前服务器上所有可用的、必须要使用资源。 - 多台服务器上分布式处理
大多数列式存储的RDBMS都不支持分布式查询处理,ClickHouse支持分片,数据可以存在ClickHouse不同的分片上,每个分片都是可以用于容错的一组副本,所有分片都可以并行执行查询。 - 支持标准SQL
ClickHouse支持基于声明式查询语言的SQL,和ANSI SQL标准相同。支持 group By,order By,from,join子句,in运算符和标量子查询中的子查询。
-**向量计算引擎 **
数据不仅按照列存储,而且通过向量进行处理,从而实现较高的cpu效率。 - 实时数据更新
Click House支持表主键,为了在主键的某一范围内进行快速查询,使用Merge Tree对数据进行增量排序,因此可以将数据增量的添加到表中,提取数据时不进行任何锁定。 - 主键索引
通过主键对数据进行物理排序,可以在提取特定值,特定范围内的值的数据时,将时间优化到几十毫秒的量级。 - 二级索引
与其他数据库不同,ClickHouse的二级索引不指向特定行或行范围。而是,通过二级索引,ClickHouse知道某些数据部分的所有行不符合查询过滤条件,然后根本不读取这些数据,所以ClickHouse的二级索引又叫数据跳过索引。 - 适用于在线查询
大多数的OLAP数据库的初衷都不是亚秒级别的在线查询,在替代系统中认为,数十秒或者几分钟的报告构建时间是可以接受的。有时甚至需要强制离线准备报告。而ClickHouse支持压秒级别的报告查询。 - 支持近似计算
ClickHouse提供了多种方式来提高性能,包括近似计算。Aggregate function用来计算不重复值,中位数,分位数的数量。根据部分样本数据运行结果来计算近似结果,在这种情况下,从磁盘读取数据的比例将大大减少,对有限的随机数据执行聚合,而不是所有数据,在确定条件下数据在整个数据中的分布,会在使用较少资源的情况下得到一个合理准确的结果。 - 自适应连接表算法
在需要表连接时,ClickHouse自适应的选择表的连接算法,包括hash-join算法,如果有多个打标则退回merge-join算法 - 数据复制和数据完整性支持
ClickHouse使用异步多主节点复制,在数据写入任何可用的副本后,所有其余的副本在后台同步数据,系统在不同的副本上维护相同的数据,大多数故障发生后的恢复是自动执行的,或者在复杂情况下半自动执行恢复。 - 基于角色的访问控制
ClickHouse使用SQL查询管理用户账户,并允许基于角色的访问控制,类似于ANSI SQL标准和流行的关系数据库管理系统中可以找到的配置。
缺点特性
- 没有成熟的事务支持
- 缺乏以高速率低延迟插入数据的能力。有批量删除和更新可用于清理和修改数据,以符合GDPR
- 稀疏索引使得ClickHouse不能有效的通过主键去查询单行数据
性能
根据Yandex内部测试结果,在同类型系统中可以比较的操作场景中ClickHouse展现出了最佳性能(包括高吞吐量的长查询,低延迟的短查询)。
单个大查询的吞吐量
吞吐量可以以每秒的行数和每秒的兆字节数衡量,如果数据在页面缓存中,一个不是太复杂的查询,在现在硬件设备上,单节点数据未压缩的情况下,执行的速率大概为2G——10G每秒(对于最简单的情况可以达到30G每秒)。如果没有将数据放在缓存中,则速率取决于磁盘和数据压缩率,例如如果磁盘子系统允许以400M每秒读取数据,且压缩率为3,则预期速度为1.2G每秒。要获得以每秒行数为单位的速率,则以每秒字节数为单位的速率除以查询中使用的列的字节数总和。例如,提取10个字节,则速度有望达到100-200w行每秒。
对于分布式处理,处理速率以线性增加,但前提是聚合和排序得到的行数不太大。
处理大量端查询是的吞吐量
在相同条件下,ClockHouse可以在一台服务器上处理每秒处理数百个短查询(最佳情况下上千个),由于这种情况在数据分析型的DBMS中并不常见,因此建议每秒最多100个查询。
插入数据性能
建议数据插入,一次传输至少1000行、或每秒一个请求的数据包中。从制表符分隔的数据转储插入到MergeTree表时,插入可以为50MB—200MB每秒。如果插入的行大小约为1KB,则速度位每秒5w至20w行。如果行很小,每秒的行数可以更高。为了提高性能,可以并行进行多个Insert查询,这些查询可以线性扩展。
安装
CentOS
sudo yum install yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo
sudo yum install clickhouse-server clickhouse-client
sudo clickhouse start
clickhouse-client
Ubantu & Debian
sudo apt-get install apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
echo "deb https://repo.clickhouse.tech/deb/stable/ main/" | sudo tee \
/etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client
sudo service clickhouse start
clickhouse-client
登录之后,和MySQL终端比较像,包括DDL,DQL,DML都类似。
日志目录在
/var/log/clickhouse-server/
测试
创建表
ClickHouse中数据库和数据表的概念大多数数据库管理系统一样,数据库中有多个数据表,创建数据库test1
clickhouse-client --query "create database if not exists test1"
创建表的语法要比数据库复杂一下,包括三要素:
- 表名称
- 表结构
- 表引擎和相关设置,决定了关于这张表的查询如何物理执行的
创建名称为events的表,指定存储引擎为 MergeTree
[root@localhost ~]# clickhouse-client
ClickHouse client version 20.10.3.30 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.10.3 revision 54441.
localhost :) use test1
USE test1
Ok.
0 rows in set. Elapsed: 0.001 sec.
localhost :) CREATE TABLE test1.events(id UInt64,status UInt8,eventDate Date,summary String,description String,userId UInt64)ENGINE = MergeTree() PARTITION BY toYYYYMM(eventDate) ORDER BY (eventDate, intHash32(userId)) SAMPLE BY intHash32(userId) SETTINGS index_granularity = 8192
CREATE TABLE test1.events
(
`id` UInt64,
`status` UInt8,
`eventDate` Date,
`summary` String,
`description` String,
`userId` UInt64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(eventDate)
ORDER BY (eventDate, intHash32(userId))
SAMPLE BY intHash32(userId)
SETTINGS index_granularity = 8192
Ok.
0 rows in set. Elapsed: 0.056 sec.
在上面的导入语句中使用了 MergeTree 存储引擎。
导入数据
数据导入到ClickHouse使用插入语句,像其他SQL数据库一样。但是,数据通常以某种支持的数据提供,代替SQL语句中的vlues语法
下面使用制表符分隔的数据,通过控制台客户端导入到ClickHouse
插入数据如下
1 1 2020-10-11 西安 违法停车 1001
2 1 2020-09-01 北京 闯红灯 1002
3 2 2020-10-12 上海 超速50% 1003
4 2 2020-10-20 大连 占用应急车道 1004
5 1 2020-09-30 深圳 逆行 1002
执行插入语句
clickhouse-client --query "insert into test1.events format TSV" --max_insert_block_size=100000 < e
ClickHouse客户端有许多需要调整的设置,如我们在导入数据的时候指定–max_insert_block_size=100000,查看默认设置可以查询system.setting表,包括没有设置的缺省值,如
[root@localhost ~]# clickhouse-client --query "select name,value,changed,description from system.settings where name like '%max_insert_block%' "
max_insert_block_size 1048545 0 The maximum block size for insertion, if we control the creation of blocks for insertion.
可以在导入后优化表,使用MergeTree引擎的表会在后台合并数据部分优化数据存储,下面这个语句促使引擎立即进行优化,而不是稍后
clickhouse-client --query "OPTIMIZE TABLE test1.events FINAL"
查询数据
例如查询每月发生的次数,如下图。
[root@localhost ~]# clickhouse-client --query "select count(1),toMonth(eventDate) as month from test1.events group by month format TSV"
2 9
3 10
(完)(^_^)