ClickHouse——安装部署

作者: 小波同学 | 来源:发表于2023-02-24 19:40 被阅读0次

    前言

    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,安装步骤进行安装

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

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


      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();
    

    五、配置和命令解释

    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

    相关文章

      网友评论

        本文标题:ClickHouse——安装部署

        本文链接:https://www.haomeiwen.com/subject/nimxldtx.html