简介
1、由Yandex开源的高性能OLAP数据库
2、采用列式存储结构,拥有高效的数据压缩能力
3、通过多核并行处理以及向量执行引擎提升查询能力
4、多样化的表引擎用于支撑不同的应用场景
5、支持多线程和分布式处理
ClickHouse性能
100million条数据量下,ClickHouse的单表聚合查询性能非常高,是Greenplum(x2)集群的16倍,是PostgreSQL的10倍,是Mysql的833倍。
适用场景
- • 商业智能
- • 电信行业数据存储统计
- • 新浪微博用户行为记录分析
- • 电子商务用户分析
- • 金融等领域
不适用的场景
- • 不支持事务
- • 不擅长根据主键按行粒度进行查询(虽然支持)
- • 不擅长按行删除数据(虽然支持)
- • 不擅长按行更新数据(虽然支持)
ClickHouse采用列式存储,其格式相对于行存储格式来说,对行粒度查询进行处理稍显劣势。
核心特性
完备的DBMS功能
- • DDL:可以动态的创建、修改或删除数据库、表和视图
- • DML:可以动态查询、插入、修改或删除数据
- • 权限控制:可以按照用户粒度设置数据库或表的操作权限,保证数据安全
- • 数据备份与恢复,提供了数据的导入和导出恢复机制
- • 分布式管理:提供集群模式,能够自动管理多个数据库节点
列式存储和数据压缩
- • 列式存储有效减少查询时扫描数据量
- • 列式存储比行存储的另一个优势是数据压缩的友好性
- • 同一个字段拥有相同的数据类型和实现语义,数据重复项的可能性更高
- • 默认采用LZ4压缩算法(速度较快,但压缩率较低),以及ZSTD压缩算法(速度较慢,压缩率较高)
- • ClickHouse的LZ4算法在Yandex的生产环境数据压缩比能达到8:1
- • TPCH数据(无索引),ckdb压缩率达到52%,rocksdb达到61%
行式存储是按行读取,比如一个表中有很多列,读取其中三列,就需要对所有列进行一个扫描;列式存储只需要对所需要的三列进行读取,就有效的减少了查询时候的扫描数据量。
列式存储是一个字段作为一组数据进行一个存储。
向量化执行引擎
- • 利用寄存器硬件层面的特性,为上层的程序性能带来了指数级的提升
- • SIMD指令,单条指令操作多条数据,通过数据并行以提高数据的并行操作。它的原理是在CPU寄存器层面实现数据的并行操作。
通过数据的并行来提高数据的查询能力和处理能力。
多样化表引擎
- • 为了避免平庸,ClickHouse拥有和Mysql类似的表引擎设计,它拥有4大类30多种表引擎
- • 每一种表引擎都拥有各自的特点,用户可以根据实际业务场景的要求,选择合适的表引擎使用
- • ReplacingMergeTree
主要用于相同主键进行合并处理比如主键重复的数据有多条,可以在内部合并,最终保留一条
多线程和分布式
- • 多线程
如果说向量化执行是通过数据级并行的方式提升性能,那么多线程就是通过线程级并行的方式实现性能的提升,默认CPU核数的一半
- • 分布式
为了利用分布式设计,ClickHouse在数据存取,即支持分区(纵向扩展、利用多线程原理),也支持分片(横向扩展,利用分布式原理,由replica组成)
另外ClickHouse提供了本地表和分布式表的概念,本地表相当于数据分片,分布式表是本地表的访问代理,其本身不存储任何数据
ClickHouse架构设计
多主架构
区别于Master-Slave主从架构,ClickHouse采用了Multi-Master多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果
多主架构具有很多优势,不用区分多主控节点,数据节点和计算节点,集群中的所有节点功能相同,客户端访问每一个节点都能得到相同的效果
MergeTree原理解析