1、ClickHouse介绍
2、clickhouse安装与简单验证(centos)
3、ClickHouse表引擎-MergeTree引擎
4、clickhouse的Log系列表引擎、外部集成表引擎和其他特殊的表引擎介绍及使用
5、ClickHouse查看数据库容量、表的指标、表分区、数据大小等
本文主要分为三部分,即OLAP关键特性、clickhouse特性和配置文件的简单介绍。
Clickhouse是一个高性能且开源的数据库管理系统,主要用于在线分析处理(OLAP)业务。它采用列式存储结构,可使用SQL语句实时生成数据分析报告,另外它还支持索引,分布式查询以及近似计算等特性,凭借其优异的表现,ClickHouse在各大互联网公司均有广泛地应用。
官网:https://clickhouse.com/
中文官网:https://clickhouse.com/docs/zh
OLAP业务场景与业务场景OLTP等有很大的不同,使用OLTP数据库或Key-Value数据库去处理分析查询业务将会获得非常差的性能。
另外,相比于行式数据库,列式数据库则更适用于OLAP场景,因为对于大多数的查询而言,列式数据库的处理速度要至少比行式数据库快100倍。二者的性能差别很大,列式数据库明显占优,主要体现在如下:
相比于其它的列式数据库,ClickHouse的以下特性决定了它更适用于OLAP业务场景
在使用ClickHouse之前,我们需要修改ClickHouse配置文件中的一些默认配置,比如数据存储路径,集群信息以及用户信息等,这样可以更好地对ClickHouse进行管理控制,以满足我们的业务需求。
<path>/path/to/clickhouse/path>
ClickHouse的日志文件中记录了各种类型的事件日志,包括数据的插入和查询的日志以及一些配置和数据合并相关的日志等。一般我们会通过日志文件找出ClickHouse报错的具体原因,以便解决问题。
日志的配置如下所示,其对应的XML标签为
<logger>
<level>tracelevel>
<log>/path/to/clickhouse-server/clickhouse-server.loglog>
<errorlog>/path/to/clickhouse-server/clickhouse-server.err.logerrorlog>
<size>1000Msize>
<count>10count>
logger>
事件日志是由多线程异步写入到日志文件中的,所以不同事件之间的日志会产生交错,不利于按顺序进行日志排查。但ClickHouse为每个事件都提供了唯一的ID来标识,我们可以根据此ID来跟踪事件状态的变化
集群的配置主要用于分布式查询,在创建分布式表(Distributed)时会用到。
集群配置文件的示例如下所示,其对应的XML标签为
<yandex>
<remote_servers>
<cluster_name>
<shard>
<weight>1weight>
<internal_replication>falseinternal_replication>
<replica>
<host>hostname1/ip1host>
<port>9000port>
replica>
shard>
<shard>
<weight>1weight>
<internal_replication>falseinternal_replication>
<replica>
<host>hostname2/ip2host>
<port>9000port>
replica>
shard>
cluster_name>
remote_servers>
yandex>
在实际情况下,一般不会通过集群进行数据写入,而是将数据直接写入到各ClickHouse节点。一来通过集群进行分发数据会带来二次的网络延迟,降低了数据的写入速度,二来当数据量较多时,由于网络带宽限制,数据分发节点会成为数据传输的瓶颈,从而拉低了整体的数据写入效率
可以定义多个集群,以应对不同的查询需要。每次添加新的集群配置后,无需重启ClickHouse服务,该配置会即时生效
更多信息参考官网关于字典配置
字典就是一种 键->值 映射关系,一般在数据查询时使用。相比于多表JOIN的查询操作,使用字典查询会更加高效。
字典文件的位置需要由config.xml文件中的dictionaries_config配置项设置。
<dictionaries_config>dictionaries/*_dictionary.xmldictionaries_config>
上述配置表示ClickHouse会从与config.xml文件同级的dictionaries目录下加载以_dictionary.xml为后缀的全部字典文件
字典配置文件的示例如下所示,其对应的XML标签为
<dictionary>
<name>dict_namename>
<format>TabSeparatedformat>
<file>file>
<source>
source>
<layout>
<complex_key_hashed>complex_key_hashed>
layout>
<structure>
<key>
<attribute>
<name>keyname>
<type>Stringtype>
attribute>
key>
<attribute>
<name>valuename>
<type>Stringtype>
<null_value>null_value>
<injective>trueinjective>
attribute>
structure>
<lifetime>300lifetime>
dictionary>
创建完字典后,我们就可以通过SELECT dictGetTYPE语句来查询字典中指定key值对应的value了。其中TYPE表示具体的数据类型,比如获取字符串类型的值可以使用dictGetString。
除了使用配置文件来创建字典外,还可以使用SQL语句来生成字典。但相对而言,使用配置文件会更加直观便捷
sql语句示例
CREATE DICTIONARY dict_name
(
... -- attributes
)
PRIMARY KEY ... -- complex or single key configuration
SOURCE(...) -- Source configuration
LAYOUT(...) -- Memory layout configuration
LIFETIME(...) -- Lifetime of dictionary in memory
config.xml可以指定单独的文件来对用户信息进行配置,用户配置文件的路径通过users_config配置项指定,默认为users.xml。
<users_xml>
<path>users.xmlpath>
users_xml>
与config.xml文件类似,用户配置也可以被切分为不同的文件以便于管理,这些文件需要保存到users.d目录下。
ClickHouse的默认用户为default,密码为空。
用户配置的示例如下所示,其对应的XML标签为
<clickhouse>
<profiles>
<default>
<max_memory_usage>10000000000max_memory_usage>
<load_balancing>randomload_balancing>
default>
<readonly>
<readonly>1readonly>
readonly>
profiles>
<users>
<default>
<password>password>
<networks>
<ip>::/0ip>
networks>
<profile>defaultprofile>
<quota>defaultquota>
default>
users>
<quotas>
<default>
<interval>
<duration>3600duration>
<queries>0queries>
<errors>0errors>
<result_rows>0result_rows>
<read_rows>0read_rows>
<execution_time>0execution_time>
interval>
default>
quotas>
clickhouse>
<profiles>
<default>
<max_threads>8max_threads>
default>
<profile_name>
<max_memory_usage>30000000000max_memory_usage>
<load_balancing>in_orderload_balancing>
<readonly>1readonly>
profile_name>
profiles>
profile的名称可以任意,不同的用户可以配置相同的profile。另外需要注意,defaultprofile必须存在,它会在ClickHouse启动时作为默认的设置使用。
<quotas>
<default>
<interval>
<duration>3600duration>
<queries>0queries>
<errors>0errors>
<result_rows>0result_rows>
<read_rows>0read_rows>
<execution_time>0execution_time>
interval>
default>
quotas>
配额限制与profile中限制的主要区别在于,它可以对一段时间内运行的一组查询设置限制,而不是限制单个查询。
除了使用配置文件管理用户,还可以基于SQL语句来创建、修改或删除用户。但相对而言,使用配置文件会更加直观便捷。
zookeeper配置允许ClickHouse与一个ZooKeeper集群进行交互。ClickHouse主要使用ZooKeeper来存储复制表的元数据,当不使用复制表时,该配置可以忽略。
ZooKeeper配置文件的示例如下所示,其对应的XML标签为
<yandex>
<zookeeper replace="true">
<node index="1">
<host>hostname1/ip1host>
<port>2181port>
node>
<node index="2">
<host>hostname2/ip2host>
<port>2181port>
node>
<node index="3">
<host>hostname3/ip3host>
<port>2181port>
node>
zookeeper>
yandex>
node表示一个ZooKeeper节点,可以设置多个。当尝试连接到ZooKeeper集群时,index属性指定了各节点的连接顺序。
macros配置主要用来替换复制表的参数,在创建复制表时需要用到,当不使用复制表时,该配置可以忽略。
Macros配置文件的示例如下所示,其对应的XML标签为
<yandex>
<macros replace="true">
<shard>01shard>
<replica>hostname/ipreplica>
macros>
yandex>
该配置用来供Prometheus获取ClickHouse的指标信息。
Prometheus配置的示例如下所示,其对应的XML标签为
<prometheus>
<endpoint>/metricsendpoint>
<port>9363port>
<metrics>truemetrics>
<events>trueevents>
<asynchronous_metrics>trueasynchronous_metrics>
prometheus>
该配置用来对使用MergeTree系列引擎的表进行微调。除非你对该配置有充分的了解,否则不建议修改。
MergeTree配置的示例如下所示,其对应的XML标签为
<merge_tree>
<parts_to_throw_insert>300parts_to_throw_insert>
merge_tree>
<timezone>Asia/Shanghaitimezone>
<max_connections>4096max_connections>
<max_concurrent_queries>200max_concurrent_queries>
<max_server_memory_usage>0max_server_memory_usage>
<max_table_size_to_drop>0max_table_size_to_drop>
单位为字节,默认值为50G,当表中数据大小超过该限制时,不能使用DROP语句去删除该表(防止误操作)。如果设置为0,表示没有任何限制。如果你仍然想删除某个数据量超限的表而不想修改上述配置并重启ClickHouse时,可以在ClickHouse的数据目录下创建一个标志文件/path/to/clickhouse/flags/force_drop_table表示可以强制删除该表,然后执行DROP语句即可删表成功。需要注意上述标志文件在执行完一次DROP语句后会被自动删除以防止再次执行意外的DROP操作,因此执行创建标志文件和执行DROP语句的系统用户(非ClickHouse用户)应该保持一致,以避免在执行完DROP语句后,用户没有权限删除标志文件,从而导致后续操作失误并造成数据损失。
更多的配置可参见其官方文档,然后再按需调整。
以上,针对clickhouse进行了初步介绍。