内容大纲:背景;Clickhouse介绍;Clickhouse架构和性能;好未来的Clickhouse实践;建设和规划;参考。背景在日志中心发展初期,日志的检索和分析主要基于elasticsearch。随着越来越多的服务接入日志中心,数据量逐渐增加。基于日志的分析和监控告警需求越来越复杂。使用elasticsearch很难满足,需要根据需求场景选择合适的数据库。我们需要的:数据量会很大,需要分布式;支持实时写入,支持快速计算,短时间内完成计算;强大的sql能力,实时指标sql;人力有限,运维需求简单;高效压缩比存储,有限的服务器,用更少的服务器存储更多的数据;基于以上特点,我们选择了Clickhouse,接下来我们将介绍Clickhouse的特点、系统架构和使用方法。Clickhouse介绍1.Clickhouse的特点=================图2-1Clickhouse的特点可以看到,Clickhouse的特点正是我们所需要的。下面详细介绍核心特性:1)完善的DBMS功能:ClickHouse具有完善的管理功能,所以可以称之为DBMS(DatabaseManagementSystem,数据库管理系统),而不仅仅是一个数据库。作为DBMS,它具有一些基本功能,如:DDL(数据定义语言):可以在不重启服务的情况下动态创建、修改或删除数据库、表和视图;DML(DataManipulationLanguage):可以动态查询、插入、修改或删除数据;权限控制:可以根据用户粒度设置对数据库或表的操作权限,保证数据安全;数据备份与恢复:提供数据备份导出与导入恢复机制,满足生产环境需求;分布式模式管理:提供集群模式,可以自动管理多个数据库节点。2)列存储和数据压缩列存储和数据压缩是高性能数据库必不可少的特性。让查询更快最简单有效的方法就是减少数据扫描范围和数据传输的大小,而列式存储和数据压缩可以帮助我们实现以上两点。由于Clickhouse是真正意义上的列式存储,每一列都在不同的文件下,所以文件的数据类型是一致的,可以更有效地进行压缩。3)向量化执行引擎向量化执行是以列存储为前提的。主要思路是每次从磁盘中读取一批列,这些列以数组的形式组织起来。每个next通过for循环处理列数组。这样做可以大大减少下一次调用的次数。相应的CPU利用率得到了提高,并且数据也被组织在一起。可以进一步利用CPU硬件的特性,如SIMD,将所有数据加载到CPU的缓存中,提高缓存命中率,提高效率。在列存储和向量化执行引擎的双重优化下,查询执行速度将有巨大的飞跃。4)关系模型和SQL查询ClickHouse是一个关系型数据库。它可以支持几乎90%的sql作为查询语句,如groupby、orderby等。5)多样化的表引擎ClickHouse和mysql一样,也将存储部分抽象出来,将存储引擎作为一个独立的接口。因此,Clickhouse实现了多种表引擎,如mergetree、log、memory等多种类型的引擎。每个表引擎都有自己的特点。用户可以根据实际业务场景的需求,选择合适的表引擎使用。6)多线程、分布式的ClickHouse几乎具备现代高性能数据库的所有典型特征。可以说,提高性能的手段已经一一用尽。对于多线程、分布式等广泛使用的技术,自然是用不上的。下一个。7)多主架构HDFS、Spark、HBase、Elasticsearch等分布式系统均采用Master-Slave主从架构,由一个控制节点作为Leader统筹全局。ClickHouse与其他数据库的不同之处在于其集群架构,这使其成为多主架构。8)在线查询ClickHouse采用LSM树结构,所以ClickHouse的插入量可以很大。同时,Clickhouse内部的优化使其在复杂的查询场景下能够极速响应,无需对数据进行任何预处理。实现了实时数仓的效果9)数据分片和分布式查询Clickhouse具有分布式能力,天然支持数据分片。数据分片是数据的水平切分。这是在面对海量数据的场景下,是解决存储和查询瓶颈的有效手段。ClickHouse不像其他分布式系统那样具有高度自动化的分片功能。ClickHouse提供了LocalTable和DistributedTable的概念。本地表相当于数据分片。分布式表本身不存储任何数据,它是本地表的访问代理,其功能类似于分库中间件。借助分布式表,可以通过代理访问多个数据分片,从而实现分布式查询。2.Clickhouse常见应用场景电信行业用于存储数据和使用统计数据;新浪微博用于用户行为数据记录和分析;用于广告网络、RTB、电商用户行为分析;日志分析;探测与遥感信息挖掘;商业智能;网络游戏、物联网数据处理及价值数据分析;最大的应用来自Yandex.Metricca,Yandex的统计分析服务。Clickhouse架构及性能Clickhouse的集群架构不同于其他数据集群。它的集群能力是表级别的,而我们熟悉的大数据系统,比如Hadoop系列集群,是服务级别的。比如在一个hdfs集群中,所有的文件都会被分片备份;在Clickhouse集群中,你可以在创建表时决定是否使用它,这意味着单个Clickhouse节点实际上可以存活。有其他大数据经验的人可能会觉得这种设计有点奇怪,后面我们会从单机架构到集群架构进行详细介绍。=========================================================================================================================================================================================================1、Clickhouse单机架构设计官方对Clickhouse架构的介绍比较少。根据已有经验和外部资料,根据自己的理解还原clickhouse架构:图3-1clickhouse单机架构图1)Parser和InterpreterParser和Interpreter是非常重要的两组接口:Parser解析器形成AST语法树SQL语句的递归方式,不同类型的SQL会调用不同的parse实现类。Interpreter解释器负责解释AST并进一步创建查询执行管道。Interpreter解释器的作用类似于Service服务层,起到衔接整个查询过程的作用。它会根据解释器的类型聚合它需要的资源。首先,它解析AST对象;然后执行“业务逻辑”(如分支判断、设置参数、调用接口等);最后返回IBlock对象,并以线程的形式建立查询执行管道。2)表引擎表引擎是ClickHouse的一个显着特点。上面说了clickhouse有很多种表引擎。不同的表引擎由不同的子类实现。表引擎使用IStorage接口,定义了DDL(如ALTER、RENAME、OPTIMIZE、DROP等)、read、write方法,分别负责数据的定义、查询和写入。3)DataType负责DataType数据的序列化和反序列化。根据不同的数据类型,IDataType接口会有不同的实现类。DataType虽然会转发和反序列化数据,但不会直接和内存或磁盘交互,而是交给Column和Filed处理。4)Column和FieldColumn和Field是ClickHouse数据最基本的映射单元。作为一个100%列式存储的数据库,ClickHouse是按列存储数据的,内存中的一列数据用一个Column对象表示。Column对象分为接口和实现两部分。在IColumn接口对象中,定义了对数据进行各种关系操作的方法,如插入数据的insertRangeFrom和insertFrom方法,分页的cut方法,过滤方法的filter等,这些方法的具体实现对象由相应的对象实现到不同的数据类型,例如ColumnString、ColumnArray和ColumnTuple。大多数情况下,ClickHouse会以整列的形式操作数据,但也有例外。如果需要操作单个特定值(即单个列中的一行数据),则需要使用Field对象,它代表单个值。不同于Column对象的泛化设计思想,Field对象使用了聚合设计模式。Field对象内部聚合了Null、UInt64、String、Array等13种数据类型和相应的处理逻辑。5)BlockClickHouse内部的数据操作是针对Block对象进行的,采用流的形式。Column和Filed虽然构成了数据的基本映射单元,但仍然缺少一些与实际操作对应的必要信息,如数据的类型、列名等。所以ClickHouse设计了Block对象,可以看做是数据表的一个子集。Block对象的本质是由数据对象、数据类型和列名组成的三元组,即Column、DataType和列名字符串。Column提供了读取数据的能力,而DataType知道如何转发和反序列化,所以Block在这些对象的基础上实现了进一步的抽象和封装,从而简化了整个使用过程,只需要通过Block对象就可以完成一系列数据操作。在具体实现过程中,Block并没有直接聚合Column和DataType对象,而是通过ColumnWithTypeAndName对象进行间接引用。2.Clickhouse集群架构设计Clickhouse是一个集群,通过配置clickhouse_remote_servers来管理集群。在配置中,可以配置集群名称,集群需要的节点信息,通过这些信息可以配置分片和复制机制。简单配置为例:
