ClickHouse部署
-
- 一、ClickHouse部署
-
- 一、单节点部署
-
- [1. 安装准备](#1. 安装准备)
- [2. 目录规划](#2. 目录规划)
- [3. 核心配置](#3. 核心配置)
- [4. 启动服务](#4. 启动服务)
- 二、集群部署方案
-
- [1. 集群拓扑设计](#1. 集群拓扑设计)
- [2. 分布式配置](#2. 分布式配置)
- [3. 表引擎选择](#3. 表引擎选择)
- 三、安全加固
-
- [1. 认证配置](#1. 认证配置)
- [2. SSL加密](#2. SSL加密)
- 四、性能优化
-
- [1. 核心参数调优](#1. 核心参数调优)
- [2. 资源隔离](#2. 资源隔离)
- 五、监控与维护
-
- [1. Prometheus 集成](#1. Prometheus 集成)
- [2. 关键监控指标](#2. 关键监控指标)
- 六、备份与恢复
-
- [1. 冷备份方案](#1. 冷备份方案)
- [2. 跨集群同步](#2. 跨集群同步)
- 七、最佳实践
- 二、ClickHouse跨机房集群部署方案
-
- [1. 架构设计](#1. 架构设计)
- [2. 网络优化配置](#2. 网络优化配置)
- [3. 数据同步策略](#3. 数据同步策略)
- [4. 容灾切换方案](#4. 容灾切换方案)
- [5. 性能优化参数](#5. 性能优化参数)
- [6. 监控指标体系](#6. 监控指标体系)
- [7. 运维管理规范](#7. 运维管理规范)
- [8. 成本优化建议](#8. 成本优化建议)
- 关联知识
一、ClickHouse部署
以下为 ClickHouse 生产级集群部署的完整步骤及配置指南,涵盖单节点、分布式集群、安全加固及性能优化:
一、单节点部署
1. 安装准备
系统要求:
• 64位 Linux(推荐 CentOS 7+/Ubuntu 18.04+)
• 至少 4 核 CPU + 8GB 内存
• SSD 存储(推荐 NVMe)
- 安装步骤:
bash
# Ubuntu/Debian
sudo apt-get install -y apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client
# CentOS/RHEL
sudo yum install -y yum-utils
sudo rpm --import https://repo.clickhouse.com/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.com/rpm/clickhouse.repo
sudo yum install -y clickhouse-server clickhouse-client
2. 目录规划
bash
sudo mkdir -p /data/clickhouse/{data,metadata,logs,conf}
sudo chown -R clickhouse:clickhouse /data/clickhouse
配置文件迁移:
bash
sudo mv /etc/clickhouse-server/config.xml /data/clickhouse/conf/
sudo ln -s /data/clickhouse/conf/config.xml /etc/clickhouse-server/config.xml
3. 核心配置
config.xml 关键参数:
xml
<yandex>
<path>/data/clickhouse/data/</path>
<tmp_path>/data/clickhouse/tmp/</tmp_path>
<user_files_path>/data/clickhouse/user_files/</user_files_path>
<format_schema_path>/data/clickhouse/format_schemas/</format_schema_path>
<!-- 网络配置 -->
<listen_host>0.0.0.0</listen_host>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<!-- 资源限制 -->
<max_memory_usage>10000000000</max_memory_usage>
<max_concurrent_queries>100</max_concurrent_queries>
<!-- 日志配置 -->
<logger>
<level>information</level>
<log>/data/clickhouse/logs/clickhouse-server.log</log>
<errorlog>/data/clickhouse/logs/clickhouse-server.err.log</errorlog>
<size>1000M</size>
<count>10</count>
</logger>
</yandex>
4. 启动服务
bash
sudo systemctl start clickhouse-server
sudo systemctl enable clickhouse-server
二、集群部署方案
1. 集群拓扑设计
3分片2副本架构:
节点 | IP地址 | 角色 | 硬件配置 |
---|---|---|---|
ch-node1 | 192.168.1.10 | 分片1主 + 分片2副本 | 32C128G NVMe |
ch-node2 | 192.168.1.11 | 分片2主 + 分片3副本 | 32C128G NVMe |
ch-node3 | 192.168.1.12 | 分片3主 + 分片1副本 | 32C128G NVMe |
2. 分布式配置
- remote_servers 配置:
xml
<remote_servers>
<cluster_3s2r>
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>ch-node1</host>
<port>9000</port>
<user>admin</user>
<password>SecurePass123!</password>
</replica>
<replica>
<host>ch-node2</host>
<port>9000</port>
<user>admin</user>
<password>SecurePass123!</password>
</replica>
</shard>
<!-- 其他分片类似配置 -->
</cluster_3s2r>
</remote_servers>
- ZooKeeper 集成:
xml
<zookeeper>
<node>
<host>zk1.cluster</host>
<port>2181</port>
</node>
<node>
<host>zk2.cluster</host>
<port>2181</port>
</node>
<node>
<host>zk3.cluster</host>
<port>2181</port>
</node>
<session_timeout_ms>30000</session_timeout_ms>
<operation_timeout_ms>10000</operation_timeout_ms>
</zookeeper>
3. 表引擎选择
分布式表创建示例:
sql
CREATE TABLE db1.metrics_local ON CLUSTER 'cluster_3s2r'
(
event_time DateTime,
metric_name String,
value Float64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/metrics_local', '{replica}')
PARTITION BY toYYYYMM(event_time)
ORDER BY (metric_name, event_time)
TTL event_time + INTERVAL 30 DAY;
CREATE TABLE db1.metrics_distributed ON CLUSTER 'cluster_3s2r'
AS db1.metrics_local
ENGINE = Distributed('cluster_3s2r', 'db1', 'metrics_local', rand());
三、安全加固
1. 认证配置
users.xml 示例:
xml
<users>
<admin>
<password>sha256:abcd1234...(使用openssl passwd生成)</password>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
</admin>
<readonly>
<password>sha256:def5678...</password>
<networks>
<ip>192.168.1.0/24</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
</readonly>
</users>
2. SSL加密
配置步骤:
bash
# 生成证书
openssl req -x509 -newkey rsa:2048 -nodes -days 365 \
-keyout /etc/clickhouse-server/server.key \
-out /etc/clickhouse-server/server.crt
# 修改配置
<https_port>8443</https_port>
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/server.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/server.key</privateKeyFile>
</server>
</openSSL>
四、性能优化
1. 核心参数调优
xml
<!-- config.xml -->
<merge_tree>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
<parts_to_delay_insert>300</parts_to_delay_insert>
<parts_to_throw_insert>600</parts_to_throw_insert>
</merge_tree>
<compression>
<case>
<method>zstd</method>
<level>3</level>
</case>
</compression>
2. 资源隔离
资源队列配置:
xml
<profiles>
<default>
<max_threads>16</max_threads>
<max_memory_usage_for_all_queries>100000000000</max_memory_usage_for_all_queries>
</default>
<batch>
<max_threads>32</max_threads>
<priority>10</priority>
</batch>
</profiles>
五、监控与维护
1. Prometheus 集成
exporter 配置:
bash
docker run -d -p 9116:9116 \
-e CLICKHOUSE_USER="monitor" \
-e CLICKHOUSE_PASSWORD="MonitorPass123!" \
prom/clickhouse-exporter \
-scrape_uri=http://ch-node1:8123/
2. 关键监控指标
指标名称 | 告警阈值 | 监控频率 |
---|---|---|
QueryDurationMilliseconds | > 5000ms | 15s |
ReplicasMaxQueueSize | > 1000 | 1m |
MemoryUsage | > 90% | 10s |
ZooKeeperRequestLatency | > 2000ms | 30s |
六、备份与恢复
1. 冷备份方案
bash
# 全量备份
clickhouse-backup create full_backup_$(date +%Y%m%d)
# 增量备份
clickhouse-backup create incremental_backup_$(date +%Y%m%d) --diff-from=full_backup_20230801
# 恢复数据
clickhouse-backup restore full_backup_20230801
2. 跨集群同步
sql
CREATE TABLE db1.metrics_restore AS db1.metrics_local
ENGINE = Distributed('backup_cluster', 'db1', 'metrics_local', rand());
INSERT INTO db1.metrics_restore
SELECT * FROM remote('backup_node', db1.metrics_local);
七、最佳实践
- 分片键选择:优先选择高基数字段(如用户ID)
- 数据预热:启动后执行
SYSTEM DROP MARK CACHE
- 版本管理:使用
ALTER TABLE ... UPDATE
谨慎处理表结构变更 - 慢查询分析:开启
log_queries=1
并定期分析 query_log
通过以上步骤,可建立支持每秒百万级写入、亚秒级查询响应的 ClickHouse 生产集群,适用于实时分析、时序数据处理等场景。建议每月进行全链路压测,持续优化配置参数。
二、ClickHouse跨机房集群部署方案
1. 架构设计
目标:实现高可用、低延迟、数据地理冗余
拓扑结构:
• 3个机房(北京、上海、广州),每个机房部署完整ClickHouse分片
• 分片策略:每个分片包含3副本(跨机房部署)
• ZooKeeper集群:每个机房独立部署3节点ZooKeeper,组成跨机房集群
广州机房 上海机房 北京机房 分片1-副本 分片2-副本 分片3-主 ZooKeeper ZooKeeper ZooKeeper 分片1-副本 分片2-主 分片3-副本 ZooKeeper ZooKeeper ZooKeeper 分片1-主 分片2-副本 分片3-副本 ZooKeeper ZooKeeper ZooKeeper
2. 网络优化配置
关键参数:
xml
<!-- config.xml -->
<yandex>
<interserver_http_port>9009</interserver_http_port>
<interserver_http_host>bj01-node1</interserver_http_host>
<listen_host>0.0.0.0</listen_host>
<!-- 跨机房专线配置 -->
<remote_servers>
<cluster1>
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>bj01-node1</host>
<port>9000</port>
<interserver_http_port>9009</interserver_http_port>
<zone>bj</zone>
</replica>
<replica>
<host>sh01-node1</host>
<port>9000</port>
<interserver_http_port>9009</interserver_http_port>
<zone>sh</zone>
</replica>
</shard>
<!-- 其他分片配置 -->
</cluster1>
</remote_servers>
<!-- 网络QoS策略 -->
<network>
<compression>true</compression>
<send_timeout>300</send_timeout>
<receive_timeout>300</receive_timeout>
<keep_alive_timeout>600</keep_alive_timeout>
</network>
</yandex>
3. 数据同步策略
三级数据同步机制:
层级 | 同步方式 | 延迟要求 | 数据一致性 |
---|---|---|---|
1级 | 本地机房同步 | <10ms | 强一致 |
2级 | 跨机房异步复制 | <500ms | 最终一致 |
3级 | 全局备份同步 | 每天1次 | 延迟一致 |
副本配置示例:
sql
CREATE TABLE metrics
(
event_date Date,
metric_id UInt32,
value Float64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/metrics', '{replica}')
PARTITION BY toYYYYMM(event_date)
ORDER BY (metric_id, event_date)
SETTINGS
max_replicated_mutations_in_queue=1000,
replicated_can_become_leader=1,
replicated_max_parallel_fetches=16;
4. 容灾切换方案
故障检测矩阵:
故障类型 | 检测方式 | 切换阈值 | 恢复策略 |
---|---|---|---|
节点宕机 | ZooKeeper watcher | 30秒 | 自动切换副本 |
机房断网 | BGP监测 | 3次/5分钟 | DNS切流 |
数据损坏 | Checksum校验 | 立即 | 副本重建 |
磁盘故障 | SMART监控 | 立即 | 热备盘替换 |
切换命令示例:
bash
# 强制副本切换
echo "SYSTEM RESTART REPLICA metrics" | clickhouse-client -h standby-node
# 机房级切换(VIP转移)
keepalivedctl switchover --new-master sh02-node1
5. 性能优化参数
核心配置调整:
xml
<!-- users.xml -->
<yandex>
<profiles>
<default>
<max_memory_usage>10000000000</max_memory_usage>
<max_execution_time>300</max_execution_time>
<distributed_product_mode>local</distributed_product_mode>
<!-- 跨机房查询优化 -->
<prefer_localhost_replica>0</prefer_localhost_replica>
<use_hedged_requests>1</use_hedged_requests>
<async_socket_for_remote>1</async_socket_for_remote>
<!-- 副本选择策略 -->
<load_balancing>first_or_random</load_balancing>
<priority>
<bj>3</bj>
<sh>2</sh>
<gz>1</gz>
</priority>
</default>
</profiles>
</yandex>
6. 监控指标体系
关键监控项:
类别 | 指标 | 阈值 | 采集频率 |
---|---|---|---|
网络 | 跨机房延迟 | <150ms | 10秒 |
存储 | 副本差异量 | <10万行 | 1分钟 |
查询 | 跨区查询比例 | <30% | 实时 |
资源 | CPU利用率 | <70% | 5秒 |
ZooKeeper | 事务延迟 | <500ms | 1秒 |
Prometheus配置示例:
yaml
scrape_configs:
- job_name: 'clickhouse'
static_configs:
- targets:
- bj01-node1:9363
- sh01-node1:9363
- gz01-node1:9363
metrics_path: '/metrics'
- job_name: 'zk'
static_configs:
- targets:
- zk-bj1:7000
- zk-sh1:7000
- zk-gz1:7000
7. 运维管理规范
变更管理流程:
-
灰度发布:新配置先在1个机房生效,观察24小时
-
滚动升级:分3个批次进行,间隔2小时
-
数据迁移:使用
ALTER TABLE MOVE PARTITION
命令 -
备份策略:
• 每日增量备份(保留7天)
• 每周全量备份(保留4周)
• 异地冷备(保留1年)
自动化脚本示例:
bash
#!/bin/bash
# 跨机房数据均衡脚本
for shard in {1..3}
do
clickhouse-client --query "
SYSTEM SYNC REPLICA metrics_shard${shard}
OPTIMIZE TABLE metrics_shard${shard} FINAL
ALTER TABLE metrics_shard${shard}
MOVE PARTITION '202308' TO SHARD '/bj0${shard}'
"
done
8. 成本优化建议
资源分配策略:
机房 | 数据热度 | 存储类型 | 计算规格 |
---|---|---|---|
北京 | 热数据 | SSD | 32C128G |
上海 | 温数据 | ESSD | 16C64G |
广州 | 冷数据 | HDD | 8C32G |
存储分层配置:
sql
ALTER TABLE metrics MODIFY TTL
event_date + INTERVAL 3 MONTH TO VOLUME 'hot',
event_date + INTERVAL 6 MONTH TO VOLUME 'warm',
event_date + INTERVAL 12 MONTH TO VOLUME 'cold'
该方案通过多层次冗余、智能路由和分级存储,实现RTO<5分钟、RPO<10秒的容灾能力,同时跨机房查询延迟控制在150ms以内。建议根据实际业务流量进行压力测试,优化分片数量和副本分布策略。
关联知识
【大数据知识】ClickHouse入门
【运维工具】Ansible一款好用的自动化工具
【数据库知识】行式存储与列式存储
【ClickHouse官网文档地址】