本站总访问量 clickhouse搭建 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

Clickhouse简介

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它是一个列式存储数据库,即将来自同一列的数据存储在一起。这与传统的行式存储数据库不同,后者将来自同一行的数据存储在一起。列式存储数据库的优点是可以显著提高特定类型的查询性能,例如,只选择特定列的查询,或者只选择特定列的聚合函数。列式存储数据库的缺点是更新数据的速度较慢,因为数据通常以追加的方式添加到列中,而不是覆盖已有的数据。

常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

OLAP场景的关键特征

  • 绝大多数是读请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
  • 已添加到数据库的数据不能修改。
    = 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
    很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。

选择Clickhouse镜像

1
docker pull clickhouse/clickhouse-server:21.8.15.7

Dockerhub 镜像地址

Kubernetes 部署

service和pvc都以部署在Google Cloud的Kubernetes平台为例

  1. 先创建一个pvc,用于存储clickhouse的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: clickhouse-data
namespace: stable-db
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: standard-rwo
volumeMode: Filesystem
  1. 创建一个StatefulSet,用于部署clickhouse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
kind: StatefulSet
apiVersion: apps/v1
metadata:
name: clickhouse
namespace: stable-db
labels:
app: clickhouse
spec:
replicas: 1
selector:
matchLabels:
app: clickhouse
template:
metadata:
labels:
app: clickhouse
spec:
securityContext:
runAsUser: 0
runAsGroup: 0
fsGroup: 0
volumes:
- name: clickhouse-data
persistentVolumeClaim:
claimName: clickhouse-data
- name: kube-api-access-nspxk
projected:
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
name: kube-root-ca.crt
items:
- key: ca.crt
path: ca.crt
- downwardAPI:
items:
- path: namespace
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
defaultMode: 420
containers:
- name: clickhouse
image: clickhouse/clickhouse-server:21.8.15.7
imagePullPolicy: IfNotPresent
env:
- name: CLICKHOUSE_PASSWORD
value: <密码>
- name: CLICKHOUSE_DB
value: default
ports:
- name: tcp-8123
containerPort: 8123
protocol: TCP
- name: tcp-9000
containerPort: 9000
protocol: TCP
- name: tcp-9009
containerPort: 9009
protocol: TCP
- name: tcp-8443
containerPort: 8443
protocol: TCP
- name: tcp-9440
containerPort: 9440
protocol: TCP
resources:
limits:
cpu: "2"
memory: 4Gi
ephemeral-storage: 10Gi
requests:
cpu: "2"
memory: 4Gi
ephemeral-storage: 10Gi
volumeMounts:
- name: clickhouse-data
mountPath: /var/lib/clickhouse/data
- name: kube-api-access-nspxk
readOnly: true
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
  • CLICKHOUSE_PASSWORD: clickhouse的密码
  • CLICKHOUSE_DB: clickhouse的数据库名称
  • 8123: 用于 HTTP 访问的端口,通常用于执行查询
  • 9000: ClickHouse 数据传输端口,用于在 ClickHouse 节点之间传输数据
  • 9009: Replication 端口,用于在 ClickHouse 集群中进行数据复制
  • 8443: 用于 HTTPS 访问的端口,通常用于执行查询
  1. 创建一个service,用于暴露外部访问clickhouse的端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: v1
kind: Service
metadata:
name: clickhouse
namespace: stable-db
annotations:
cloud.google.com/l4-rbs: "enabled"
labels:
app: clickhouse
spec:
type: LoadBalancer
externalTrafficPolicy: Cluster
ports:
- port: <端口>
nodePort: <端口>
targetPort: 8123
protocol: TCP
name: tcp-8123
- port: <端口>
nodePort: <端口>
targetPort: 9000
protocol: TCP
name: tcp-9000
- port: <端口>
nodePort: <端口>
targetPort: 9009
protocol: TCP
name: tcp-9009
- port: <端口>
nodePort: <端口>
targetPort: 8443
protocol: TCP
name: tcp-8443
- port: <端口>
nodePort: <端口>
targetPort: 9440
protocol: TCP
name: tcp-9440
selector:
app: clickhouse

docker-compose 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
clickhouse:
image: clickhouse/clickhouse-server:21.8.15.7
container_name: clickhouse
restart: always
ports:
- "8123:8123"
- "9000:9000"
- "9009:9009"
- "8443:8443"
- "9440:9440"
environment:
- CLICKHOUSE_PASSWORD=<密码>
- CLICKHOUSE_DB=default
volumes:
- /data/clickhouse:/var/lib/clickhouse/data

连接测试

https://jerryblogs.com/images/clickhouse.png

评论