ClickHouse(一)简介与架构

1.OLAP详解

1.1.OLAP的场景特征

1、读多于写

不同于事务处理(OLTP)的场景,比如电商场景中加购物车、下单、支付等需要在原地进行大量insert、update、delete操作,数据分析(OLAP)场景通常是将数据批量导入后,进行任意维度的灵活探索、BI工具洞察、报表制作等。

数据一次性写入后,分析师需要尝试从各个角度对数据做挖掘、分析,直到发现其中的商业价值、业务变化趋势等信息。这是一个需要反复试错、不断调整、持续优化的过程,其中数据的读取次数远多于写入次数。这就要求底层数据库为这个特点做专门设计,而不是盲目采用传统数据库的技术架构。

2、大宽表,读大量行但是少量列,结果集较小

在OLAP场景中,通常存在一张或是几张多列的大宽表,列数高达数百甚至数千列。对数据分析处理时,选择其中的少数几列作为维度列、其他少数几列作为指标列,然后对全表或某一个较大范围内的数据做聚合计算。这个过程会扫描大量的行数据,但是只用到了其中的少数列。而聚合计算的结果集相比于动辄数十亿的原始数据,也明显小得多。

3、数据批量写入,且数据不更新或少更新

OLTP类业务对于延时(Latency)要求更高,要避免让客户等待造成业务损失;而OLAP类业务,由于数据量非常大,通常更加关注写入吞吐(Throughput),要求海量数据能够尽快导入完成。一旦导入完成,历史数据往往作为存档,不会再做更新、删除操

4、无需事务,数据一致性要求低

OLAP类业务对于事务需求较少,通常是导入历史日志数据,或搭配一款事务型数据库并实时从事务型数据库中进行数据同步。多数OLAP系统都支持最终一致性。

5、灵活多变,不适合预先建模

分析场景下,随着业务变化要及时调整分析维度、挖掘方法,以尽快发现数据价值、更新业务指标。而数据仓库中通常存储着海量的历史数据,调整代价十分高昂。预先建模技术虽然可以在特定场景中加速计算,但是无法满足业务灵活多变的发展需求,维护成本过高。

1.1.1.技术选型

  • 少量数据:单机程序
  • 中级数据:ES、MySQL的分库分表
  • 海量数据:druid,kylin,doris,clickhouse
  • 海量数据做查询分析高效:列式数据库,写模式(保证同一列的数据类型是一样的:方便压缩)

1.2.ClickHouse官网解释

URL地址:https://clickhouse.tech/docs/zh/

1、绝大多数请求都是读请求
2、数据以相当大的批次(> 1000行)更新,而不是单行更新;或者它根本没有更新。
3、数据已添加到数据库,但不会进行修改。
4、对于读取,每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
5、表格“宽”,意味着它们包含大量列。
6、查询相对较少(通常每台服务器数百个查询或每秒更少)。
7、对于简单查询,允许延迟大约50毫秒。
8、列中的数据相对较小:一般来说,都是数字和短字符串(例如,每个URL 60个字节)
9、处理单个查询时需要高吞吐量(每个服务器每秒最多数十亿行)。
10、Transactions不是必需的。
11、对数据一致性要求低。
12、每个查询有一个大表。所有其他表都很小,除了这个大表。
13、查询结果明显小于源数据。换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

2.ClickHouse

2.1.概述

源代码:C++

典型特点总结:ROLAP、在线实时查询、完整的DBMS、列式存储、不需要任何数据预处理、支持批量更新、具有非常完善的SQL支持和函数、支持高可用、不依赖Hadoop复杂生态、开箱即用

简单的说,ClickHouse作为分析型数据库,有三大特点:一是跑分快, 二是功能多 ,三是文艺范

1.跑分快: ClickHouse跑分是Vertica的5倍快:

clickHouse性能超过了市面上大部分的列式存储数据库,相比传统的数据ClickHouse要快100-1000X,ClickHouse还是有非常大的优势:
100Million 数据集:ClickHouse比Vertica约快5倍,比Hive快279倍,比MySQL快801倍
1Billion 数据集:ClickHouse比Vertica约快5倍,MySQL和Hive已经无法完成任务了

2.功能多:ClickHouse支持数据统计分析各种场景

支持类SQL查询,
支持繁多库函数(例如IP转化,URL分析等,预估计算/HyperLoglog等)
支持数组(Array)和嵌套数据结构(Nested Data Structure)
支持数据库异地复制部署

3.文艺范:目前ClickHouse的限制很多,生来就是为小资服务的

相对较缺乏的文档,社区刚开始活跃,只有开源的C++源码
不理睬Hadoop生态,走自己的路

函数数量对比:Clickhouse:779个、hive-1.x:216个、hive-2.x:271个

2.2使用场景

适合:用于结构良好清晰且不可变的事件或日志流分析。

不适合:事务性工作(OLTP),高请求率的键值访问,低延迟的修改或删除已存在数据,Blob或文档存储,超标准化数据。

2.3ClickHouse优缺点

2.3.1优点

1、真正的面向列的 DBMS

ClickHouse 是一个 DBMS,而不是一个单一的数据库。它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置和重新启动服务器。

2、数据压缩

一些面向列的 DBMS(InfiniDB CE 和 MonetDB)不使用数据压缩。但是,数据压缩确实提高了性能。

3、磁盘存储的数据

许多面向列的 DBMS(SAP HANA 和 GooglePowerDrill)只能在内存中工作。但即使在数千台服务器上,内存也太小,无法在 Yandex.Metrica 中存储所有浏览量和会话。

4、多核并行处理

多核多节点并行化大型查询。

5、在多个服务器上分布式处理

在 ClickHouse 中,数据可以驻留在不同的分片上。每个分片都可以用于容错的一组副本,查询会在所有分片上并行处理。

6、SQL支持

ClickHouse SQL 跟真正的 SQL 有不一样的函数名称。不过语法基本跟 SQL 语法兼容,支持 JOIN、FROM、IN 和 JOIN 子句以及标量子查询支持子查询。

7、向量化引擎

数据不仅按列存储,而且由矢量 - 列的部分进行处理,这使开发者能够实现高 CPU 性能。

8、实时数据更新

ClickHouse 支持主键表。为了快速执行对主键范围的查询,数据使用合并树 (MergeTree) 进行递增排序。由于这个原因,数据可以不断地添加到表中。

9、支持近似计算

该库支持为有限数量的随机密钥(而不是所有密钥)运行聚合。在数据中密钥分发的特定条件下,这提供了相对准确的结果,同时使用较少的资源。

10、数据复制和对数据完整性的支持

ClickHouse 使用异步多主复制。写入任何可用的副本后,数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据。数据在失败后自动恢复。

2.3.2缺点

  1. 没有完整的事务支持,不支持Transaction:想快就别想Transaction
  2. 缺少完整的Update/Delete操作,缺少高频率、低延迟的修改或删除已存在数据的能力,仅能用于批量删除或修改数据。
  3. 聚合结果必须小于一台机器的内存大小:不是大问题
  4. 支持有限操作系统,正在慢慢完善
  5. 开源社区刚刚启动,主要是俄语为主,中文社区:http://www.clickhouse.com.cn
  6. 不适合key-value存储,不支持 Blob 等文档型数据库

3.安装与启动

3.1安装

3.1.1在线安装

yum install yum-utils -y

rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG

yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo

yum install clickhouse-server clickhouse-client -y

3.1.2离线安装

下载地址:https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/            https://packagecloud.io/Altinity/clickhouse

安装顺序:

rpm -ivh clickhouse-common-static-20.5.4.40-1.el7.x86_64.rpm

rpm -ivh clickhouse-server-common-20.5.4.40-1.el7.x86_64.rpm

rpm -ivh clickhouse-server-20.5.4.40-1.el7.x86_64.rpm

rpm -ivh clickhouse-client-20.5.4.40-1.el7.x86_64.rpm

注意:就算配置成集群了,每个服务器依然还是单独运行的。

安装的成功的核心目录

(1)/etc/clickhouse-server:服务端的配置文件目录,包括全局配置config.xml和用户配置users.xml等。

(2)/var/lib/clickhouse:默认数据存储目录,通常会修改默认路径配置,将数据保存到大容量磁盘挂载路径

(3)/var/log/clickhouse-server:默认日志保存目录,通常会修改路径配置将日志保存到大容量磁盘挂载的路径

可执行文件

clickhouse:主程序的可执行文件。
clickhouse-client:一个指向ClickHouse可执行文件的软链接,供客户端连接使用。
clickhouse-server:一个指向ClickHouse可执行文件的软链接,供服务端启动使用。
clickhouse-compressor:内置提供的压缩工具,可用于数据的正压反解。

3.2启动

3.2.1单机启动

前台启动:clickhouse-server --config-file=/etc/clickhouse-server/config.xml

后台启动:nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml  1>~/logs/clickhouse_std.log 2>~/logs/clickhouse_err.log &

进程查看:ps -aux | grep clickhouse 、netstat -nltp | grep clickhouse

如果报错:

解决方案:修改安装目录的权限!,默认使用clickhouse用户!命令为:

cd /var/lib/、chown -R root:root clickhouse

客户端启动:clickhouse-client --port 端口号。 在/etc/clickhouse-server/config.xml中的<tcp_port>9977</tcp_port>

3.2.2集群启动

        1.添加配置文件/etc/metrika.xml。分发到CK所在的服务器。如下所示:

<yandex>
	<clickhouse_remote_servers>
		<!-- 3分片1副本 -->
		<perftest_3shards_1replicas>
			<shard>
				<!-- 数据自动同步 -->
				<internal_replication>true</internal_replication>
				<replica>
					<host>hadoop1</host>
					<port>9977</port>
				</replica>
			</shard>
			<shard>
				<replica>
				<internal_replication>true</internal_replication>
					<host>hadoop2</host>
					<port>9977</port>
				</replica>
			</shard>
			<shard>
				<internal_replication>true</internal_replication>
				<replica>
					<host>hadoop3</host>
					<port>9977</port>
				</replica>
			</shard>
		</perftest_3shards_1replicas>
	</clickhouse_remote_servers>

	<!--zookeeper相关配置-->
	<zookeeper-servers>
		<node index="1">
			<host>hadoop1</host>
			<port>2181</port>
		</node>
		<node index="2">
			<host>hadoop2</host>
			<port>2181</port>
		</node>
		<node index="3">
			<host>hadoop3</host>
			<port>2181</port>
		</node>
	</zookeeper-servers>

	<!-- 配置文件中macros若省略,则建复制表时每个分片需指定zookeeper路径及副本名称,同一分片上路径相同,副本名称不同;若不省略需每个分片不同配置	-->
	<macros>
		<replica>hadoop2</replica>
	</macros>

	<networks>
		<ip>::/0</ip>
	</networks>

	<!-- 配置压缩 -->
	<clickhouse_compression>
		<case>
			<min_part_size>10000000000</min_part_size>
			<min_part_size_ratio>0.01</min_part_size_ratio>
			<method>lz4</method>
		</case>
	</clickhouse_compression>

</yandex>
	

        注意其中标签<macros>,不同服务器上的配置不一样。 

<macros>
        <shard>01</shard>  <!-- 不用机器放的分片数不一样 -->
		<replica>rep_1_1</replica> <!-- 不同机器放的副本数不一样,这里表示分片一的第一个副本 --> 
</macros>

        手动创建可以直接被使用。这个是因为/etc/clickhouse-server/config.xml该配置文件有默认指定/etc/metrika.xml。如下,如果有需要修改,可添加:<include_from>...</include_from>来手动指定路径。

        启动服务后,发现指定的集群无效,需要在/etc/clickhouse-server/config.xml文件中指定如下:

<remote_servers incl="clickhouse_remote_servers" />
<zookeeper incl="zookeeper-servers" optional="true" />
<macros incl="macros" optional="true" />
<compression incl="clickhouse_compression" optional="true" />

        启动zookeeper与CK服务端,可参照上面的检查启动是否OK:

        zkServer.sh start

        nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml  1>~/logs/clickhouse_std.log 2>~/logs/clickhouse_err.log &

        2.客户端连接:

        clickhouse-client --host hadoop1 --port 9977 -m   --user=bigdata  --password=bigdata

        -m如果设定,允许多行查询。

        注意集群的使用:

        如果创建了一张表,这张表的引擎是分布式的引擎,那么这个表所存储在那个集群里面的机器,就是一个集群了。每个clickhouse中的部分表是单机的,部分表是分布式的。

        普通建表语句都是单机的。创建分布式才会在所有节点都可以显示。

        create database if not exists mydb on cluster perftest_3shards_1replicas

3.设置连接用户名密码:vim /etc/clickhouse-server/users.xml 复制到所有节点

<bigdata>
 <password>bigdata</password>
 <networks incl="networks" replace="replace">
  <ip>::/0</ip>
 </networks>
 <profile>default</profile>
 <quota>default</quota>
</bigdata>

4.卸载 clickhouse

  1. 查询是否安装 clickhouse:rpm -qa | grep clickhouse
  2. 卸载 clickhouse:rpm -e clickhouse-client-20.5.4.40-2.noarch --nodeps、rpm -e clickhouse-server-20.5.4.40-2.noarch --nodeps、rpm -e clickhouse-common-static-20.5.4.40-2.x86_64 --nodeps
  3. 删除数据目录:rm -rf /var/lib/clickhouse
  4. 删除集群配置文件:rm -rf /etc/metrika.xml
  5. 删除配置文件:rm -rf /etc/clickhouse-*
  6. 删除日志文件:rm -rf /var/log/clickhouse-server
  7. 删除 zookeeper 上 clickhouse 的数据:rmr /clickhouse
  8. 也可以进行全局寻找:然后执行删除操作:find / -name 'clickhouse'

5.ClickHouse一些信息总结

  • 配置文件路径:/etc/clickhouse-server/config.xml
  • 日志文件路径:/var/log/clickhouse-server/
  • 建表信息路径:/var/lib/clickhouse/metadata/
  • 表数据路径:/var/lib/clickhouse/data/


版权声明:本文为Yuan_CSDF原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。