当前位置: 首页>后端>正文

ClickHouse——安装部署

前言

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.2AArch64PowerPC64LE架构的处理器上运行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,安装步骤进行安装

ClickHouse——安装部署,第1张
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. 示例

ClickHouse——安装部署,第2张

四、集群搭建

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. 简单测试

    1. . 首先各节点启动 : systemctl start clickhouse-server 查看运行状态 : systemctl status clickhouse-server


      ClickHouse——安装部署,第3张
    1. . 任意节点连接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();
ClickHouse——安装部署,第4张

五、配置和命令解释

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


https://www.xamrdz.com/backend/3f61944816.html

相关文章: