作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
ClickHouse是由 Yandex为 OLAP和大数据使用案例创建的开源,面向列的分析数据库。ClickHouse对实时查询处理的支持使其适用于需要次数分析结果的应用程序。
以列为导向的数据库将记录存储在列而不是行组合的块中. 通过不加载查询中不存在的列的数据,以列为导向的数据库在完成查询时花费更少的时间阅读数据。
Online Analytics Processing (OLAP) 系统允许组织大量数据并执行复杂查询. 它们能够快速管理数据,并返回查询结果。
在本教程中,您将安装ClickHouse数据库服务器和客户端在您的机器上. 您将使用DBMS进行典型的任务,并可选地从另一个服务器启用远程访问,以便您能够从另一个机器连接到数据库。
前提条件
- 一个 CentOS 7 服务器具有
sudo
启用的非根用户和防火墙设置. 您可以遵循初始服务器设置 教程来创建用户和此教程](https://andsky.com/tech/tutorials/additional-recommended-steps-for-new-centos-7-servers# configuring-a-basic-firewall)来设置防火墙。 - (可选) 一个副 CentOS 7 服务器具有
sudo
启用的非根用户和防火墙设置. 您可以遵循初始服务器设置 教程和防火墙的附加设置 教程
步骤 1 – 安装 ClickHouse
在本节中,您将使用yum
安装ClickHouse服务器和客户端程序。
首先,通过运行 SSH 到您的服务器:
1[environment local]
2ssh sammy@your_server_ip
通过执行: 安装基础依赖性:
1sudo yum install -y pygpgme yum-utils
pygpgme
包用于添加和验证 GPG 签名,而yum-utils
可轻松管理源 RPM。
Altinity,一个ClickHouse咨询公司,维护具有ClickHouse的最新版本的YUM存储库. 您将添加存储库的详细信息,通过创建该文件安全下载验证的ClickHouse包。
创建存储详细文件,执行:
1sudo vi /etc/yum.repos.d/altinity_clickhouse.repo
接下来,将以下内容添加到文件中:
1[label /etc/yum.repos.d/altinity_clickhouse.repo]
2[altinity_clickhouse]
3name=altinity_clickhouse
4baseurl=https://packagecloud.io/altinity/clickhouse/el/7/$basearch
5repo_gpgcheck=1
6gpgcheck=0
7enabled=1
8gpgkey=https://packagecloud.io/altinity/clickhouse/gpgkey
9sslverify=1
10sslcacert=/etc/pki/tls/certs/ca-bundle.crt
11metadata_expire=300
12
13[altinity_clickhouse-source]
14name=altinity_clickhouse-source
15baseurl=https://packagecloud.io/altinity/clickhouse/el/7/SRPMS
16repo_gpgcheck=1
17gpgcheck=0
18enabled=1
19gpgkey=https://packagecloud.io/altinity/clickhouse/gpgkey
20sslverify=1
21sslcacert=/etc/pki/tls/certs/ca-bundle.crt
22metadata_expire=300
现在您已添加了存储库,请使用以下命令启用它们:
1sudo yum -q makecache -y --disablerepo='*' --enablerepo='altinity_clickhouse'
「-q」旗指示命令在安静模式下运行,而「makecache」命令使在「--enablerepo」旗下指定的包可用。
在执行时,您将看到类似于以下的输出:
1[secondary_label Output]
2Importing GPG key 0x0F6E36F6:
3 Userid : "https://packagecloud.io/altinity/clickhouse (https://packagecloud.io/docs#gpg_signing) <[email protected]>"
4 Fingerprint: 7001 38a9 6a20 6b22 bf28 3c06 ed26 58f3 0f6e 36f6
5 From : https://packagecloud.io/altinity/clickhouse/gpgkey
输出证实它已成功验证并添加了 GPG 密钥。
clickhouse-server
和 clickhouse-client
套件现在可供安装。
1sudo yum install -y clickhouse-server clickhouse-client
您已经成功安装了 ClickHouse 服务器和客户端,您现在已经准备好启动数据库服务,并确保它正确运行。
步骤2 - 开始服务
您在上一节安装的clickhouse-server
包创建了一个systemd
服务,它执行数据库服务器的启动、停止和重新启动等操作。
启动clickhouse-server
服务,运行:
1sudo service clickhouse-server start
您将看到类似于以下的输出:
1[secondary_label Output]
2Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
3DONE
要验证服务是否成功运行,请执行:
1sudo service clickhouse-server status
它会打印类似于以下的输出,表示服务器正在正常运行:
1[secondary_label Output]
2clickhouse-server service is running
您已经成功启动了 ClickHouse 服务器,现在可以使用clickhouse-client
CLI 程序连接到服务器。
步骤 3 – 创建数据库和表
在 ClickHouse 中,您可以通过直接在交互式数据库提示程序中执行 SQL 语句来创建和删除数据库. 语句由遵循特定语法的命令组成,该命令告诉数据库服务器执行所要求的操作以及所需的任何数据。
1clickhouse-client --multiline
此命令会将您登录到客户端提示,在那里您可以运行 ClickHouse SQL 语句以执行如下操作:
- 创建、更新和删除数据库、表、索引、分区和视图。
- 执行查询以获取可选地过滤和组合使用各种条件的数据。
--multiline
旗告诉 CLI 允许输入跨多个行的查询。
在此步骤中,随着ClickHouse客户端准备输入数据,您将创建一个数据库和表. 为此教程的目的,您将创建一个名为测试
的数据库,并在其内部,您将创建一个名为访问
的表,该表跟踪网站访问的持续时间。
现在你在ClickHouse命令提示中,通过执行创建你的测试
数据库:
1CREATE DATABASE test;
您将看到以下输出显示您已创建数据库:
1[secondary_label Output]
2
3CREATE DATABASE test
4
5Ok.
6
70 rows in set. Elapsed: 0.003 sec.
ClickHouse 表类似于其他关系数据库中的表;它具有结构化格式的相关数据的集合,您可以指定列及其类型,添加数据行,并在表中执行不同类型的查询。
在 ClickHouse 中创建表的语法遵循此示例结构:
1CREATE TABLE table_name
2(
3 column_name1 column_type [options],
4 column_name2 column_type [options],
5 ...
6) ENGINE = engine
table_name
和 column_name
值可以是任何有效的 ASCII 标识符. ClickHouse 支持广泛的列类型,其中一些最受欢迎的类型是:
UInt64
:用于存储 0 到 18446744073709551615 范围内的整数值。Float64
:用于存储浮点数,如 2039.23, 10.5 等。String
:用于存储变长字符。 它不需要最大长度属性,因为它可以存储任意长度。Date
:用于存储遵循YYYYY-MM-DD
格式的日期。
在 ClickHouse 中, Engines 决定了底层数据的物理结构、表的查询能力、同时访问模式以及对索引的支持。
现在你有创建表的概述,你将创建一个表. 开始通过确认你正在修改的数据库:
1USE test;
您将看到以下输出显示您已从默认
数据库切换到测试
数据库:
1[secondary_label Output]
2
3USE test
4
5Ok.
6
70 rows in set. Elapsed: 0.001 sec.
本指南的其余部分将假定您正在在该数据库的背景下执行陈述。
通过运行此命令创建您的访问
表:
1CREATE TABLE visits (
2 id UInt64,
3 duration Float64,
4 url String,
5 created DateTime
6) ENGINE = MergeTree()
7PRIMARY KEY id
8ORDER BY id;
你创建了一个名为访问
的表,它有四个列:
类似于其他 RDBMS 系统,ClickHouse 中的主要密钥列可以独特地识别一个行;每个行都应该为该列具有独特的值。
持续时间
:用于存储每次访问的持续时间的浮动列。float
列可以存储 12.50 等十进制值。
列定义后,您将MergeTree
指定为表的存储引擎。 MergeTree 家族引擎被推荐用于生产数据库,因为它对大型实时插入,整体强度和查询支持的优化支持。
如果您打算使用 ClickHouse 来存档不经常查询的数据或存储临时数据,您可以使用 日志家族的引擎来优化此用例。
列定义后,您将定义其他表级选项。PRIMARY KEY
条款将id
设置为主要钥匙列,而ORDER BY
条款将存储由id
列排序的值。
在执行创建语句时,您将看到以下输出:
1[secondary_label Output]
2CREATE TABLE visits
3(
4 id UInt64,
5 duration Float64,
6 url String,
7 created DateTime
8)
9ENGINE = MergeTree()
10PRIMARY KEY id
11ORDER BY id
12
13Ok.
14
150 rows in set. Elapsed: 0.010 sec.
在本节中,您创建了一个数据库和一个表来跟踪网站访问数据. 在下一步,您将将数据插入表中,更新现有数据,并删除这些数据。
步骤 4 – 插入、更新和删除数据和列
在此步骤中,您将使用访问
表来插入、更新和删除数据. 以下命令是插入行到 ClickHouse 表的语法的例子:
1INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);
现在,在您的访问
表中插入几个示例网站访问数据行,运行下列每一个陈述:
1INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
1INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
1INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
1INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');
您将看到每一个插入语句重复的下列输出:
1[secondary_label Output]
2
3INSERT INTO visits VALUES
4
5Ok.
6
71 rows in set. Elapsed: 0.004 sec.
每个行的输出显示您已成功将其插入到访问
表中。
现在您将添加一个额外的列到访问
表. 当从现有表中添加或删除列时,ClickHouse 支持ALTER
语法。
例如,将列添加到表的基本语法如下:
1ALTER TABLE table_name ADD COLUMN column_name column_type;
添加一个名为位置
的列,通过运行以下语句来存储访问网站的位置:
1ALTER TABLE visits ADD COLUMN location String;
您将看到类似于以下的输出:
1[secondary_label Output]
2ALTER TABLE visits
3 ADD COLUMN
4 location String
5
6Ok.
7
80 rows in set. Elapsed: 0.014 sec.
输出显示您已成功添加位置
列。
从版本 19.4.3 开始,ClickHouse 不会因为实施限制而支持更新和删除单个数据行,但是,ClickHouse 支持大量更新和删除,并为这些操作提供了不同的 SQL 语法,以突出其非标准使用。
以下语法是大量更新行的一个例子:
1ALTER TABLE table_name UPDATE column_1 = value_1, column_2 = value_2 ... WHERE filter_conditions;
您将运行以下语句来更新所有具有持续时间
小于 15 的行的url
列,将其输入到执行的数据库提示:
1ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;
大量更新声明的输出将如下:
1[secondary_label Output]
2
3ALTER TABLE visits
4 UPDATE url = 'http://example2.com' WHERE duration < 15
5
6Ok.
7
80 rows in set. Elapsed: 0.003 sec.
输出显示您的更新查询已成功完成. 输出中的0行在集合中
表示查询未返回任何行;这将适用于任何更新和删除查询。
大量删除行示例语法类似于更新行,并且具有以下结构:
1ALTER TABLE table_name DELETE WHERE filter_conditions;
若要测试删除数据,请运行以下语句,以删除所有具有持续时间
小于 5 的行:
1ALTER TABLE visits DELETE WHERE duration < 5;
大量删除声明的输出将类似于:
1[secondary_label Output]
2
3ALTER TABLE visits
4 DELETE WHERE duration < 5
5
6Ok.
7
80 rows in set. Elapsed: 0.003 sec.
输出确认您已删除持续时间不到五秒的行。
若要从表中删除列,语法将遵循以下示例结构:
1ALTER TABLE table_name DROP COLUMN column_name;
删除您之前添加的位置
列,运行以下操作:
1ALTER TABLE visits DROP COLUMN location;
确认您已删除列的DOP COLUMN
输出将如下:
1[secondary_label Output]
2ALTER TABLE visits
3 DROP COLUMN
4 location String
5
6Ok.
7
80 rows in set. Elapsed: 0.010 sec.
现在,您已在访问
表中成功插入、更新和删除行和列,您将在下一步继续查询数据。
步骤五:查询数据
ClickHouse 的查询语言是 SQL 的自定义方言,具有适用于分析工作负载的扩展和函数. 在此步骤中,您将运行选择和汇总查询,从访问
表中获取数据和结果。
选择查询允许您检索由您指定的条件过滤的数据行和列,以及返回的行数等选项,您可以使用SELECT
语法选择数据行和列。
1SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;
运行以下语句来检索url
和持续时间
值的行,其中url
是http://example.com
:
1SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;
您将看到以下结果:
1[secondary_label Output]
2SELECT
3 url,
4 duration
5FROM visits
6WHERE url = 'http://example2.com'
7LIMIT 2
8
9┌─url─────────────────┬─duration─┐
10│ http://example2.com │ 10.5 │
11└─────────────────────┴──────────┘
12┌─url─────────────────┬─duration─┐
13│ http://example2.com │ 13 │
14└─────────────────────┴──────────┘
15
162 rows in set. Elapsed: 0.013 sec.
输出返回了与您指定的条件相匹配的两个行. 现在您已经选择了值,您可以转到执行聚合查询。
聚合查询是对一组值运作并返回单个输出值的查询。在分析数据库中,这些查询经常运行,并且由数据库优化得很好。
数
:返回符合指定的条件的行数。总
:返回所选列值的总和。avg
:返回所选列值的平均值。
一些 ClickHouse 特定的聚合函数包括:
uniq
:返回相匹配的差不多不同的行。topK
:使用近似算法返回特定列中最常见值的数组。
要演示汇总查询的执行情况,您将通过运行总
查询来计算访问的总持续时间:
1SELECT SUM(duration) FROM visits;
您将看到类似于以下的输出:
1[secondary_label Output]
2
3SELECT SUM(duration)
4FROM visits
5
6┌─SUM(duration)─┐
7│ 63.7 │
8└───────────────┘
9
101 rows in set. Elapsed: 0.010 sec.
现在,通过执行计算前两个URL:
1SELECT topK(2)(url) FROM visits;
您将看到类似于以下的输出:
1[secondary_label Output]
2SELECT topK(2)(url)
3FROM visits
4
5┌─topK(2)(url)──────────────────────────────────┐
6│ ['http://example2.com','http://example1.com'] │
7└───────────────────────────────────────────────┘
8
91 rows in set. Elapsed: 0.010 sec.
现在您已成功查询您的访问
表,您将在下一步中删除表和数据库。
步骤 6 – 删除表和数据库
在本节中,您将删除您的访问
表和测试
数据库。
删除表的语法遵循此示例:
1DROP TABLE table_name;
要删除访问
表,运行以下语句:
1DROP TABLE visits;
您将看到以下输出声明您已成功删除表:
1[secondary_label Output]
2DROP TABLE visits
3
4Ok.
5
60 rows in set. Elapsed: 0.005 sec.
您可以使用「DROP 数据库 table_name」语法删除数据库. 若要删除「test」数据库,请执行以下命令:
1DROP DATABASE test;
结果显示您已成功删除数据库:
1[secondary_label Output]
2
3DROP DATABASE test
4
5Ok.
6
70 rows in set. Elapsed: 0.003 sec.
您已在此步骤中删除表和数据库,现在您已在 ClickHouse 实例中创建、更新和删除数据库、表和数据,您将在下一节中启用远程访问数据库服务器。
步骤 7 – 设置防火墙规则(可选)
如果您打算在同一服务器上运行的应用程序仅在本地使用 ClickHouse,或者在服务器上没有启用防火墙,则不需要完成此部分。
目前,您的服务器已启用了防火墙,该防火墙阻止您的公共IP地址访问所有端口,您将完成以下两步以允许远程访问:
- 添加一个允许接入连接的防火墙规则到端口
8123
,这是ClickHouse 服务器运行的 HTTP 端口。
如果您在数据库提示中,请通过键入CTRL+D
来退出数据库。
通过执行编辑配置文件:
1sudo vi /etc/clickhouse-server/config.xml
然后删除包含 <!-- <listen_host>0.0.0.0</listen_host> -->
的行,如下文件:
1[label /etc/clickhouse-server/config.xml]
2
3...
4 <interserver_http_host>example.yandex.ru</interserver_http_host>
5 -->
6
7 <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
8 <!-- <listen_host>::</listen_host> -->
9 <!-- Same for hosts with disabled ipv6: -->
10 <listen_host>0.0.0.0</listen_host>
11
12 <!-- Default values - try listen localhost on ipv4 and ipv6: -->
13 <!--
14 <listen_host>::1</listen_host>
15 <listen_host>127.0.0.1</listen_host>
16 -->
17...
保存文件并输出 vi
. 若要应用新的配置,请通过运行重新启动服务:
1sudo service clickhouse-server restart
您将看到该命令的以下输出:
1[secondary_label Output]
2Stop clickhouse-server service:
3DONE
4Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
5DONE
将远程服务器的 IP 添加到称为公共的区域:
1sudo firewall-cmd --permanent --zone=public --add-source=second_server_ip/32
ClickHouse 的服务器在端口8123
上收听 HTTP 连接和端口9000
上收听来自clickhouse-client
的连接。
1sudo firewall-cmd --permanent --zone=public --add-port=8123/tcp
2sudo firewall-cmd --permanent --zone=public --add-port=9000/tcp
对于两个命令,您将看到以下输出,表明您已启用对两个端口的访问:
1[secondary_label Output]
2success
现在你已经添加了规则,重新加载防火墙,以便更改生效:
1sudo firewall-cmd --reload
此命令还会输出一个成功
消息 ClickHouse 现在可以从您添加的 IP 访问。
要验证您可以从远程机器连接到 ClickHouse 服务器,请先按照本教程第 1 步的步骤在第二个服务器上进行连接,并确保您安装了clickhouse-client
。
现在您已登录到第二个服务器,请通过执行下列操作开始客户端会话:
1[environment second]
2clickhouse-client --host your_server_ip --multiline
您将看到以下输出显示您已成功连接到服务器:
1[environment second]
2[secondary_label Output]
3ClickHouse client version 19.4.3.
4Connecting to your_server_ip:9000 as user default.
5Connected to ClickHouse server version 19.4.3 revision 54416.
6
7hostname :)
在此步骤中,您已通过调整防火墙规则来启用远程访问您的 ClickHouse 数据库服务器。
结论
您已成功在您的服务器上设置了 ClickHouse 数据库实例,创建了数据库和表,添加了数据,执行了查询,并删除了数据库。在 ClickHouse 的文档中,您可以阅读他们的 基准与其他开源和商业分析数据库和一般参考 文档相比。