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去处理分析请求。
Kubernetes 部署
service和pvc都以部署在Google Cloud的Kubernetes平台为例
- 先创建一个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
|
- 创建一个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 访问的端口,通常用于执行查询
- 创建一个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
|