一、ClickHouse介绍
ClickHouse(开源)是一个面向列的数据库管理系统(DBMS),用于在线分析处理查询(OLAP)。
关键词:开源、面向列、联机分析处理(OLAP)
ClickHouse不仅查询速度快(相较于hive等类似的分析型DBMS),而且硬件使用效率、容错性、可靠性、易用性、线性扩展性等高。
1.1 ClickHouse的独特功能
-
真正的列式DBMS 除了数据本身外不应该存在其他额外的数据。这意味着为了避免在值旁边存储它们的长度“number”,你必须支持固定长度数值类型。
-
数据压缩 数据压缩存储在性能方面发挥着关键作用
-
数据的磁盘存储 工作在传统磁盘上的系统
-
多核心并行处理 大型查询以一种自然的方式并行化,占用当前服务器上可用的所有必要资源
-
多服务器分布式处理 在ClickHouse中,数据可以保存在不同的shard上,每一个shard都由一组用于容错的replica组成,查询可以并行的在所有shard上进行处理
-
支持SQL ClickHouse支持基于SQL的查询语言,该语言大部分情况下是与SQL标准兼容的。 支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。 不支持窗口函数和相关子查询
-
向量引擎 为了高效的使用CPU,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理
-
实时的数据更新 ClickHouse支持在表中定义主键。为了使查询能够快速在主键中进行范围查找,数据总是以增量的方式有序的存储在MergeTree中。因此,数据可以持续不断高效的写入到表中,并且写入的过程中不会存在任何加锁的行为
-
索引 按照主键对数据进行排序,使能够以几十毫秒的低延迟对数据进行特定值查找或范围查找
-
适合在线查询 在线查询意味着在没有对数据做任何预处理的情况下以极低的延迟处理查询并将结果加载到用户的页面中
-
支持近似计算 ClickHouse提供各种各样在允许牺牲数据精度的情况下对查询进行加速的方法: 1、用于近似计算的各类聚合函数,如:distinct values, medians, quantiles 2、 基于数据的部分样本进行近似查询。这时,仅会从磁盘检索少部分比例的数据。 3、 不使用全部的聚合条件,通过随机选择有限个数据聚合条件进行聚合。这在数据聚合条件满足某些分布条件下,在提供相当准确的聚合结果的同时降低了计算资源的使用。
1.2 OLAP场景特征(适用场景)
-
绝大多数都是读请求
-
数据以相当大的批量写入(> 1000行),而不是单行。
-
不再修改已添加的数据
-
每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
-
宽表,即每个表包含着大量的列
-
较少的查询(通常每台服务器每秒数百个查询或更少)
-
对于简单查询,允许延迟大约50毫秒
-
列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
-
处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
-
事务不是必须的
-
对数据一致性要求低
-
每一个查询除了一个大表外,其他都是小表
-
查询结果明显小于源数据。换句话说,数据被过滤或聚合后能够被存放在单台服务器的内存中
1.3 缺点(不适用场景)
-
没有完整的事物支持
-
缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR
-
稀疏索引使得ClickHouse不适合通过其键检索单行的点查询
1.4 官方性能对比
ClickHouse的性能超过了市场上现有的类似的面向列的DBMS。它每秒处理数亿到10亿行,每台服务器每秒处理数百亿字节的数据。单个查询(解压缩后,仅使用列)的处理性能峰值为每秒2 tb以上。 我们来看看官网提供的对比数据:分析型DBMS的性能比较
由上图看出,ClickHouse比传统的分析型数据库快100-1000倍。
毕竟是官方自己提供的数据,为了更加真实的性能测试,后面会在实际环境中和GreenPlum等做测试对比。
1.5 数据类型支持
-
UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 分别对应mysql数据类型smallint,tinyint,int,bigint/long
-
Float32, Float64分别对应mysql数据类型 float,double
-
DateTime 分别对应mysql数据类型datetime/timestamp
-
Nullable 嵌套数据类型
二、安装部署(Centos7)
2.1 环境准备
参考hadoop集群搭建中的一、安装环境准备
和二、安装zookeeper
2.2 安装CLickHouse(每台集群)
在此只介绍脚本安装方式,手动及其他可参考: https://github.com/Altinity/clickhouse-rpm-install/blob/master/README.md https://clickhouse.yandex/docs/zh/getting_started/
Step1: 如果从官方仓库安装,需要确保您使用的是x86_64处理器构架的Linux并且支持SSE 4.2指令集 检查是否支持SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
返回结果应为:“SSE 4.2 supported”
Step2: 基于脚本安装
-
安装依赖
sudo yum install -y curl
-
下载运行脚本 centos7显式指定
os=centos dist=7
两个参数
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo os=centos dist=7 bash
-
查看clickhouse可用安装包
sudo yum list 'clickhouse*'
结果如下列表:有多个可用的包(包括新版本和旧工具),其中一些已经被弃用,因此不需要安装所有可用的rpm。
Step3: 安装ClickHouse的主要部分——服务器和客户端应用程序
sudo yum install -y clickhouse-server clickhouse-client
查看校验已安装列表
sudo yum list installed 'clickhouse*'
Step4: 配置目录查看及修改
-
安装完后默认的配置文件路径在
/etc/clickhouse-server/
下:config.xml(默认系统配置) 、users.xml(用户相关配置) 通过查看配置文件config.xml,定了默认的数据目录、临时目录、日志目录等;/var/lib/clickhouse
/var/lib/clickhouse/tmp/
/var/log/clickhouse-server
实际生产环境中,这些数据目录通常放在数据盘而不是系统盘,所以会做相应调整。 -
默认启动脚本:
/etc/rc.d/init.d/clickhouse-server
-
最大打开文件数:
/etc/security/limits.d/clickhouse.conf
clickhouse soft nofile 262144 clickhouse hard nofile 262144 -
定时任务文件:
/etc/cron.d/clickhouse-server
(看看就好了。cron进程执行时,就会自动扫描该目录下的所有文件,按照文件中的时间设定执行后面的命令),文件内容如下:
*/10 * * * * root (which service > /dev/null 2>&1 && (service clickhouse-server condstart ||:)) || /etc/init.d/clickhouse-server condstart > /dev/null 2>&1
-
安装二进制文件目录:
/usr/bin/clickhouse*
,共享文件目录:/usr/share/clickhouse/
大都软链接到了clickhouse这个二进制文件
更多服务端配置(/etc/clickhouse-server/config.xml )及说明文档
Step5: 确保ClickHouse服务器正在运行
sudo /etc/init.d/clickhouse-server restart
Step6: 客户端连接命令
clickhouse-client
至此单机安装完毕。
2.3 集群配置
这一部分官方文档整理的不够清晰条理,个人觉得。 首先查看配置文件的文档,里面大致介绍了服务端配置的覆盖(替代)文件和用户配置文件的创建和配置。然后找到分布式文档参考配置新的内容。具体整理如下步骤。
2.3.1 创建扩展配置文件(metrika.xml)
-
配置对应config.xml的中的标签进行复制扩展,新的标签名应和config.xml中
incl="替换的标签名"
一致。 -
每个clickhouse-server实例默认配置下对应只能被配置为某个数据分片(shard)的唯一副本(replica)。或添加内部复制端口配置。
默认本节点实例1: <http_port>8123</http_port> <tcp_port>9000</tcp_port> <interserver_http_port>9009</interserver_http_port> 添加本节点实例2 : <http_port>8124</http_port> <tcp_port>9001</tcp_port> <interserver_http_port>9010</interserver_http_port> 参考:https://www.cnblogs.com/freeweb/p/9352947.html
-
添加zookeeper配置需要重启集群服务,此时会在zk客户端查看生产/clickhouse目录
-
配置需添加在``中。
完整配置示例如下:
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<!-- 集群名称 -->
<hdc_3s1r_cluster>
<!-- 数据分片1 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data4</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data5</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
<!-- 数据分片3 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data6</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
</hdc_3s1r_cluster>
</clickhouse_remote_servers>
<!-- 本节点副本名称 (这里只配置单副本)-->
<macros>
<layer>01</layer>
<shard>03</shard>
<replica>hdc-data6</replica>
</macros>
<!-- 监听网络 -->
<