前言
ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(DBMS:Database Management System) , 主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 ClickHouse的全称是Click Stream,Data WareHouse,简称ClickHouse。
ClickHouse是一个完全的列式分布式数据库管理系统(DBMS),允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性,容错。它在大数据领域没有走 Hadoop 生态,而是采用 Local attached storage 作为存储,这样整个 IO 可能就没有 Hadoop 那一套的局限。它的系统在生产环境中可以应用到比较大的规模,因为它的线性扩展能力和可靠性保障能够原生支持 shard + replication 这种解决方案。它还提供了一些 SQL 直接接口,有比较丰富的原生 client。
优点
- 1、灵活的MPP架构,支持线性扩展,简单方便,高可靠性
- 2、多服务器分布式处理数据 ,完备的DBMS系统
- 3、底层数据列式存储,支持压缩,优化数据存储,优化索引数据 优化底层存储
- 4、容错跑分快:比Vertica快5倍,比Hive快279倍,比MySQL快800倍,其可处理的数据级别已达到10亿级别
- 5、功能多:支持数据统计分析各种场景,支持类SQL查询,异地复制部署
海量数据存储,分布式运算,快速闪电的性能,几乎实时的数据分析 ,友好的SQL语法,出色的函数支持
缺点
- 1、不支持事务,不支持真正的删除/更新 (批量)
- 2、不支持高并发,官方建议qps为100,可以通过修改配置文件增加连接数,但是在服务器足够好的情况下
- 3、不支持二级索引
- 4、不擅长多表join *** 大宽表
- 5、元数据管理需要人为干预 ***
- 6、尽量做1000条以上批量的写入,避免逐行insert或小批量的insert,update,delete操作
应用场景
- 1、绝大多数请求都是用于读访问的, 要求实时返回结果
- 2、数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作
- 3、数据只是添加到数据库,没有必要修改
- 4、读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
- 5、表很“宽”,即表中包含大量的列
- 6、查询频率相对较低(通常每台服务器每秒查询数百次或更少)
- 7、对于简单查询,允许大约50毫秒的延迟
- 8、列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
- 9、在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)
- 10、不需要事务
- 11、数据一致性要求较低 [原子性 持久性 一致性 隔离性]
- 12、每次查询中只会查询一个大表。除了一个大表,其余都是小表
- 13、查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小
一、系统要求
ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。 官方预构建的二进制文件通常针对x86_64进行编译,并利用SSE 4.2
指令集,因此,除非另有说明,支持它的CPU使用将成为额外的系统需求。下面是检查当前CPU是否支持SSE 4.2的命令:
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
要在不支持SSE 4.2
或AArch64
,PowerPC64LE
架构的处理器上运行ClickHouse,您应该通过适当的配置调整从源代码构建ClickHouse
clickhouse中文文档地址:
https://clickhouse.com/docs/zh/getting-started/tutorial/
采用tgz的方式安装
官网上安装部署有比较详细的说明,具体文档地址如下,支持deb、rpm、tgz、docker等安装部署方式
https://clickhouse.com/docs/zh/getting-started/install/
tgz包下载地址:
https://packages.clickhouse.com/tgz/
https://github.com/ClickHouse/ClickHouse/releases
下载的版本是22.3.2.2,以此版本为例,tgz包上传到同一个目录下,执行以下操作
tar -xzvf "clickhouse-common-static-22.3.2.2.tgz"
sudo "clickhouse-common-static-22.3.2.2/install/doinst.sh"
tar -xzvf "clickhouse-common-static-dbg-22.3.2.2.tgz"
sudo "clickhouse-common-static-dbg-22.3.2.2/install/doinst.sh"
tar -xzvf "clickhouse-client-22.3.2.2.tgz"
sudo "clickhouse-client-22.3.2.2/install/doinst.sh"
//这一步会让你填写默认的用户密码,可填可不填
tar -xzvf "clickhouse-server-22.3.2.2.tgz"
sudo "clickhouse-server-22.3.2.2/install/doinst.sh"
二、安装前准备
- 1.文件打开数调整
在 /etc/security/limits.conf和/etc/security/limits.d/20-nproc.conf 这两个文件的末尾加入以下内容:
sudo vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
重启服务器之后生效,用 ulimit -n 或者 ulimit -a 查看设置结果
- 2.取消selinux
修改 /etc/selinux/config 中的 SELINUX=disabled 后重启
vim /etc/selinux/config
SELINUX=disabled
- 3.关闭防火墙
systemctl status firewalld.service
systemctl stop firewalld.service
- 4.安装依赖
root用户执行:
yum install -y libtool
yum install -y *unixODBC*
- 5.验证是否支持sse 4.2指令集
需要验证当前服务器的CPU是否支持SSE 4.2指令集,因为向量化执行需要用到这项特性
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not
supported"
三、快速安装(单机)
本次安装操作系统为CentOS 7
1. 登陆官网 https://clickhouse.tech/#quick-start
2. 在Quick start上选择Centos or RedHat,安装步骤进行安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
sudo yum install -y clickhouse-server clickhouse-client
sudo /etc/init.d/clickhouse-server start # 启动服务端
clickhouse-client # or "clickhouse-client --password" if you set up a password. # 连接客户端
clickhouse-client #启动客户端默认在localhost:9000
clickhouse-client --host=localhost --port=9000 --user=xxx --password=xxx -m
具体在/etc/clickhouse-server/ 里的 config.xml文件 修改listen_host和相关port
-m:多行模式, 是指在数据表里写sql时可以将一条sql语句分行输入,否则只能将一条sql语句完整输入
3. 服务管理常用命令:
CentOS 7系统下,我们推荐使用如下命令管理clickhouse-server的启停及状态查看
systemctl start clickhouse-server
systemctl stop clickhouse-server
systemctl status clickhouse-server
4. ClickHouse的目录信息
/var/log/clickhouse-server/ # clickhouse-server的日志文件
/etc/clickhouse-server/ #config.xml包含的是clickhouse全局的配置,users.xml包含用户相关的配置
/var/lib/clickhouse/ #里面有许多文件,主要关注 data 和 metadata, data里面包含clickhouse的数据库 , metadata存放对应库表的元数据信息
5. 示例
四、集群搭建
1. 集群节点信息
- 192.168.200.91 cdh01
- 192.168.200.98 cdh02
- 192.168.200.99 cdh03
2. 搭建一个zookeeper集群(如果有则跳过)
- 下载 zookeeper-3.4.8.tar.gz 安装包,放置到上面三台服务器相同目录下(/usr/local)
- 进入到/usr/local目录下,解压tar包,tar -zxvf zookeeper-3.4.8.tar.gz
- 进入zookeeper的conf目录,拷贝zoo_sample.cfg为zoo.cfg,cp zoo_sample.cfg zoo.cfg 修改zoo.cfg文件:
tickTime=2000
dataDir=/opt/zookeeper
clientPort=2181
initLimit=10
syncLimit=2
server.1=cdh01:2888:3888
server.2=cdh02:2888:3888
server.3=cdh03:2888:3888
- 三台服务器分别创建目录:mkdir /opt/zookeeper
- 在/opt/zookeeper目录中创建一个名为myid的文件,三台服务器文件内容分别为1,2,3
- 进入zookeeper的bin目录,启动zookeeper服务,每个节点都需要启动:./zkServer.sh start
- 启动之后查看每个节点的状态 ./zkServer status , 其中有一个节点是leader,有两个节点是follower,证明zookeeper集群是部署成功的
- 测试zookeeper连接:./zkCli.sh -server cdh01:2181
3. ClickHouse集群部署
- 3.1 首先在三台服务器分别安装上clickhouse,安装参照如上单机方式。
下载的版本是22.3.2.2,以此版本为例,tgz包上传到同一个目录下,执行以下操作
tar -xzvf "clickhouse-common-static-22.3.2.2.tgz"
sudo "clickhouse-common-static-22.3.2.2/install/doinst.sh"
tar -xzvf "clickhouse-common-static-dbg-22.3.2.2.tgz"
sudo "clickhouse-common-static-dbg-22.3.2.2/install/doinst.sh"
tar -xzvf "clickhouse-client-22.3.2.2.tgz"
sudo "clickhouse-client-22.3.2.2/install/doinst.sh"
//这一步会让你填写默认的用户密码,可填可不填
tar -xzvf "clickhouse-server-22.3.2.2.tgz"
sudo "clickhouse-server-22.3.2.2/install/doinst.sh"
- 3.2 修改配置文件: vim /etc/clickhouse-server/config.xml
<!-- 修改端口:(默认9000端口跟hdfs冲突) -->
<tcp_port>9002</tcp_port>
<!-- 修改时区 -->
<timezone>Asia/Shanghai</timezone>
<!-- 配置监听网络 -->
<!--ip地址,配置成::可以被任意ipv4和ipv6的客户端连接, 需要注意的是,如果机器本身不支持ipv6,
这样配置是无法连接clickhouse的,这时候要改成0.0.0.0 -->
<listen_host>0.0.0.0</listen_host>
<!-- 添加集群相关配置 -->
<remote_servers>
<!-- 3个分片1个副本 -->
<test_cluster_three_shards_internal_replication>
<shard>
<!-- 是否只将数据写入其中一个副本,默认为false,表示写入所有副本,
在复制表的情况下可能会导致重复和不一致,所以这里要改为true,
clickhouse分布式表只管写入一个副本,其余同步表的事情交给复制表和zookeeper来进行 -->
<internal_replication>true</internal_replication>
<replica>
<host>cdh01</host>
<port>9002</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>cdh02</host>
<port>9002</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>cdh03</host>
<port>9002</port>
</replica>
</shard>
</test_cluster_three_shards_internal_replication>
</remote_servers>
<!-- zookeeper配置 -->
<zookeeper>
<node>
<host>cdh01</host>
<port>2181</port>
</node>
<node>
<host>cdh02</host>
<port>2181</port>
</node>
<node>
<host>cdh03</host>
<port>2181</port>
</node>
</zookeeper>
<!-- 复制标识的配置,也称为宏配置,这里唯一标识一个副本名称,每个实例配置都是唯一的 -->
<macros>
<!-- 当前节点在在集群中的分片编号,需要在集群中唯一,3个节点分别为01,02,03 -->
<shard>01</shard>
<!-- 副本的唯一标识,需要在单个分片的多个副本中唯一,3个节点分别为cdh01,cdh02,cdh03 -->
<replica>cdh01</replica>
</macros>
除了直接修改/etc/clickhouse-server/config.xml文件外,我们也可以在/etc/clickhouse-server/config.d目录下创建一个名为metrika.xml的配置文件来配置remote_servers,zookeeper, macros。例如:
<?xml version="1.0"?>
<yandex>
<!—ZooKeeper配置,名称自定义,和config.xml 对应,一般就用这个名字就好 -->
<zookeeper-servers>
<node index="1">
<!—节点配置,可以配置多个地址-->
<host>127.0.0.1</host>
<port>2181</port>
</node>
</zookeeper-servers>
<clickhouse_remote_servers> <!--远程服务名称 config.xml使用-->
......
</clickhouse_remote_servers>
<macros>
......
</macros>
</yandex>
接着,在全局配置config.xml中使用<include_from>标签导入刚才定义的配置。
<zookeeper incl="zookeeper-servers" optional="true" />
<remote_servers incl="clickhouse_remote_servers" optional="true" />
<macros incl="macros" optional="true"/>
<include_from>/etc/clickhouse server/config.d/metrika.xml</include_from>
这里就再不继续扩展。
4. 简单测试
-
. 首先各节点启动 : systemctl start clickhouse-server 查看运行状态 : systemctl status clickhouse-server
-
- . 任意节点连接clickhouse : clickhouse-client --host=cdh02 --port=9002 -m
查询集群 :
- . 任意节点连接clickhouse : clickhouse-client --host=cdh02 --port=9002 -m
select cluster,shard_num,replica_num,host_name,port,user,is_local from system.clusters;
SELECT version();
五、配置和命令解释
1、配置文件中配置项的解释如下:
remote_servers:
clickhouse集群配置标签,固定写法。注意:这里与之前版本不同,之前要求必须以clickhouse开头,新版本不再需要。clickhouse_cluster_3shards_1replicas:
配置clickhouse的集群名称,可自由定义名称,注意集群名称中不能包含点号。这里代表集群中有3个分片,每个分片有1个副本。
分片是指包含部分数据的服务器,要读取所有的数据,必须访问所有的分片。
副本是指存储分片备份数据的服务器,要读取所有的数据,访问任意副本上的数据即可。shard:
分片,一个clickhouse集群可以分多个分片,每个分片可以存储数据,这里 分片可以理解为clickhouse机器中的每个节点,1个分片只能对应1服务节点 。这里可以配置一个或者任意多个分片,在每个分片中可以配置一个或任意多个副本,不同分片可配置不同数量的副本。如果只是配置一个分片,这种情况下查询操作应该称为远程查询,而不是分布式查询。replica:
每个分片的副本,默认每个分片配置了一个副本。也可以配置多个,副本的数量上限是由clickhouse节点的数量决定的。如果配置了副本,读取操作可以从每个分片里选择一个可用的副本。如果副本不可用,会依次选择下个副本进行连接。该机制利于系统的可用性。internal_replication:
默认为false,写数据操作会将数据写入所有的副本,设置为true,写操作只会选择一个正常的副本写入数据,数据的同步在后台自动进行。zookeeper:
配置的zookeeper集群,注意:与之前版本不同,之前版本是“zookeeper-servers”。macros:
区分每台clickhouse节点的宏配置,macros中标签代表当前节点的分片号,标签代表当前节点的副本号,这两个名称可以随意取,后期在创建副本表时可以动态读取这两个宏变量。注意:每台clickhouse节点需要配置不同名称。networks:
这里配置ip为“::/0”代表任意IP可以访问,包含IPv4和IPv6。
注意:允许外网访问还需配置/etc/clickhouse-server/config.xml。
listen_host 表示能监听的主机,:: 表示任意主机都可以访问
<listen_host>::</listen_host>
-
clickhouse_compression:
MergeTree引擎表的数据压缩设置,min_part_size:代表数据部分最小大小。min_part_size_ratio:数据部分大小与表大小的比率。method:数据压缩格式。
2、在每台节点上启动/查看/重启/停止clickhouse服务
#每台节点启动Clickchouse服务
service clickhouse-server start
#每台节点查看clickhouse服务状态
service clickhouse-server status
#每台节点重启clickhouse服务
service clickhouse-server restart
#每台节点关闭Clikchouse服务
service clickhouse-server stop
3、客户端命令行参数
我们可以通过clickhouse client来连接启动的clickhouse服务,连接服务时,我们可以指定以下参数,这里指定的参数会覆盖默认值和配置文件中的配置。
参数 | 解释 |
---|---|
--host, -h | 服务端的host名称, 默认是localhost。您可以选择使用host名称或者IPv4或IPv6地址。 |
--port | 连接的端口,默认值:9000。注意HTTP接口以及TCP原生接口使用的是不同端口。 |
--user, -u | 用户名。默认值:default。 |
--password | 密码。默认值:空字符串。 |
--query,-q | 使用非交互模式查询。 |
--database, -d | 默认当前操作的数据库. 默认值:服务端默认的配置(默认是default)。 |
--multiline, -m | 如果指定,允许多行语句查询(Enter仅代表换行,不代表查询语句完结)。 |
--time, -t | 如果指定,非交互模式下会打印查询执行的时间到stderr中。 |
--stacktrace | 如果指定,如果出现异常,会打印堆栈跟踪信息。 |
--config-file | 配置文件的名称。 |
--multiquery,-n | 使用非交互模式查询数据时,可以分号隔开多个sql语句。 |
-
--host,-h:
使用-h指定ip或者host名称时,需要在/etc/clickhouse-server/config.xml配置文件中114行配置:<listen_host>::</listen_host> ,代表可以任意ip可访问。配置完成后需要重启当期clickhouse节点生效。
clickhouse-client -h node1
ClickHouse client version 20.8.3.18.
Connecting to node1:9000 as user default.
Connected to ClickHouse server version 20.8.3 revision 54438.
- --query,-q:
clickhouse-client -q "show databases"
_temporary_and_external_tables
default
system
- --database, -d:
clickhouse-client -d "system" -q "show tables"
aggregate_function_combinators
asynchronous_metric_log
asynchronous_metrics
build_options
... ....
- --multiline, -m:
clickhouse-client -m
node1 :) select
:-] 1+1
:-] ;
SELECT 1 + 1
┌─plus(1, 1)─┐
│ 2 │
└────────┘
1 rows in set. Elapsed: 0.004 sec.
- --time, -t:
clickhouse-client -t -q "show databases"
_temporary_and_external_tables
default
system
0.004
- --stacktrace:
clickhouse-client --stacktrace
ClickHouse client version 20.8.3.18.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.8.3 revision 54438.
node1 :) use aaa;
USE aaa
Received exception from server (version 20.8.3):
Code: 81. DB::Exception: Received from localhost:9000. DB::Exception: Database aaa doesn't exist. Stack trace:
0.Poco::Exception::Exception(std::__1 ... ....
... ....
- --multiquery,-n:
[root@node1 ~]# clickhouse-client -n -q "show databases;use default;"
_temporary_and_external_tables
default
system
4、数据类型
ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。我们可以在system.data_type_families表中检查数据类型名称以及是否区分大小写。这个表中存储了ClickHouse支持的所有数据类型。
select * from system.data_type_families limit 10;
SELECT *
FROM system.data_type_families
LIMIT 10
┌─name────────────┬─case_insensitive─┬─alias_to─┐
│ Polygon │ 0 │ │
│ Ring │ 0 │ │
│ MultiPolygon │ 0 │ │
│ IPv6 │ 0 │ │
│ IntervalSecond │ 0 │ │
│ IPv4 │ 0 │ │
│ UInt32 │ 0 │ │
│ IntervalYear │ 0 │ │
│ IntervalQuarter │ 0 │ │
│ IntervalMonth │ 0 │ │
└─────────────────┴──────────────────┴──────────┘
10 rows in set. Elapsed: 0.004 sec.
下面介绍下常用的数据类型,ClickHouse与Mysql、Hive中常用数据类型的对比图如下:
MySQL | Hive | ClickHouse(区分大小写) |
---|---|---|
byte | TINYINT | Int8 |
short | SMALLINT | Int16 |
int | INT | Int32 |
long | BIGINT | Int64 |
varchar | STRING | String |
timestamp | TIMESTAMP | DateTime |
float | FLOAT | Float32 |
double | DOUBLE | Float64 |
boolean |
参考:
https://clickhouse.com/docs/zh/getting-started/install/#from-sources
https://blog.csdn.net/mnasd/article/details/127648739
https://www.cnblogs.com/leolzi/p/16697369.html
https://www.cnblogs.com/lebaishi/p/15702020.html
https://www.cnblogs.com/hsyw/p/16839015.html
https://blog.csdn.net/qq_37056683/article/details/120993905
https://blog.csdn.net/wuxintdrh/article/details/119931658
https://blog.csdn.net/weixin_44087159/article/details/124477313