暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse安装部署及部分基础应用

IT那活儿 2024-05-16
1043

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!    

ClickHouse是一种列式数据库管理系统,专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统,最初由俄罗斯搜索引擎公司Yandex开发,用于满足大规模数据分析和报告的需求。 



安装clickhouse

PS:首先完成zookeeper集群部署(此处不做介绍)。
添加hosts文件:
对应集群的ip和主机名。
离线rpm方式,下载下述三个rpm安装包并上传到主机:
  • clickhouse-client-23.9.1.1854.x86_64.rpm
  • clickhouse-common-static-23.9.1.1854.x86_64.rpm
  • clickhouse-server-23.9.1.1854.x86_64.rpm
安装命令:
rpm -ivh *.rpm
安装后会自动添加clickhouse用户,无需手动创建。
安装完成后。会自动注册系统服务,可以直接通过systemctl控制服务启停。
配置文件目录:
/etc/clickhouse-server/*
修改config.xml配置:
<!--修改日志存放路径-->
<log>/data/clickhouse/logs/clickhouse-server.log</log>
<errorlog>/data/clickhouse/logs/clickhouse-server.err.log</errorlog>
<!--取消远程主机访问限制-->
<listen_host>::</listen_host>
<!--引用副配置文件-->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
<remote_servers incl="clickhouse_remote_servers" />
<zookeeper incl="zookeeper-servers" optional="true" />

编辑副配置文件metrika.xml:
<?xml version="1.0" encoding="utf-8"?>
<yandex>
  <clickhouse_remote_servers>
    <test_cluster>
      <shard>
        <replica>
          <internal_replication>true</internal_replication>
          <host>***.***.***.193</host>
          <port>9000</port>
        </replica>
        <replica>
          <internal_replication>true</internal_replication>
          <host>***.***.***.194</host>
          <port>9000</port>
        </replica>
      </shard>
      <shard>
        <replica>
          <internal_replication>true</internal_replication>
          <host>***.***.***.195</host>
          <port>9000</port>
        </replica>
        <replica>
          <internal_replication>true</internal_replication>
          <host>***.***.***.196</host>
          <port>9000</port>
        </replica>
      </shard>
    </test_cluster>
  </clickhouse_remote_servers>
  <zookeeper-servers>
    <node>
      <host>***.***.***.193</host>
      <port>2181</port>
    </node>
    <node>
      <host>***.***.***.194</host>
      <port>2181</port>
    </node>
    <node>
      <host>***.***.***.195</host>
      <port>2181</port>
    </node>
  </zookeeper-servers>
<!--相同分片的节点的shard一致,所有节点的replica都不一致,一般采用主机名-->
  <macros>
    <cluster>test_cluster</cluster>
    <shard>02</shard>
    <replica>clickhouse-04</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>

按照两分片两副本的模式进行配置,一个节点上只能同时存在一个分片或副本。
启动所有clickhouse服务:
使用root用户,启动后进程所属用户为:
clickhouse
systemctl start clickhouse-server


clickhouse应用

创建数据库:
CREATE DATABASE itil on cluster test_cluster
创建复制表,引擎为ReplicatedMergeTree,复制表中所有节点上的表都为本地表,约定表名带local尾缀。
CREATE TABLE itil.application_log_information_local on cluster test_cluster
(
    `LOG_ID` UUID DEFAULT generateUUIDv4(),
.......
    `END_TIME` DateTime,
    `COST_TIME` UInt64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/application_log_information','{replica}')
PARTITION BY toYYYYMMDD(START_TIME)
ORDER BY (API_LOG_TYPE,SYSTEM_ID,API_ID,START_TIME)
TTL toDateTime(START_TIME) + toIntervalDay(90)
SETTINGS index_granularity = 8192;

由于创建表命令无法分布式,所以要在所有节点上创建表需要加上on cluster test_cluster(config.xml中配置的集群名),或者将建表语句在每个节点上执行。
创建复制表后,在哪个节点上插入的数据只能在该节点和它对应的副本中可以查到,在另一个分片及其副本中都查不到该数据。
要想通过一个统一入口对本地表进行编辑和查询,则需要引入Distributed引擎,约定表名带all尾缀。
分布式引擎语法:
Distributed(cluster_name, database_name, table_name[, sharding_key])
  • * cluster_name:集群名称;
  • * database_name:数据库名称;
  • * table_name:表名称;
  • * sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。
针对上述的复制表创建分布式表用于查询和编辑:
CREATE TABLE itil.application_log_information_all on cluster test_cluster as itil.application_log_information_local
ENGINE = Distributed(test_cluster, itil, application_log_information_local, rand());

  • * rand():按照随机数划分。
创建分区表需要各个节点之间内部互信,配置互信的方式如下:
方式1:在metrika.xml文件中,各个节点都配置上账号密码。
<replica>
      <internal_replication>true</internal_replication>
      <host>***.***.***.***</host>
      <port>9000</port>
      <user>*****</user>
      <password>******</password>
    </replica>

方式2:在metrika.xml文件中,cluster配置下添加secret配置。
如果不声明分片键,那么分布式表只能包含一个分片,这意味着只能映射一张本地表,否则,在写入数据时将会报错。如果分布式表只包含一个分片,也就失去了分布式的意义,所以虽然分片键是选填参数,但是通常都会按照业务规则进行设置.
通过itil.application_log_information_all可以对多个节点进行数据插入和全表查询,插入的数据会根据rand()分布多各个分片汇总。

application_log_information_all并不是一张物理表,而是一张逻辑表,本地并不存在。


clickhouse角色及用户创建

clickhouse创建角色和用户都是在users.xml文件中完成。
添加itil_users角色:
<profiles>
    <!-- Default settings. -->
    <default>
        <max_memory_usage>429496729600</max_memory_usage>
        <load_balancing>random</load_balancing>
        <background_pool_size>64</background_pool_size>
        <background_fetches_pool_size>64</background_fetches_pool_size>
        <background_distributed_schedule_pool_size>64</background_distributed_schedule_pool_size>
        <background_schedule_pool_size>64</background_schedule_pool_size>
    </default>
    <itil_users>
        <distributed_product_mode>allow</distributed_product_mode>
        <max_memory_usage>429496729600</max_memory_usage>
        <load_balancing>random</load_balancing>
        <background_pool_size>64</background_pool_size>
        <background_fetches_pool_size>64</background_fetches_pool_size>
        <background_distributed_schedule_pool_size>64</background_distributed_schedule_pool_size>
        <background_schedule_pool_size>64</background_schedule_pool_size>
    </itil_users>
    <!-- Profile that allows only read queries. -->
    <readonly>
        <readonly>1</readonly>
    </readonly>
</profiles>

添加itil用户:

<users>
    <!-- If user name was not specified, 'default' user is used. -->
    <default>
        <password></password>
        <networks>
            <ip>::/0</ip>
        </networks>
        <profile>default</profile>
        <quota>default</quota>
    </default>
    <itil>
            <!--此处密码使用sha256加密,加密代码附在最后-->
          <password_sha256_hex>95752e432cfa6b486dc90e230c4889000216a5de70e982f026a30bda65bc26e8</password_sha256_hex>
        <networks>
            <ip>::/0</ip>
        </networks>
        <profile>itil_users</profile>
        <quota>default</quota>
        <!--限制itil用户只能访问itil数据库,对语法没有任何限制 -->
        <allow_databases>
            <database>itil</database>
        </allow_databases>
    </itil>
</users>


clickhouse权限分配

创建用户和分配权限也可以通过命令实现:

#创建数据库
CREATE DATABASE databasename ON CLUSTER clustername;
#创建用户
CREATE USER IF NOT EXISTS databaseuser ON CLUSTER clustername IDENTIFIED WITH plaintext_password BY 'password';
#分配权限
GRANT ALL PRIVILEGES ON databasename.* TO 'databaseuser'@'%'  ON CLUSTER clustername;
#分配远程权限
grant REMOTE ON *.* to databaseuser on cluster clustername;


密码加密

shell:
echo -n "your_password" | openssl dgst -sha256
python:

from hashlib import sha256
 
def generate_sha256_hashCode(plainText):
    plainTextBytes = plainText.encode('utf-8') #字符串在哈希之前,需要编码
    encryptor = sha256()      
    encryptor.update(plainTextBytes)  
    hashCode = encryptor.hexdigest()
    print(hashCode)
 
if __name__ == "__main__":
    generate_sha256_hashCode('your_password')


clickhouse使用注意

6.1 每次insert都会产生新的part,通过clickhouse配置自动merge或者手动optimize table进行parts合并
此特性要求clickhouse不要小批量高频次的写入,要求每秒最多进行一次插入操作,每批数据量不低于5000条。
6.2 merge parts会按照partition的配置进行,不同分区的数据不会写入到同一个parts,parts是物理存在的,partition是parts的逻辑表现
最佳情况是一个partition只包含一个part。
6.3 目录说明
  • 配置文件路径:/etc/clickhouse-server/config.xml
  • 日志文件路径:/var/log/clickhouse-server/
  • 建表信息路径:/var/lib/clickhouse/
  • metadata分区数据路径:/var/lib/clickhouse/data

END


本文作者:胡京康(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论