暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

学习ClickHouse,第一课

大名鼎鼎的ClickHouse是俄罗斯的Yandex在2016年开源的列式数据库,软件使用的是C++语言编写。主要使用的场景是OLAP(在线分析领域)。能够用SQL语句实时的生成分析报表。

以下两幅图来自于官方,展示了行式数据库和列式数据库工作模式的的不同。

行式

列式

列存的好处如下:

比如在I/O方面,针对分析类查询,通常只需要读取表的一小部分列,在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这能帮助你最少减少20倍的I/O消耗。由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列存储这也更容易压缩,可以进一步降低I/O容量。由于I/O的降低,也会帮助更多的数据被系统缓存。

在CPU方面,由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。关于向量执行引擎(Vectorized execution engine),其实是对内存中的列式数据,一个batch调用一次SIMD指令。可以减少函数调用次数、降低了cache miss,充分发挥SIMD指令的并行能力,大幅缩短了计算耗时。

安装

我们先把数据库安装起来,安装数据库之前先要检查是否支持SSE4.2
指令集。

[root@localhost ~]# grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"SSE 4.2 supported

下载安装软件包。

[root@localhost ~]# useradd clickhouse[root@localhost ~]# passwd clickhouse[root@localhost ~]su - clickhouse [clickhouse@localhost ~]$ mkdir clickhouse[clickhouse@localhost ~]$ cd clickhousecurl -O https://repo.clickhouse.tech/tgz/clickhouse-common-static-20.2.1.2183.tgzcurl -O https://repo.clickhouse.tech/tgz/clickhouse-common-static-dbg-20.2.1.2183.tgzcurl -O https://repo.clickhouse.tech/tgz/clickhouse-server-20.2.1.2183.tgzcurl -O https://repo.clickhouse.tech/tgz/clickhouse-client-20.2.1.2183.tgz[clickhouse@localhost clickhouse]$ ls -lrttotal 1228952-rw-rw-r--. 1 clickhouse clickhouse  114133962 Sep  8 17:14 clickhouse-common-static-20.2.1.2183.tgz-rw-rw-r--. 1 clickhouse clickhouse 1144068301 Sep  8 17:20 clickhouse-common-static-dbg-20.2.1.2183.tgz-rw-rw-r--. 1 clickhouse clickhouse     126565 Sep  9 08:41 clickhouse-server-20.2.1.2183.tgz-rw-rw-r--. 1 clickhouse clickhouse     111528 Sep  9 08:41 clickhouse-client-20.2.1.2183.tgz

安装软件包总共分为4个,解压后运行脚本就可以了。

$ tar -xzvf clickhouse-common-static-20.2.1.2183.tgz$ tar -xzvf clickhouse-common-static-dbg-20.2.1.2183.tgz$ tar -xzvf clickhouse-server-20.2.1.2183.tgz$ tar -xzvf clickhouse-client-20.2.1.2183.tgz$ sudo clickhouse-common-static-20.2.1.2183/install/doinst.sh$ sudo clickhouse-common-static-dbg-20.2.1.2183/install/doinst.sh$ sudo clickhouse-server-20.2.1.2183/install/doinst.sh$ sudo /etc/init.d/clickhouse-server start

注意最后一个是启动服务的,启动完成后应该会有一个提示,也可以运行命令检查一下服务是否正常运行。

[clickhouse@localhost clickhouse]$ sudo /etc/init.d/clickhouse-server startStart clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/DONE[clickhouse@localhost clickhouse]$ sudo service clickhouse-server statusclickhouse-server service is running

这种脚本配置安装还是不错的,省去新手配置服务的各种麻烦。接下来我们把客户端安装一下,并测试使用客户端连上服务器。

sudo clickhouse-client-20.2.1.2183/install/doinst.sh[clickhouse@localhost clickhouse]$ clickhouse-clientClickHouse client version 20.2.1.2183 (official build).Connecting to localhost:9000 as user default.Connected to ClickHouse server version 20.2.1 revision 54432.localhost :) localhost :) show databases;SHOW DATABASES┌─name────┐│ default ││ system  │└─────────┘

数据库引擎

安装完成之后,我们来介绍一下Clickhouse的一些特色,数据库引擎。默认的数据库引擎是Atomic,它提供可配置的表引擎和SQL方言。

还有其他数据库引擎,如下图所示:

img
  • MySQL :MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT
    SELECT
    查询,以方便您在ClickHouse与MySQL之间进行数据交换。MySQL数据库引擎会将查询转换为MySQL语法并发送到MySQL服务器中,因此您可以执行诸如SHOW TABLES
    SHOW CREATE TABLE
    之类的操作。
  • MaterializedMySQL :使用MySQL中存在的所有表以及这些表中的数据创建ClickHouse数据库。ClickHouse 服务器成为MySQL的副本。并且读取binlog并执行DDL和DML查询。
  • Lazy: 在最后一次访问之后,只在RAM中保存expiration_time_in_seconds
    秒。只能用于Log表。它是为存储许多小的Log表而优化的,对于这些表,访问之间有很长的时间间隔。
  • Atomic : 默认的存储引擎。
  • PostgreSQL :允许连接到远程PostgreSQL服务器。支持读写操作(SELECT
    INSERT
    ),并在ClickHouse和PostgreSQL之间交换数据。
  • MaterializedPostgreSQL :使用PostgreSQL数据库表的初始数据转储创建ClickHouse数据库,并启动复制过程,即执行后台作业,然后应用PostgreSQL中发生的数据改变。
  • Replicated :该引擎基于Atomic引擎。它支将DDL日志写入ZooKeeper并在给定数据库的所有副本上执行的元数据复制。
  • SQLite :允许连接到SQLite数据库并执行读写操作(INSERT
    SELECT
    ),并在ClickHouse和SQLite之间交换数据。

其中MaterializedMySQL 和MaterializedPostgreSQL这两个是实验功能,但是这两个实验功能确是非常有意义的功能,可以说开创一个新的想法。他可以让Clickhouse成为MySQL或者是PostgreSQL的从库,从而让行式数据库,有了一份列式数据的从库。这样当我们要执行OLTP就在MySQL和PostgreSQL上运行,而执行OLAP的查询,就可以直接在Clickhouse上运行。

表引擎

表引擎(即表的类型)决定了:

  • 数据的存储方式和位置,写到哪里以及从哪里读取数据
  • 支持哪些查询以及如何支持。
  • 并发数据访问。
  • 索引的使用(如果存在)。
  • 是否可以执行多线程请求。
  • 数据复制参数。

表引擎有以下几种:

img

MergeTree:适用于高负载任务的最通用、功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。Log:具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

Integration Engines(集成引擎):用于与其他的数据存储与处理系统集成的引擎。Speical Engines : 特定功能的引擎Virtual Columns : 虚拟列,是表引擎的一部分。

后记

先写到这儿,关于CPU的向量执行引擎(Vectorized execution engine),先研究一番再写一篇科普。

文章转载自励志成为postgresql大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论