
ClickHouse是一个用于联机分析处理(OLAP)的开源列式数据库管理系统(columnar DBMS)。
它通过针对性的设计力图解决海量多维度数据的查询性能问题。
开发语言: C++
ClickHouse的特点
开源的列存储数据库管理系统,支持线性扩展,简单方便,高可靠性,容错
跑分快:比Vertica快5倍,比Hive快279倍,比MySQL快800倍
功能多:支持数据统计分析各种场景,支持类SQL查询,异地复制部署
安装:
yum-config-manager --add-repo http://repo.red-soft.biz/repos/clickhouse/repo/clickhouse-el6.repo
yum install clickhouse-server clickhouse-client clickhouse-server-common clickhouse-compressor
useradd clickhouse
/etc/init.d/clickhouse-server start
使用官方的客户端工具clickhouse-client
CREATE DATABASE testdb
CREATE TABLE arrays_test (s String, arr Array(UInt8)) ENGINE = Memory;
INSERT INTO arrays_test VALUES ('Hello', [1,2]), ('World', [3,4,5]), ('Goodbye', [])
它有实现一个 HTTP 的访问接口,把 SQL 语句通过 HTTP 发送到服务端,就可以得到响应数据了。
ClickHouse 中有两种类型的解析器, full parser 和 data format parser ,前者是一个完整的 SQL 解析器,后者是一个高性能的流解析器。
引擎:
TinyLog,每一列保存为一个文件,里面的内容是压缩过的,不支持索引。不支持并发读写,官方推荐,使用这种引擎的表最多 100 万行的数据。
Log,同 TinyLog 差不多,它适用的场景也是那种写一次之后,后面就是只读的场景,临时数据用它保存也可以。
Memory,内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。可以并行读,读写互斥锁的时间也非常短。
Merge,一个工具引擎,本身不保存数据,只用于把指定库中的指定多个表链在一起。
例:先建了 t1 , t2 , t3 ,三个表,然后用 Merge 引擎的 t 表再把它们链接起来。查询的时候,就能同时取到三个表的数据了。
Distributed, 具备跨服务器能力,与 Merge 类似, Distributed 也是通过一个逻辑表,去访问各个物理表.
Null,空引擎,写入的任何数据都会被忽略,读取的结果一定是空。
Buffer,像Memory存储的一个上层应用似的,是一个缓冲区,写入的数据先被放在缓冲区,达到一个阈值后,这些数据会自动被写到指定的另一个表中Set,这个引擎有点特殊,因为它只用在 IN 操作符右侧,你不能对它 select 。
MergeTree,它支持一个日期和一组主键的两层式索引,还可以实时更新数据。同时,索引的粒度可以自定义,外加直接支持采样功能。
ReplacingMergeTree,这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,“实时数据”场景量身打造的一个引擎啊。
SummingMergeTree,在 merge 阶段把数据加起来了,当然,哪些列要加可以配置,不可加的列,会取一个最先出现的值。
AggregatingMergeTree 是在 MergeTree 基础之上,针对聚合函数结果,作增量计算优化的一个设计.
CollapsingMergeTree,是专门为 OLAP 场景下,一种“变通”存数做法而设计的.“以加代删”的增量存储方式,带来了聚合计算方便的好处.
如下几种应用场景:
- 绝大多数请求是以读为主。
- 数据以相当大的批次(>1000行)进行更新,而不是单行更新;或者根本不更新。
- 数据被添加到数据库,基本不怎么修改。
- 对于读取,大量的数据从数据库中抽取出来,但只有列的一个子集。
- 表是“宽的”,这意味着它们包含大量的列。
- 查询相对较少(通常每台服务器数百个查询或更少)。
- 对于简单的查询,允许大约50 ms的延迟。
- 列值相当小 - 数字和短字符串(例如,每个URL 60个字节)。
- 处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)。
- 无事务处理。
- 数据一致性要求低- 每个查询有一个大表,其他所有的表都是小表。
- 查询结果显著小于源数据。也就是说,数据被过滤或聚合。结果可以放在单个服务器的内存中。
其中一个典型的应用,监控的时序数据.
优点:
1.并行处理单个查询(利用多核)
2.在多个服务器上分布式处理
3.非常快的扫描,可用于实时查询
4.列存储非常适用于“宽”/“非规格化”表(多列)
5.良好的压缩特性
6.SQL支持(有限的支持)
7.一系列函数的支持,包括对近似计算的支持
8.不同的存储引擎的支持(磁盘存储格式)
9.非常适合结构性日志/事件数据以及时间序列数据(引擎的合并树需要日期字段)
10. 索引支持(仅主键支持,不是所有的存储引擎都支持)
11.漂亮的命令行界面,用户友好的进度条和格式
缺点:
1.不支持事物
2.聚合结果必须小于一台机器的内存大小
3.缺少完整的update/delete操作
4.不适合典型的kv存储,高请求率的键值访问
5.不支持Blob/Document类型数据
ClickHouse最大的特点就是快,快,快,重要的话说三遍:
1.优秀的代码编写,强⼤的底层优化,严格的单元测试,内置300多个函数
2.A vector engine & Code generation
3.CPU底层指令集的使用
4.C++新特性
CK出众的原因也跟其引擎有关,合并树(MergeTree)系列的引擎通过主键进行字典序排列. 主键可以是列或表达式的任意 tuple。数据按照主键顺序存储数据,主键自身是稀疏的,它不定位到每一行,而是一些数据范围,当我们从MergeTree引擎中读取数据时,首先定位了可能包含请求数据的范围,要注意的合并树不是一个LSM树,因为它不包含内存表 和日志,插入的数据直接写入到文件系统,在生产环境中,写入的话主要以批量插入数据为主。在查询过程中,数据通过数组来处理(向量或者列Chunk),查询时,操作被转发到数组上,而不是在特定的值上。因此被称为”向量化查询执行”,相对于实际的数据处理成本,向量化处理具有更低的转发成本。
更多内容请关注每日编程。