ClickHouse安装及结构说明

一、ClickHouse安装方式

  • 源码编译安装
  • Docker安装
  • RPM包安装

为了方便使用,一般采用RPM包方式安装,其他两种方式这里不做说明。

二、下载安装包

官方没有提供rpm包,但是Altinity第三方公司提供了。

地址:https://packagecloud.io/altinity/clickhouse

三、配置文件

安装好rmp包后,默认配置文件在/etc/clickhouse-server/目录下,主要涉及以下3种配置文件,也可以自定义配置文件位置,如果修改了目录记得连带修改启动脚本。

  1. 默认启动脚本,注意,这个名字虽然叫server,其实是个shell脚本

vi /etc/init.d/clickhouse-server

12  CLICKHOUSE_USER=clickhouse
13  CLICKHOUSE_GROUP=${CLICKHOUSE_USER}
14  SHELL=/bin/bash
15  PROGRAM=clickhouse-server
16  GENERIC_PROGRAM=clickhouse
17  EXTRACT_FROM_CONFIG=${GENERIC_PROGRAM}-extract-from-config
18  SYSCONFDIR=/data/clickhouse
19  CLICKHOUSE_LOGDIR=/data/clickhouse/logs
20  CLICKHOUSE_LOGDIR_USER=root
21  CLICKHOUSE_DATADIR_OLD=/data/clickhouse
22  LOCALSTATEDIR=/data/clickhouse/lock
23  BINDIR=/usr/bin
24  CLICKHOUSE_CRONFILE=/etc/cron.d/clickhouse-server
25  CLICKHOUSE_CONFIG=$SYSCONFDIR/config.xml
26  LOCKFILE=$LOCALSTATEDIR/$PROGRAM
27  RETVAL=0
29  CLICKHOUSE_PIDDIR=/var/run/$PROGRAM
30  CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM

config.xml  全局信息配置文件

<?xml version=""1.0""?>
   <yandex>
   <!--日志-->
   <logger>
   <level>error</level>
   <log>/data/clickhouse/logs/clickhouse.log</log>
   <errorlog>/data/clickhouse/logs/error.log</errorlog>
   <size>500M</size>
   <count>5</count>
   </logger>

   <!--全日志-->
   <query_log>
   <database>system</database>
   <table>query_log</table>
   <partition_by>toMonday(event_date)</partition_by>
   <flush_interval_milliseconds>7500</flush_interval_milliseconds>
   </query_log>
   <!--本地节点信息-->
   <http_port>8123</http_port>
   <tcp_port>9000</tcp_port><!—客户端连接端口-->
   <interserver_http_port>9009</interserver_http_port>
   <interserver_http_host>本机IP</interserver_http_host>  <!--本机域名或IP-->
   <!--本地配置-->
   <listen_host>0.0.0.0</listen_host>
   <max_connections>4096</max_connections>
   <receive_timeout>800</receive_timeout>
   <send_timeout>800</send_timeout>
   <keep_alive_timeout>300</keep_alive_timeout>
   <max_concurrent_queries>1000</max_concurrent_queries>
    <uncompressed_cache_size>8589934592</uncompressed_cache_size>
   <mark_cache_size>5368709120</mark_cache_size>
   <path>/data/clickhouse/</path>
   <tmp_path>/data/clickhouse/tmp/</tmp_path>
   <users_config>users.xml</users_config>
   <default_profile>default</default_profile>
   <log_queries>1</log_queries>
   <default_database>default</default_database>
   <!--集群相关配置-->
   <remote_servers incl=""clickhouse_remote_servers""  />
   <zookeeper incl=""zookeeper-servers""  optional=""true""   />
   <macros incl=""macros""  optional=""true"" />
   <builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval>
   <max_session_timeout>3600</max_session_timeout>
   <default_session_timeout>300</default_session_timeout>
   <max_table_size_to_drop>0</max_table_size_to_drop>
   <merge_tree>
   <parts_to_delay_insert>300</parts_to_delay_insert>
   <parts_to_throw_insert>600</parts_to_throw_insert>
   <max_delay_to_insert>2</max_delay_to_insert>
   </merge_tree>
   <max_table_size_to_drop>0</max_table_size_to_drop>
    <max_partition_size_to_drop>0</max_partition_size_to_drop>
   <distributed_ddl>
   <!-- Path in ZooKeeper to queue with DDL queries -->
   <path>/clickhouse/task_queue/ddl</path>
   </distributed_ddl>
    <include_from>/etc/clickhouse-server/metrika.xml</include_from>
   </yandex>

users.xml  用户信息配置文件

<?xml version="1.0"?>
   <yandex>
   <profiles>
   <default>
   <max_memory_usage>10000000000</max_memory_usage>
   <use_uncompressed_cache>0</use_uncompressed_cache>
   <load_balancing>random</load_balancing>
   </default>
   <readonly>
   <max_memory_usage>10000000000</max_memory_usage>
   <use_uncompressed_cache>0</use_uncompressed_cache>
   <load_balancing>random</load_balancing>
   <readonly>1</readonly>
   </readonly>
   </profiles>
   <quotas>
   <!-- Name of quota. -->
   <default>
   <interval>
   <queries>0</queries>
   <errors>0</errors>
   <result_rows>0</result_rows>
   <read_rows>0</read_rows>
   <execution_time>0</execution_time>
   </interval>
   </default>
   </quotas>
   <users>
   <default><!—用户名-->
   <!-- PASSWORD=$(base64 < /dev/urandom | head -c8); echo  "$PASSWORD"; echo -n  "$PASSWORD" | sha256sum | tr -d '-'   -->
   <!-- password UHXQQmhb -->
 <password_sha256_hex>65b84b497ef843f7c9629251a64e307caecbf7327975af4d18f83261239e1460</password_sha256_hex>
   <networks>
   <ip>::/0</ip>
   </networks>
   <profile>default</profile>
   <quota>default</quota>
   </default>
   <ck><!—用户名-->
 <password_sha256_hex>65b84b497ef843f7c9629251a64e307caecbf7327975af4d18f83261239e1460</password_sha256_hex>
   <networks>
   <ip>::/0</ip>
   </networks>
   <profile>readonly</profile>
   <quota>default</quota>
   </ck>
   </users>
   </yandex>

metrika.xml  集群信息配置文件

<yandex>

<!--ck集群节点-->

<clickhouse_remote_servers>

<zabbixdata_ck_cluster>

<!--分片01-->

<shard>

<internal_replication>true</internal_replication>

<replica>

<host>192.168.1.1</host>

<port>9000</port>

<user>default</user>

<password>password</password>

</replica>

<replica>

<host>192.168.1.2</host>

<port>9000</port>

<user>default</user>

<password>Password</password>

</replica>

</shard>

<!--分片02-->

<shard>

<internal_replication>true</internal_replication>

<replica>

<host>192.168.1.3</host>

<port>9000</port>

<user>default</user>

<password>Password</password>

</replica>

<replica>

<host>192.168.1.4</host>

<port>9000</port>

<user>default</user>

<password>Password</password>

</replica>

</shard>

</zabbixdata_ck_cluster>

</clickhouse_remote_servers>

<!--zookeeper相关配置-->

<zookeeper-servers>

<node index="1">

<host>192.168.1.5</host>

<port>2181</port>

</node>

<node index="2">

<host>192.168.1.6</host>

<port>2181</port>

</node>

<node index="3">

<host>192.168.1.7</host>

<port>2181</port>

</node>

</zookeeper-servers>

<macros>

<layer>01</layer>

<shard>01</shard>

<replica>192.168.1.1</replica> <!--当前节点IP-->

</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> <!--压缩算法lz4压缩比zstd快, 更占磁盘-->

</case>

</clickhouse_compression>

</yandex>

四、ClickHouse常用架构

  1. 单实例

无需过多解释,就是单机部署,安装好rpm包后,简单修改配置文件即可启动;

单实例不建议线上使用,只做功能测试;

MergeTree,引擎适用于单机实例,查询性能非常高。

  1. 分布式+高可用集群

ClickHouse引擎有十几个,不同引擎实现不同功能,实现分布式高可用主要通过以下两种引擎:

ClickHouse分布式通过配置文件来实现,同一集群配置多个分片,每个节点,都配置同样的配置文件;而高可用需要借助zookeeper来实现,ReplicatedMergeTree里共享同一个ZK路径的表,会相互同步数据。

ReplicatedMergeTree,复制引擎,基于MergeTree,实现数据复制,即高可用;

Distributed,分布式引擎,本身不存储数据,将数据分发汇总。

五、分布式高可用集群架构

以下是2个分片、2个副本集的架构,zookeeper机器可以跟ClickHouse共用,但是如果压力较大,IO消耗较多,可能会延迟,建议分开。

role

shard1

shard2

replica

192.168.1.1

192.168.1.3

replica

192.168.1.2

192.168.1.4

zookeeper集群:

index

node

1    

192.168.1.5

2    

192.168.1.6

3   

192.168.1.7

 

六、安装zookeeper集群,至少3台

1、下载安装包,建议3.4.9之后的版本

http://archive.apache.org/dist/zookeeper/

2、解压

tar zxf /usr/local/test/clickhouse/zookeeper-3.4.13.tar.gz -C /usr/local
mv /usr/local/zookeeper-3.4.13 /usr/local/zookeeper

3、创建目录:

mkdir /data/zookeeper/data
mkdir /data/zookeeper/logs

4、指定节点号

echo '1' > /data/zookeeper/data/myid

5、zookeeper配置文件

/usr/local/zookeeper/conf/zoo.cfg

tickTime=2000

基本时间单位, 毫秒值

initLimit=30000

tickTime的倍数,follower和leader之间的最长心跳时间

syncLimit=10

tickTime的倍数,leader和follower之间发送消息, 请求和应答的最大时间

dataDir=/export/data/zookeeper/data

数据目录

dataLogDir=/export/data/zookeeper/logs

日志目录,如果没设定,默认和dataDir相同

clientPort=2181

监听client连接的端口号

maxClientCnxns=2000

zookeeper最大连接

maxSessionTimeout=60000000

最大的会话超时时间

autopurge.snapRetainCount=10

保留的文件数目,默认3个

autopurge.purgeInterval=1

自动清理snapshot和事务日志,清理频率,单位是小时

globalOutstandingLimit=200

等待处理的最大请求数量

preAllocSize=131072

日志文件大小Kb,切换快照生成日志

snapCount=3000000

两次事务快照之间可执行事务的次数,默认的配置值为100000

leaderServes=yes

leader是否接受client请求,默认为yes即leader可以接受client的连接,当节点数为>3时,建议关闭

server.1=192.168.1.5:2888:3888

2888 leader\follower传输信息端口,3888推举端口

server.2=192.168.1.6:2888:3888

2888 leader\follower传输信息端口,3888推举端口

server.3=192.168.1.7:2888:3888

2888 leader\follower传输信息端口,3888推举端口

6、启动

/usr/local/zookeeper/bin/zkServer.sh [start\status\stop]

七、安装clickhouse

1、下载并安装上面rpm安装包

2、参考配置上面的配置文件

如果采用上面的配置文件需要创建目录
3、mkdir -p /data/clickhouse/tmp /data/clickhouse/logs /data/clickhouse/lock/

4、修改权限

chown clickhouse.clickhouse -R /data/clickhouse

5、启动(有两种方式)

/etc/init.d/clickhouse-serve start

clickhouse-server --daemon --config-file=/etc/clickhouse-server/config.xml

6、登录验证

clickhouse-client -u default --password password -h127.0.0.1

7、目录结构

Metadata:元数据目录,.sql文件

Data:数据目录

Logs:日志目录,错误日志再次目录下

其他目录暂时无需了解

8、数据文件

在items表的每一个part子目录中,存放如下文件下面这些文件:

columns.txt:记录列信息

count.txt:记录总数

checksums.txt:数据校验

.bin:每列都有,存储实际数据

.mrk文件:bin数据文件中,索引粒度偏移量(index_granularity (usually, N = 8192)

minmax_EventDate.idx:时间字段索引

primary.idx:存储主键信息,存储在内存中

这里展示了mrk文件和primary文件的具体结构,可以看到,数据是按照主键排序的,并且会每隔一定大小分隔出很多个block。每个block中也会抽出一个数据作为索引,放到primary.idx和各列的mrk文件中。

而利用mergetree进行查询时,最关键的步骤就是定位block,这里会根据查询的列是否在主键内有不同的方式。根据主键查询时性能会较好,但是非主键查询时,由于按列存储的关系,虽然会做一次全扫描,性能也没有那么差。所以索引在clickhouse里并不像mysql那么关键。实际使用时一般需要添加按日期的查询条件,保障非主键查询时的性能。

找到对应的block之后,就是在block内查找数据,获取需要的行,再拼装需要的其他列数据。

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐